当前位置:首页 > 进程调度算法的模拟实现—毕业设计论文
}
6 主要功能函数的实现
本系统中主要的功能函数有创建进程,显示已创建进程的信息,先来先服务调度算法,短作业优先调度算法,高优先权优先算法,时间片轮转算法。
6.1 创建进程createProc()函数的实现
因为各个调度算法都与进程到达的时间有关,所以本系统创建的进程是不带头结点的且按到达时间有序的链队列。在创建进程时,首先设定创建的进程数目,然后分别输入进程的名称、到达时间、服务时间。创建进程的主要代码是:
for(int i=1;i<=no;i++) //no是输入的进程数
{
PcbNode *temp=new PcbNode;
cout<<\第 \个进程的名称 (16字符以内):\cin>>temp->name;
cout<<\进程的到达时间 (以“秒”为单位的浮点数):\cin>>temp->arriveTime;
cout<<\进程的服务时间 (以“秒”为单位的浮点数):\cin>>temp->runTime; cout<
//将新创建的temp结点插入就绪队列qp1使其依据arriveTime有序 insert(qp1,temp);
}
6.2显示已创建进程信息showProc()函数的实现
该函数是把已创建好的进程信息显示出来,其实现方法主要是使用C语言中的setw()函数来控制输出格式,然后通过一个指针,指针初始指向进程队列队首,不断移动指针直到队列尾,在移动过程中以指定位置格式输出各个指针的name、
8
arriveTime以及runTime值即可。
6.3先来先服务算法FCFS()的实现
因就绪队列按到达时间有序排列,所以,先来先服务算法只需创建好的进程顺序输出即可模拟进程的执行,为使用户能直观看到算法执行效果,需求每个进程的周转时间和带权周转时间,运行结果同样由setw()函数控制格式输出,其主要代码如下:
while(p1!=NULL) {
float t1,t2,t3; float t4;
t1=p1->arriveTime;
t2=p1->runTime; //t2 运行时间 current+=t2;
t3=current-t1; //t3 周转时间 t4=float(t3)/t2; //t4 带权周转时间 cout< t2< //遍历队列全部调度,并计算打印各个参数 6.4短进程优先算法与高优先权优先算法SPF_FPF(slq,flag)的实现 进程调度的调度方式有抢占式和非抢占式,本模拟系统采用的是非抢占方式。在采用这种调度方式时,一旦把处理机分配给某个进程后,就让它一直运行下去,直到进程完成,自愿释放处理机或发生某事件而被阻塞时,才把处理机分配给其它进程。 短进程优先调度算法的每次调度是从就绪队列中选择服务时间最短的执行,而高优先权优先调度算法则是从就绪队列中选择优先权最高的执行,只是选择标准不同而其它过程类似,所以本模拟系统将二者定义为一个函数SPF_FPF(LinkQueue slq,int flag),具体算法由第二个参数flag确定。 高优先权优先调度,其优先权有两种:静态优先权和动态优先权。本系统采用调 9 度性能较好的动态优先权。其动态变化规律是等待时间与要求服务时间的和除以服务时间。 SPF_FPF(LinkQueue slq,int flag)函数中,根据flag的值决定具体算法,flag值为1是短进程优先调度,flag值为2是高优先权优先算法。其关键代码如下: current=0.0; //系统时间清零 float t1,t2,t3,t4; while(phead->next!=NULL) { //统计进程队列中到达时间大于current的进程数con int con=0; refrashCon(phead,current,con); // cout<<\ switch(con) { case 0: current++; break; case 1://只有一个进程到达,直接运行,计算并输出各个参数 pfront=phead->next; t1=pfront->arriveTime; t2=pfront->runTime; current+=t2; t3=current-t1; t4=t3/t2; cout< setw(10)< removePCB(phead); //该进程运行完毕,从就绪队列中删除 break; default://有多个进程 //查找最短进程或优先权最高进程,返回它的前驱 ptem=runSche(phead,con,flag); //执行ptem的下一个进程,计算并输出相应信息 pfront=ptem->next ; t1=pfront- 10 >arriveTime; t2=pfront->runTime; t3=current-t1; current+=t2; t4=float(t3)/t2; cout< >name< } 两个算法主要的区别在于runSche(phead,con,flag)的调用,runSche()的主要代码如下: if(flag==1) //短作业 { float time=p2->runTime;//p2初始指向就绪队列队首 数 } setw(10)< for(int i=0;i } { if(p2->runTime
共分享92篇相关文档