进程调度算法模拟 实验报告.docx
- 文档编号:24376913
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:15
- 大小:134.31KB
进程调度算法模拟 实验报告.docx
《进程调度算法模拟 实验报告.docx》由会员分享,可在线阅读,更多相关《进程调度算法模拟 实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
进程调度算法模拟实验报告
实验报告
课程名称计算机操作系统
实验名称进程调度算法模拟
专业班级
学生姓名
指导教师
实验一进程调度算法模拟,
1.内容:
设计一个简单的进程调度算法,模拟OS中的进程调度过程;
2.要求:
①进程数不少于5个;
②进程调度算法任选;
可以用动态优先数加时间片轮转法实现进程调度,每运行一个时间片优先数减3;
③用C语言编程;
④程序运行时显示进程调度过程。
3.步骤:
①设计PCB及其数据结构:
进程标识数:
ID
进程优先数:
PRIORITY(优先数越大,优先级越高)
进程已占用时间片:
CPUTIME,每得到一次调度,值加1;
进程还需占用时间片:
ALLTIME,每得到一次调度,该值减1,一旦运行完毕,ALLTIME为0)
进程队列指针:
NEXT,用来将PCB排成队列
进程状态:
STATE(一般为就绪,可以不用)
②设计进程就绪队列及数据结构;
③设计进程调度算法,并画出程序流程图;
④设计输入数据和输出格式;
结构格式:
当前正运行的进程:
0
当前就绪队列:
2,1,3,4
⑤编程上机,验证结果。
4.提示:
假设调度前,系统中有5个进程,其初始状态如下:
ID
0
1
2
3
4
PRIORITY
9
38
30
29
0
可否考虑用数组或链表去实现
CPUTIME
0
0
0
0
0
ALLTIME
3
2
6
3
4
STATE
ready
ready
ready
ready
ready
①以时间片为单位调度运行;
②每次调度ALLTIME不为0,且PRIORITY最大的进程运行一个时间片;
③上述进程运行后其优先数减3,再修改其CPUTIME和ALLTIME,重复②,③
④直到所有进程的ALLTIME均变为0。
5.书写实验报告
①实验题目;
②程序中所用数据结构及说明;
③清单程序及描述;
④执行结果。
实验源代码:
#include
#include
typedefintStatus;
#defineERROR0
#defineOK1
typedefstructPCB{
charNAME[10];//进程名字
intPRIO;//进程优先数
intROUNT;//轮转时间片
intCOUNT;//计数器
intNEEDTIME;//需要的CPU时间
intCPUTIME;//占用cpu时间
char*STATE;//进程状态
}ElemPCB;
typedefstructQNode{
ElemPCBpcb;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{//就绪队列
QueuePtrRUN;//当前运行进程指针
QueuePtrREADY;//头指针
QueuePtrTAIL;//尾指针
}READYQueue;
typedefstruct{//完成队列
QueuePtrFINISH;//头指针
QueuePtrTAIL;//尾指针
}FINISHQueue;
StatusCreate(READYQueue&ready);
StatusPrint(READYQueueready,FINISHQueuefinish);
StatusPrintr(READYQueueready,FINISHQueuefinish);
StatusFisrt(READYQueue&ready);
StatusInsert1(READYQueue&ready);
StatusInsert2(READYQueue&ready);
StatusPrisch(READYQueue&ready,FINISHQueue&finish);
StatusRoundsch(READYQueue&ready,FINISHQueue&finish);
voidmain(){
charch;
READYQueueready;
FINISHQueuefinish;
ready.READY=ready.TAIL=(QueuePtr)malloc(sizeof(QNode));//存储分配
ready.RUN=(QueuePtr)malloc(sizeof(QNode));
ready.RUN->next=NULL;
finish.FINISH=finish.TAIL=(QueuePtr)malloc(sizeof(QNode));
Create(ready);
//创建后就绪对列中
printf("\n就绪对列中初始值:
\n");
Print(ready,finish);
Fisrt(ready);
printf("请输入要选择调度的算法(p--优先数调度,r--时间片轮转法):
\n");
while
(1){
do{
ch=getchar();
scanf("%c",&ch);
}while(ch!
='p'&&ch!
='r');
switch(ch){
case'p':
//优先数调度
Prisch(ready,finish);
break;
case'r':
//时间片轮转法
Roundsch(ready,finish);
break;
}
}
}
StatusPrint(READYQueueready,FINISHQueuefinish){//打印就绪队列中的进程状态
QueuePtrp,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!
=NULL)
{
printf("%s",ready.RUN->next->pcb.NAME);
printf(":
%s\t",ready.RUN->next->pcb.STATE);
printf("优先数:
%d\n",ready.RUN->next->pcb.PRIO);
}
//就绪队列的进程
while(p!
=ready.TAIL){
printf("%s",p->next->pcb.NAME);
printf(":
%s\t",p->next->pcb.STATE);
printf("优先数:
%d\n",p->next->pcb.PRIO);
p=p->next;
}
//完成队列的进程
while(q!
=finish.TAIL){
printf("%s",q->next->pcb.NAME);
printf(":
%s\t",q->next->pcb.STATE);
printf("优先数:
%d\n",q->next->pcb.PRIO);
q=q->next;
}
returnOK;
}
StatusPrintr(READYQueueready,FINISHQueuefinish){//打印就绪队列中的进程状态
QueuePtrp,q;
p=ready.READY;
q=finish.FINISH;
//运行中的进程
if(ready.RUN->next!
=NULL)
{
printf("%s",ready.RUN->next->pcb.NAME);
printf(":
%s\t",ready.RUN->next->pcb.STATE);
printf("剩余时间:
%d\n",ready.RUN->next->pcb.NEEDTIME);
}
//就绪队列的进程
while(p!
=ready.TAIL){
printf("%s",p->next->pcb.NAME);
printf(":
%s\t",p->next->pcb.STATE);
printf("剩余时间:
%d\n",p->next->pcb.NEEDTIME);
p=p->next;
}
//完成队列的进程
while(q!
=finish.TAIL){
printf("%s",q->next->pcb.NAME);
printf(":
%s\t",q->next->pcb.STATE);
printf("剩余时间:
%d\n",q->next->pcb.NEEDTIME);
q=q->next;
}
returnOK;
}
StatusCreate(READYQueue&ready){
QueuePtrp;
inti=0;
intn;
printf("请输入进程个数:
");
scanf("%d",&n);
while(i { p=(QueuePtr)malloc(sizeof(QNode)); printf("输入第%d进程名: ",i+1); scanf("%s",p->pcb.NAME); printf("输入进程需要的时间: "); scanf("%d",&p->pcb.NEEDTIME); printf("输入进程的进程优先数: "); scanf("%d",&p->pcb.PRIO); p->pcb.STATE="W"; p->pcb.ROUNT=2; p->pcb.COUNT=0; i++; p->next=NULL; ready.TAIL->next=p; ready.TAIL=p; } returnOK; } StatusFisrt(READYQueue&ready){ if(ready.READY==ready.TAIL) returnERROR; ready.RUN->next=ready.READY->next; ready.RUN->next->pcb.STATE="RUN";//修改进程状态 if(ready.TAIL==ready.READY->next) ready.READY=ready.TAIL; else ready.READY->next=ready.READY->next->next;//头指针后移 printf("\n%s被从就绪队列调度运行\n",ready.RUN->next->pcb.NAME); returnOK; } StatusInsert1(READYQueue&ready){ inti=0,j=0; QueuePtrp=ready.READY,q; ElemPCBtemp; QueuePtrs=(QueuePtr)malloc(sizeof(QNode)); s->pcb=ready.RUN->next->pcb; s->next=NULL;//将未完成的进程插入就绪队列 ready.TAIL->next=s; ready.TAIL=s; //按优先数从大到小排序 for(p;p! =ready.TAIL;p=p->next) { for(q=p->next;q! =ready.TAIL;q=q->next) { if(p->next->pcb.PRIO { temp=p->next->pcb; p->next->pcb=q->next->pcb; q->next->pcb=temp; } } } returnOK; } StatusInsert2(READYQueue&ready){ QueuePtrp=ready.RUN->next; if(p->pcb.NEEDTIME>0) { ready.TAIL->next=p;//插入到就绪队列 ready.TAIL=p; ready.RUN->next=NULL; } returnOK; } StatusPrisch(READYQueue&ready,FINISHQueue&finish){ inti=0; while(ready.RUN->next! =NULL) { ready.RUN->next->pcb.CPUTIME++; ready.RUN->next->pcb.NEEDTIME--; ready.RUN->next->pcb.PRIO-=3; if(ready.RUN->next->pcb.NEEDTIME==0) { finish.TAIL->next=ready.RUN->next;//插入到完成队列 finish.TAIL=ready.RUN->next;//尾指针后移 ready.RUN->next->pcb.STATE="FINISH"; ready.RUN->next=NULL; if(ready.READY! =ready.TAIL) { Fisrt(ready); } } elseif(ready.READY! =ready.TAIL&&(ready.RUN->next->pcb.PRIO)<(ready.READY->next->pcb.PRIO)) { ready.RUN->next->pcb.STATE="W"; printf("%s被调到就绪队列里\n",ready.RUN->next->pcb.NAME); Insert1(ready); Fisrt(ready); } i++; printf("\n进程执行第%d个时间片的结果: \n",i); Print(ready,finish); } returnOK; } StatusRoundsch(READYQueue&ready,FINISHQueue&finish){ inti=0; while(ready.RUN->next! =NULL) { ready.RUN->next->pcb.CPUTIME++; ready.RUN->next->pcb.NEEDTIME--; ready.RUN->next->pcb.COUNT++; if(ready.RUN->next->pcb.NEEDTIME==0) { finish.TAIL->next=ready.RUN->next;//插入到完成队列 finish.TAIL=ready.RUN->next;//尾指针后移 ready.RUN->next->pcb.STATE="FINISH"; ready.RUN->next=NULL; if(ready.READY! =ready.TAIL) { Fisrt(ready); } } elseif(ready.RUN->next->pcb.COUNT==ready.RUN->next->pcb.ROUNT) { ready.RUN->next->pcb.COUNT=0; if(ready.READY! =ready.TAIL) { ready.RUN->next->pcb.STATE="W"; printf("%s被调到就绪队列里\n",ready.RUN->next->pcb.NAME); Insert2(ready); Fisrt(ready); } } i++; printf("\n进程执行第%d个时间片的结果: \n",i); Printr(ready,finish); } returnOK; } 运行结果截图:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 进程调度算法模拟 实验报告 进程 调度 算法 模拟 实验 报告