操作系统进程管理实验Word格式.docx

上传人:b****6 文档编号:18825137 上传时间:2023-01-01 格式:DOCX 页数:17 大小:512.55KB
下载 相关 举报
操作系统进程管理实验Word格式.docx_第1页
第1页 / 共17页
操作系统进程管理实验Word格式.docx_第2页
第2页 / 共17页
操作系统进程管理实验Word格式.docx_第3页
第3页 / 共17页
操作系统进程管理实验Word格式.docx_第4页
第4页 / 共17页
操作系统进程管理实验Word格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

操作系统进程管理实验Word格式.docx

《操作系统进程管理实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统进程管理实验Word格式.docx(17页珍藏版)》请在冰豆网上搜索。

操作系统进程管理实验Word格式.docx

QueuePtr*rear;

intPartTime;

}LinkQueue;

链队列中定:

优先级、结构体里的QueuePtr类型指针变量,指向该优先级的进程的头结点和尾结点,还运行的时间片。

LinkQueueReadyqueue[10]链队列的单链表。

voidschedule()声明调度函数,用来调度进程的运行;

voidshow()声明输出函数,用来输出的一个函数;

voidCreate()声明创建进程的函数,用来创建进程。

yunxingshijian=1+(int)(rand()%30);

此语句是随机生成一个整数赋给运行时间RUNTIME;

youxianji=1+(int)(rand()%9);

该语句随机生成一个整数(1~9)赋给优先级;

strcpy(p->

pcb.NAME,name)将名字赋给PCB块;

strcpy(p->

pcb.STATE,"

Ready"

)将进程状态赋给PCB块;

p->

pcb.PRIORITY=youxianji将优先级赋给PCB块;

pcb.RUNTIME=yunxingshijian;

将运行时间赋给PCB块;

pcb.ID=id将id号赋给PCB块。

{Readyqueue[i].front->

next=p->

next;

Readyqueue[i+1].rear->

next=p;

Readyqueue[i+1].rear=p;

next=NULL;

}p移到下一队列的队尾,使Readyqueue[i+1].rear指向最后一个结点。

Readyqueue[9].rear->

Readyqueue[9].rear=p;

}//p->

next前移,把p移到运行结束的队列Readyqueue[9].rear。

多级反馈队列调度算法的描述

一个进程被调度,则其运行时间有p->

pcb.RUNTIME=p->

pcb.RUNTIME-(int)pow(2,i+1),此后如果该进程的p->

pcb.RUNTIME<

0或p->

pcb.RUNTIME=0,此进程就结束且加入到Readyqueue[9].rear->

next=p且p->

next=NULL。

没有结束就移加到下一队列的尾部且优先级减“1”(Readyqueue[i].front->

Readyqueue[i+1].rear->

Readyqueue[i+1].rear=p;

p->

)。

然后往下执行。

如此循环.ivReadyqueue[i].front->

next!

=NULL发生时,就往下一优先级运行。

直到所有进程结束。

程序功能结构图、流程图

<

1>

创建进程函数Create()(左图)<

2>

调度函数schedule()(右图)

三、所用仪器、材料(设备名称、型号、规格等)。

所用仪器:

计算中心201;

操作系统:

MicrosoftVisualC++;

软件平台:

MicrosoftVisualC++

四、实验方法、步骤

#include<

stdio.h>

malloc.h>

time.h>

math.h>

windows.h>

typedefstructPCB//定义结构体PCB进程控制块

{

charNAME[20];

//结构体变量,进程名

longID;

//进程id

intRUNTIME;

//进程运行时间

charSTATE[6];

//进程状态readywaitrun

intPRIORITY;

//权值

}PCB;

typedefstructQNode//单链表

{PCBpcb;

}QueuePtr;

typedefstructLinkQueue//链队列

{intprior;

//优先级

//结构体里的QueuePtr类型指针变量,指向该优先级的进程的头结点

//结构体里的QueuePtr类型指针变量,指向该优先级的进程的尾结点

//时间片

}LinkQueue;

LinkQueueReadyqueue[10];

//链队列的单链表

intN;

//N为当前进程数

voidschedule();

//声明调度函数

voidshow();

//声明输出函数

voidInitQueue()//队列的初始化、给每个队列加个头结点

{

for(inti=0;

i<

10;

i++)

{

Readyqueue[i].PartTime=(int)pow(2,i+1);

//每个进程的时间片

Readyqueue[i].prior=9-i;

//每进程的优先级

Readyqueue[i].front=(QueuePtr*)malloc(sizeof(QueuePtr));

//为进程申请空间

Readyqueue[i].rear=Readyqueue[i].front;

//初始化单链的头结点和尾结点指向同一位置

Readyqueue[i].front->

//初始化时Readyqueue[i].front->

next为空

}

//***************************创建进程**************************************************

voidCreate()

InitQueue();

charname[20];

longid=201031101;

//定义ID和初始化为201031101

intm;

QueuePtr*p;

intyunxingshijian,youxianji;

//运行时间、优先级

printf("

\n\t\t请输入要创建进程的数目:

"

);

fflush(stdin);

scanf("

%d"

&

m);

for(intj=1;

j<

=m;

j++)//创建用户所需进程m个

printf("

\t\t输入进程名:

//用户输入用户名

scanf("

%s"

name);

srand((int)time(0));

yunxingshijian=1+(int)(rand()%30);

//随机生成一个整数赋给运行时间

\t\t运行时间:

yunxingshijian);

srand((int)time(0));

youxianji=1+(int)(rand()%9);

//随机生成一个整数(1~9)赋给优先级

\t优先级:

youxianji);

