操作系统进程管理实验Word格式.docx
- 文档编号:18825137
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:17
- 大小:512.55KB
操作系统进程管理实验Word格式.docx
《操作系统进程管理实验Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统进程管理实验Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
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块及结构体的真正意思。
所以
老师说了是半懂不懂的,虽说从图书馆借来一本类似的书看,可到用时还是不完全明白。
在这几天,我努力了,我敢说。
就连睡觉了我都会在想为什么不可以这样、那样,看了好多学过的和没学过的书、知识点。
用多级反馈队列来实现,虽说没有很多美化的功能,我
相信,只要好好学,下一次我会做得好。
此外,存在的问题还是不少的,比如好多学过的知识都不记得了,也许是好长时间没复习了,也可能是太久没编程序了。
不过这也是我自己的问题所在。
真心的说,遇到杨老师这样的好老师,我很欣慰。
有耐心、讲得仔细、重
复的讲重点、举例说明难点、讲课精神足等等,真是当今大学难有的好老师。
在这次有深度的上机,觉得这样的程序还可以改进,比如:
程序运行背景、算法的简
洁等等。
我突然觉醒:
我该努力了
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 进程 管理 实验