cin>>again;
if(again=='y'||again=='Y')
{
continue;
}
break;
}
}
3.实验结果:
四、时间片轮转法
1.基本思想:
将CPU的处理时间划分成一个个时间片,就绪队列中的诸进程轮流运行一个时间片,当时间片结束时,就强迫运行进程让出CPU,该进程进入就绪队列,等待下一次调度,同时,进程调度又去选择就绪队列中的一个进程,分配给它一个时间片,以投入运行。
在轮转法中,时间片长度的选择非常重要,将直接影响系统开销和响应时间。
如果时间片长度很小,则调度程序剥夺处理机的次数频繁,加重系统开销;反之,如果时间片长度选择过长,比方说一个时间片就能保证就绪队列中所有进程都执行完毕,则轮转法就退化成先进先出算法。
2.算法实现:
voidRoundRun()/*时间片轮转调度算法*/
{
intflag=1;
GetFirst();
while(run!
=NULL)
{
Output();
while(flag)
{
run->count++;
run->cputime++;
run->needtime--;
if(run->needtime==0)/*进程执行完毕*/
{
run->state='F';
InsertFinish(run);
flag=0;
}
elseif(run->count==run->round)/*时间片用完*/
{
run->state='W';
run->count=0;/*计数器清零,为下次做准备*/
InsertTime(run);
flag=0;
}
}
flag=1;
GetFirst();
}
}
3.实验结果:
五、非抢占式优先级调度算法
1.基本思想:
该算法的基本思想是进程优先级高者优先调度,是一种常用的进程调度算法。
该算法的关键是如何确定优先数。
通常确定优先数的方法有两种,即静态法和动态法。
(1)静态优先权是在创建进程时确定的,其运行特征是优先数确定之后在整个进行运行期间不再改变。
确定静态优先权的依据有进程的类型、进程所使用的资源、进程的估计运行时间等因素。
进程所申请的资源越多,估计的运行时间越长,进程的优先权越低。
进程类型不同,优先权也不同,如系统进程的优先权高于用户进程的优先权。
(2)动态优先级是指在创建进程时,其运行特征是根据系统资源的使用情况和进程的当前特点确定一个优先权,在进程运行过程中再根据情况的变化调整优先权。
动态优先权一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。
占有处理机的时间越长,则优先权越低;等待时间越长,则优先权越高。
①静态优先级调度算法实现较为简单,但不能反映系统以及进程在运行过程中发生的各种变化。
而动态优先级法可以满足这个方面的需要。
②动态优先级调度算法的性能一般介于时间片轮转算法和先来先服务算法之间。
2.算法实现:
voidPriority()/*按照优先级调度,每次执行一个时间片*/
{
intflag=1;
GetFirst();
while(run!
=NULL)/*当就绪队列不为空时,则调度进程如执行队列执行*/
{
Output();/*输出每次调度过程中各个节点的状态*/
while(flag)
{
run->prio-=3;/*优先级减去三*/
run->cputime++;/*CPU时间片加一*/
run->needtime--;/*进程执行完成的剩余时间减一*/
if(run->needtime==0)/*如果进程执行完毕,将进程状态置为F,将其插入到完成队列*/
{
run->state='F';
run->count++;/*进程执行的次数加一*/
InsertFinish(run);
flag=0;
}
else/*将进程状态置为W,入就绪队列*/
{
run->state='W';
run->count++;/*进程执行的次数加一*/
InsertTime(run);
flag=0;
}
}
flag=1;
GetFirst();/*继续取就绪队列队头进程进入执行队列*/
}
}
3.实验结果:
六、程序完整实现
/*
操作系统实验之银行家算法、时间片轮转算法和优先级调度算法
ByVisualC++6.0
*/
#include
#include
#include
#include
typedefstructnode
{
charname[20];/*进程的名字*/
intprio;/*进程的优先级*/
intround;/*分配CPU的时间片*/
intcputime;/*CPU执行时间*/
intneedtime;/*进程执行所需要的时间*/
charstate;/*进程的状态,W--就绪态,R--执行态,F--完成态*/
intcount;/*记录执行的次数*/
structnode*next;/*链表指针*/
}