p=(QueuePtr*)malloc(sizeof(QueuePtr));

//插入就绪队列

QueuePtr*k;

for(inti=0;

9;

i++)//通过优先级寻找该进程应放置的队列

{

if(youxianji==9-i)

{

k=Readyqueue[i].front;

//k为移动指针,寻找队列末尾进程

strcpy(p->

pcb.NAME,name);

//将名字赋给PCB块

//将进程状态赋给PCB块

p->

pcb.PRIORITY=youxianji;

//将优先级赋给PCB块

//将运行时间赋给PCB块

pcb.ID=id;

//将id号赋给PCB块

if(k->

=NULL)

{

k=k->

//k指针在寻找队列末尾进程

}

k->

//将p接到队尾

//将队尾的next置为空

Readyqueue[i].rear=p;

}

}

N++;

//保存当前就绪进程数

id++;

//ID自动加"

1"

\n\t第%d个进程创建成功!

\n\n"

N);

}

show();

//调用输出函数show()

}

//******************************调度函数*******************************************

voidschedule()

{

while(Readyqueue[i].front->

p=Readyqueue[i].front->

//p指向Readyqueue[i].front->

next的结点

Sleep((int)pow(2,i+1));

//调用函数Sleep()使进程i休眠

p->

pcb.RUNTIME-(int)pow(2,i+1);

//进程的时间减pow(2,i+1)

strcpy(p->

run"

//调用strcpy()把状态run复给p->

pcb.STATE

pcb.PRIORITY--;

//权值减减

show();

if(p->

0||p->

pcb.RUNTIME==0)//判断p->

pcb.RUNTIME是否<

0或=0

Readyqueue[i].front->

//p前移

Readyqueue[9].rear->

//把p移到运行结束的队列Readyqueue[9].rear

Readyqueue[9].rear=p;

//使Readyqueue[9].rear指向最后一个结点

finish"

//调用strcpy()把状态finish复给p->

show();

//调用输出函数show()

else

Readyqueue[i].front->

Readyqueue[i+1].rear->

//p移到下一队列的队尾

Readyqueue[i+1].rear=p;

//使Readyqueue[i+1].rear指向最后一个结点

p->

strcpy(p->

ready"

//调用strcpy()把状态ready复给p->

//*******************************输出函数********************************************

voidshow()//队列输出函数

QueuePtr*q=NULL;

\t名字ID运行时间优先级状态\n"

for(intj=0;

j++)

q=Readyqueue[j].front->

while(q!

{

\t%s,\t%ld,\t%d,\t%d,\t%s\n"

q->

pcb.NAME,q->

pcb.ID,q->

pcb.RUNTIME,q->

pcb.PRIORITY,q->

pcb.STATE);

q=q->

next;

}

//***************************主函数*********************************************

voidmain()

Create();

charchoice;

请选择是否要对以上进程进行调度?

(y(Y)或n(N))"

choice);

//输入choice

while

(1)

if(choice=='

Y'

||choice=='

y'

)//判断choice的值

schedule();

//如果choice的值是Y或y调度schedule()函数

\t\t\t所有进程(%d个)运行结束!

\n"

break;

//调度结束、退出程序

N'

n'

)//如果choice的值是N或n

exit(0);

//退出程序

if(choice!

='

&

choice!

)//如果choice的值不是Y或或N或n

printf("

\t\t\t您的选择有误,请重新输入!

//输出出错、重新输入

scanf("

请加上程序的源代码,需要有详细的注释。

五、实验过程原始记录(数据、图表、计算等)

创建6个进程

进行调度(输入Y或y)

要不调度(输入N或n)

如果输入不是Y或y或N或n,则有如下

的情况下,想调度输入Y或y,退出输入N或n即可

程序的测试数据、运行截图

六、实验结果、分析和结论(误差分析与数据处理、成果总结等。

其中,绘制曲线图时必须用计算纸)

对整个上机过程、上机结果进行总结、分析。

包括收获、存在问题、改进等方面。

在这次上机中,我发现了自己有很多不足。

所以花了很长的时间才做出来,而且还在

老师多次的讲解之后,才悟出来的。

真是有点惭愧了。

在编程的过程中,就没有明白数组队列、链队列、PCB块及结构体的真正意思。

所以

老师说了是半懂不懂的,虽说从图书馆借来一本类似的书看,可到用时还是不完全明白。

在这几天,我努力了,我敢说。

就连睡觉了我都会在想为什么不可以这样、那样,看了好多学过的和没学过的书、知识点。

用多级反馈队列来实现,虽说没有很多美化的功能,我

相信,只要好好学,下一次我会做得好。

此外,存在的问题还是不少的,比如好多学过的知识都不记得了,也许是好长时间没复习了,也可能是太久没编程序了。

不过这也是我自己的问题所在。

真心的说,遇到杨老师这样的好老师,我很欣慰。

有耐心、讲得仔细、重

复的讲重点、举例说明难点、讲课精神足等等,真是当今大学难有的好老师。

在这次有深度的上机,觉得这样的程序还可以改进,比如:

程序运行背景、算法的简

洁等等。

我突然觉醒:

我该努力了

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 电大

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1