操作系统进程调度算法的模拟Word格式文档下载.doc
《操作系统进程调度算法的模拟Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《操作系统进程调度算法的模拟Word格式文档下载.doc(11页珍藏版)》请在冰豆网上搜索。
B
2
6
C
4
D
5
E
8
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段(用不到的字段可以不定义)。
²
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。
四、实验结果及分析
(1)实验关键代码
①模拟PCB数据结构定义:
///枚举进程的状态:
新建、就绪、执行、阻塞、终止
enumSTATE_PROCESS{New,Ready,Run,Block,Finish};
typedefenumSTATE_PROCESSSTATE;
///建立PCB结构体
structPCB_NODE{
intid;
///进程标识数
intpriority;
///进程优先数
intarriveTime;
///进程到达时间
intcpuTime;
///进程已占用CPU时间
intallTime;
///进程还需占用CPU时间
intblockTime;
///进程已阻塞时间
STATEstate;
///进程状态
structPCB_NODE*prev;
///PCB前指针
structPCB_NODE*next;
///PCB后指针
};
typedefstructPCB_NODEPCB;
②模拟进程队列操作函数定义:
///进程入列
voidqueuePush(PCB*process,PCB*queueHead)
///进程出列
voidqueuePop(PCB*process,PCB*queueHead)
///查看队列中进程信息
voidqueueWalk(PCB*queueHead)
③模拟就绪队列操作函数定义:
///进程插入到就绪队列
voidreadyQueuePush(PCB*process)
///优先数最大的进程出列
PCB*readyQueuePop()
///每个时间片更新就绪队列中的进程信息
voidreadyQueueUpdate(inttimeSlice,PCB*pcb)
///返回就绪队列最大优先数的值
intreadyMaxPriority()
///查看就绪队列中的进程信息
voidreadyQueueWalk()
④模拟阻塞队列操作函数定义:
///进程插入到阻塞队列
voidblockQueuePush(PCB*process)
PCB*blockQueuePop()
///每个时间片更新阻塞队列中进程的信息
voidblockQueueUpdate()
///查看阻塞队列中的进程信息
voidblockQueueWalk()
⑤模拟动态优先权进程调度函数定义:
///初始化进程PCB数据,返回PCB头指针
PCB*initData()
///模拟CPU执行1个时间片的操作
voidcpuWord(PCB*cpuProcess)
⑥主函数关键代码:
inttimeSlice=0;
///模拟CPU时间片
intcpuBusy=0;
///模拟CPU状态
PCB*cpuProcess=NULL;
///当前CPU执行的进程
PCB*pHead,*pro;
///进程PCB头指针
pHead=initData();
///初始化进程PCB,返回进程头指针
pro=pHead+1;
///pro指向PCB中第一个进程
readyQueueUpdate(timeSlice,pro);
///根据进程到达时间将新建进程加入绪队列
///模拟动态优先权进程调度
while(true){
if(readyQueueNum==0&
&
blockQueueNum==0&
cpuBusy==0){
printf("
就绪队列、阻塞队列和CPU当前无进程运行,退出\n"
);
break;
}///endif
if(cpuBusy==0){///CPU空闲,选择一个进程进入CPU
if(readyQueueNum>
0){
///选择就绪队列优先级最高的进程作为CPU运行进程
cpuProcess=readyQueuePop();
}else{
///就绪队列中没有进程,改为选择阻塞队列优先级最高的进程
cpuProcess=blockQueuePop();
}
cpuProcess->
cpuTime=0;
///设置当前运行进程占用CPU时间
state=Run;
///设置当前运行进程的状态
cpuBusy=1;
///设置CPU当前状态为忙
}///endif
timeSlice++;
///当前时间片加1
printf("
\n第%d个时间片后:
\n"
timeSlice);
cpuWord(cpuProcess);
///模拟CPU执行1个时间片的操作
if(cpuProcess->
allTime==0){///若当前执行进程还需CPU时间片为0
state=Finish;
///设置当前进程状态为终止
free(cpuProcess);
///释放该进程的PCB内存空间
cpuBusy=0;
///CPU状态设置为空闲
///更新就绪队列和阻塞队列中的进程信息
blockQueueUpdate();
readyQueueUpdate(timeSlice,pro);
///查看就绪队列和阻塞队列的进程信息
readyQueueWalk();
blockQueueWalk();
if(cpuBusy==1&
readyQueueNum>
0&
cpuProcess->
priority<
readyMaxPriority()){
blockQueuePush(cpuProcess);
///需抢占CPU,当前执行的进程调入阻塞队列
cpuProcess=readyQueuePop();
///从就绪队列中选择优先级最高的进程运行
}
printf("
\n模拟进程动态优先权调度算法结束.\n"
return0;
(2)动态优先权调度算法流程图
(2)实验结果
①第1个时间片后:
②第2个时间片后:
③第3个时间片后:
④第4个时间片后:
⑤第5个时间片后:
⑥第6个时间片后:
⑦第7个时间片后:
⑧第8个时间片后:
⑨第9个时间片后:
⑩第10个时间片后:
⑪第11个时间片后:
⑫第12个时间片后:
⑬第13个时间片后:
⑭第14个时间片后:
⑮第15个时间片后:
⑯第16个时间片后:
⑰第17个时间片后:
⑱第18个时间片后:
⑲第19个时间片后:
⑳第20个时间片后:
(3)实验结果分析
①调度算法开始之前进程PCB信息为:
②调度算法结束之后进程PCB信息为:
③调度算法分析:
进程ID
到达时间
结束