操作系统实验动态优先级进程调度实验报告.docx
- 文档编号:6595212
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:13
- 大小:990.21KB
操作系统实验动态优先级进程调度实验报告.docx
《操作系统实验动态优先级进程调度实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验动态优先级进程调度实验报告.docx(13页珍藏版)》请在冰豆网上搜索。
操作系统实验动态优先级进程调度实验报告
操作系统实验——动态优先级进程调度实验报告(总19页)
1.实验名称:
动态优先权调度过程中就绪队列的模拟
2.实验要求:
采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。
3.实验内容:
(1)每个进程控制块PCB用结构描述,包括以下字段:
*进程标识符id
*进程优先数priority,并规定优先数越大的进程,其优先权越高。
*进程已占用的CPU时间cputime
*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0
*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态
*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime个时间片后,将转换成就绪状态
*进程状态state
*队列指针next,将PCB排成队列。
(2)调度前,系统中有五个进程,它们的初始状态如下:
ID
0
1
2
3
4
PRIORITY
9
38
30
29
0
CPUTIME
0
0
0
0
0
ALLTIME
3
3
6
3
4
STARTBLOCK
2
-1
-1
-1
-1
BLOCKTIME
3
0
0
0
0
STATE
READY
READY
READY
READY
READY
(3)进程在就绪队列呆一个时间片,优先数增加1。
(4)进程每运行一个时间片,优先数减3。
(5)按下面格式显示每个时间片内就绪队列的情况:
READY_QUEUE:
->id1->id2
4.任务分析
进程控制块用结构体来表示,包含它的各项属性。
建立两个队列:
一个就绪队列,一个阻塞队列。
创建一个进程控制块表示当前正在运行的进程。
程序开始运行时,所有进程都在就绪队列中。
当startblock减少到0时,进程进入阻塞队列。
在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。
在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。
当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。
5.程序流程图
6.程序清单
#include
#include
usingnamespacestd;
#defineLEN5d=i;
ps[i].state=READY;
ps[i].cputime=0;
ps[i].alltime=3;
ps[i].blocktime=0;
ps[i].startblock=-1;
}
ps[0].priority=9;
ps[1].priority=38;
ps[2].priority=30;
ps[3].priority=29;
ps[4].priority=0;
ps[2].alltime=6;
ps[4].alltime=4;
ps[0].startblock=2;
ps[0].blocktime=3;
cp=NULL;d<<"\t";
}
cout<<"\nPRIORITY\t";
for(inti=0;i cout< } cout<<"\nCPUTIME\t\t"; for(inti=0;i cout< } cout<<"\nALLTIME\t\t"; for(inti=0;i cout< } cout<<"\nSTARTBLOCK\t"; for(inti=0;i cout< } cout<<"\nBLOCKTIME\t"; for(inti=0;i cout< } cout<<"\nSTATE\t\t"; for(inti=0;i if(ps[i].state==READY){ cout<<"READY"<<"\t"; } elseif(ps[i].state==BLOCK){ cout<<"BLOCK"<<"\t"; } elseif(ps[i].state==END){ cout<<"END"<<"\t"; } } cout< } //出队,返回进程指针 PCB*pop(Queue*q){ PCB*temp; if(q->size>0){ temp=q->data[0];//取出队首进程 for(inti=0;i q->data[i]=q->data[i+1];//其他进程依次向前移动 } q->size--; returntemp;//返回队首进程 } returnNULL; } //入队 voidpush(Queue*q,PCB*p){ if(q->size q->data[q->size]=p;//将入队的进程放在队尾 q->size++; } return; } //运行进程 voidrun(){ if>0||>0){ if(cp==NULL){//程序一开始运行时,从就绪队列取出首进程 cp=pop(&rQueue); } //当前进程没有结束,但优先级比就绪队列首进程低 if(cp->alltime>0&&cp->priority<[0]->priority){ push(&rQueue,cp);//将当前进程放入就绪队列 cp=pop(&rQueue);//就绪队列队首进程成为当前进程 } if(cp->alltime==0){//如果当前进程运行结束 cp->state=END;//改变进程状态 cp=pop(&rQueue);//从就绪队列取出新的当前进程 } cp->priority-=3;//修改当前进程的优先级 //startblock为0,标志着当前进程要进入阻塞状态 if(cp->startblock==0&&cp->blocktime>0){ cp->state=BLOCK;//修改当前进程的状态 push(&bQueue,cp);//将当前进程加入阻塞队列 cp=pop(&rQueue);//从就绪队列取出新的当前进程 } elseif(cp->startblock>0){//当前进程的startblock为正数时 cp->startblock--;//运行一次减一个时间片 } cp->cputime++;//当前进程占用CPU时间片+1 if(cp->alltime>0){//当前进程还需运行的时间片-1 cp->alltime--; if(cp->alltime==0){//减到0时,修改进程状态 cp->state=END; } } for(inti=0;i<;i++){//每运行一个时间片 [i]->priority++;//就绪队列中的进程优先级+1 } for(inti=0;i<;i++){//每运行一个时间片 if[i]->blocktime>0){//阻塞队列中的进程blocktime-1 [i]->blocktime--; } } //当阻塞队列队首进程blocktime为0时 if>0&&[0]->blocktime==0){ [0]->state=READY;//修改进程状态 push(&rQueue,pop(&bQueue));//将阻塞队列首进程取出,放入就绪队列 } //每运行一个时间片,就绪队列排一次序 rQueueSort(); } } //主函数 intmain(){ init();//初始化 print();//打印进程信息 while (1){ _sleep(1000); if==0&&==0){//当两个队列都为空时,结束程序 cp->state=END; break; } run();//运行进程 print();//打印进程信息 } return0; } 7.实验过程记录 程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、alltime--。 在就绪队列中的进程优先级全部加1。 执行几次之后,1号进程执行完毕而且优先级也不是最高的了,所以优先级为33的2号进程成为当前进程,开始执行。 2号进程执行一次后,优先级由33降低到30,于是3号进程成为当前进程,2号进程进入就绪队列等待。 同理,执行一次后,3号进程的优先级由33降低到30,2号进程再次成为当前进程,3号进程进入就绪队列等待。 这个过程会重复几次,就不重复了。 3号进程执行完毕后退出,2号进程成为当前进程。 2号进程执行完毕后,0号进程成为当前进程。 0号进程执行2次后,startblock为0了,进入阻塞队列,停止运行,4号进程开始执行。 4号进程运行几次后,0号进程的blocktime为0了,0号进程从阻塞队列转入就绪队列 此时,4号进程的优先级低于0号进程,4号进程停止运行,0号进程再次运行。 0号进程执行完毕后,只剩下4号进程了,4号进程执行一次也完成了。 程序总体执行完毕。 8.实验结果分析 实验中,没有运行完毕的进程的优先级都会实时变化。 每次时间片结束,就会选择就绪队列中优先级最高的进程和当前进程进行比较。 如果当前进程没有运行完毕,就被优先级更高的进程替换了,则进入就绪队列等待。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 动态 优先级 进程 调度 报告