Passtime=Passtime+1;//通过时间加1
if(Passtime==Alltime)
{
SetRunningList();//清空运行队列
}
}//当就绪队列中没有PCB,CPU中有正在运行的PCB时
if(ReadyList.Count!
=0&&RunningList.Id!
=0)
{//当cpu中正在运行的进程优先级数大于等于就绪队列中优先级数最高的进程优先级数时
if(RunningList.Priority>=(ReadyList.Priority)
{
Passtime=Passtime+1;//当cpu中的进程已经运行完毕
if(Passtime==Alltime)
{
SetRunningList();//清空运行队列
}
}
else
{
print("未完成");
Priority=Priority-1;//动态优先级算法优先级减1表示动态
//当优先级小于0时,将优先级重置成0
RunningList=ReadyList[0];
Passtime=Passtime+1;
if(Passtime==Alltime)
{//当cpu中的进程已经运行完毕
RunningList=ReadyList[0];
ReadyList.RemoveAt(0);//将就绪队列中的0号元素删除
}
}
}
}
文字描述:
1.进程从进程数组到等待队列;
文字描述:
2.启动系统时间,并与随机进程的进入时间比较,进入时间小于等于系统时间就进入就绪队列,最终使符合要求的所有进程进入就绪队列,并在就绪队列中按优先级排序;
文字描述:
3.当等待和就绪队列都空时,CPU出于空闲状态;当就绪队列中有PCB,CPU中无进程时,将就绪队列中的队头元素移入运行队列;当就绪队列中无PCB,CPU中有进程运行时,判断总时间和运行时间的关系;当就绪队列中有PCB,CPU中正在运行进程时,判断运行队列与就绪队列中进程优先级的关系,运行队列中进程优先级大时,判断运行队列中进程总时间和运行时间的关系,否则进程从运行队列中移除,并使进程优先级减1,使就绪队列中的进程完成抢占。
③时间片轮转调度算法
设计思想:
根据随机产生的优先级,确定时间片执行进程,就绪队列队头进入到运行态,在时间片内不能完成的进入就绪队列,时间片完成从运行队列中删除。
程序流程:
伪码:
privatevoidTimepiece(pcb)
{
List.clear();//清空所有的队列
Waitlist.add(pcb[n]);//将pcb放入等待队列
if(state=0&waitlist.in<=systime)
{
Readylist.add(Waitlist[n]);
state=1;//标志
}//当进入时间小于等于系统时间时将pcb放入就绪队列
if(Readylist.count>1)
{
由高到低进行排序;//当就绪队列中的进程数大于一个时对这些进程进行冒泡法//排序
}
if(Runninglist==0&Readylist==0)
{
print(“CPU空闲”);
}//当就绪队列中没有PCB,CPU中也没有正在运行的PCB时,判断CPU空闲
if(Runninglist==0&Readylist!
=0)
{
Runninglist[n]=Readylist[n];
}//当就绪队列中有PCB,CPU中没有正在运行的PCB时,将PCB放入就绪队列
if(Runninglist!
=0)
{//CPU中有正在运行的PCB时
Roundtime=In+priority*10;//时间片等于随机产生优先级的10倍
Lefttime=Alltime+In-systime;//剩余时间
if(Roundtime>systime)
{//时间片大于系统时间时进行剩余时间判断
if(lefttime>0)
{//剩余时间大于0,则未完成,优先级减1,重返就绪队列
print(“未完成”);
priority=priority-1;
Readylist=newpcb;
}
else//剩余时间小于等于0,完成
print(“完成”);
}
else
{//时间片小于等于系统时间时进行剩余时间判断
if(lefttime>0)
{//剩余时间大于0,则未完成,优先级减1,重返就绪队列
print(“未完成”);
priority=priority-1;
Readylist=newpcb;
}
else//剩余时间小于等于0,CPU空闲
print(“CPU空闲”);
}
}
}
文字描述:
1.利用随机数初始化进程对象数组,将其加入等待队列;
2.当等待队列中的进程的进入时间等于系统时间时代表进程进入也就是将进程加入就绪队列;
3.这时候进行判断,分四种情况讨论:
第一种:
当CPU中没有进程运行时也就是运行队列中没有进程,同时就绪队列里没有进程也就是就绪队列为空时判定CPU为空闲状态;
第二种:
当CPU中没有进程运行时也就是运行队列中没有进程,同时就绪队列里有进程也就是就绪队列不为空时判定CPU不处于空闲状态,这时将就绪队列队头,即首个元素(进程)进入运行队列,即运行此进程;
第三种:
当CPU中有进程运行时也就是运行队列中有进程,同时判断时间片是否完成即时间片减去系统时间是否小于0,小于等于0即完成否则为完成。
若时间片未完成则进行剩余时间的判断,若剩余时间小于等于0则进程完成,若剩余时间大于0则将进程的优先级减一重新放回到就绪队列队尾,同时将运行队列进行初始化以便接下来的进程继续运行;
第四种:
当CPU中有进程运行时也就是运行队列中有进程,同时判断时间片是否完成即时间片减去系统时间是否小于0,小于等于0即完成否则为完成。
若时间片完成则进行剩余时间的判断,若剩余时间小于等于0则CPU处于空闲状态没有进程在运行;若剩余时间大于0则将进程的优先级减一重新放回到就绪队列队尾,同时将运行队列进行初始化以便接下来的进程继续运行。
四、测试运行及结果分析
1.随机产生进程模块:
①初始化随机生成10个进程进程名、优先级、进入时间、总时间等属性
②在Listview中显示
③并将随机产生的进程装入等待队列
2.静态优先级立即抢占算法:
①随机产生了3个进程,进程3最先进入,优先执行;
②在系统时间为4的时候进程1进入,进程1的优先级要高于进程3所以发生立即抢占,这是中断进程3,进程3进入就绪队列将优先级设置为最低,将进程1加入运行队列,开始执行;
③这时3个进程已经全部进入等待队列,没有优先级高于进程1的进程,所以一直执行进程1直至结束,计算周转时间;
④因为优先级不会改变就按照就绪队列中目前的优先级排序依次执行各个进程,直至运行队列以及就绪队列均为空,计算CPU利用率为95%,结束。
3.动态优先级算法:
①随机生成7个进程,进程7优先进入,进入时间为7,进程7需要运行的时间为42;
②进程6进入时间为8,优先级为4高于进程7,所以这时候进程7中断开始执行进程6,进程7被放回就绪队列尾,状态标记为未完成;
③在系统时间为12,15时,进程3,4,5相继进入但是由于优先级均小于进程6所以不予于执行;
④进程6运行10以后,进程2进入,进程2优先级要高于进程6,故进程6中断开始执行进程2,进程6被放回就绪队列尾,状态标记为未完成;
⑤此时所有进程都已经进入等待队列完毕,但是没有进程优先级高于进程2,故一直执行进程2直至结束,进程2标志为结束,计算进程2的周转时间为54;
⑥运行队列此时没有进程运行所以看就绪队列,其中在进行优先级减1过后进程6优先级为最高,故将进程6加入运行队列执行,标记状态未完成,计算周转时间;
⑦其余在就绪队列里的进程重复以上操作,不断地执行或是优先级减一在排序达到动态优先级算法的功能;
⑧最后当运行队列以及就绪队列中均没有进程的时候,程序结束,计算CPU的利用率为97%。
4.时间片轮转算法:
①为了便于描述只随机生成3个进程不然时间时间片算法界面显示过长不易解释,进程3优先进入,进入时间为2,进程3需要运行的时间为42;
②根据算法进程3优先级为2为其动态分配20个时间片,而进程3需要执行时间为42所以在时间片用尽后中断进入就绪队列,优先级减一,等待下一次执行;
③20各系统时间过后,此时三个进程已经全部进入,进程2的优先级最高,转而执行进程2,进程2优先级为5故分配50个时间片其需要运行的时间为49,在时间片内可以完成,故状态变为完成,计算周转时间;
④在这时CPU空闲,输出CPU空闲时间在Listview上;
⑤以此类推,此时进程1与进程3的优先级作比较,进程1的要高于进程3的优先级故执行进程1,进程1优先级为3分配30个时间片。
但是只需要12各系统时间便可完成,状态置为完成,计算周转时间;
⑥现在只剩下进程3所以执行,它的优先级现在只为1给10个时间片,又运行了十个系统时间中断,这使将它的优先级减一送回就绪队列;
⑦就绪队列中只剩下进程3这时候进程3的优先级为0无法给时间片,所以讲进程3的优先级重新赋值为1,接着进入运行队列,分配给10个时间片,接着运行,经过是个系统时间进程3运行完毕,状态置为完成,计算周转时间;
⑧最后当运行队列以及就绪队列中均没有进程的时候,程序结束,计算CPU的利用率为95%。
五、实验总结
六、备注
提交资料目录:
文件夹:
进程调度仿真.exe
子文件夹:
Doc:
1.实验报告.doc;
2.result.txt
3.使用手册.doc
Code1.源程序:
实验源程序进程调度
源程序文件清单:
1.Form1.cs:
界面函数,进程调度三个函数
2.Program.cs:
主控程序
3.PCB.cs:
PCB类