设计一个按优先数调度算法实现处理器调度的程序改Word格式.docx
《设计一个按优先数调度算法实现处理器调度的程序改Word格式.docx》由会员分享,可在线阅读,更多相关《设计一个按优先数调度算法实现处理器调度的程序改Word格式.docx(13页珍藏版)》请在冰点文库上搜索。
![设计一个按优先数调度算法实现处理器调度的程序改Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/588cb86a-ae88-4138-936b-3c60a7e20605/588cb86a-ae88-4138-936b-3c60a7e206051.gif)
(5)若就绪队列为空,结束,否则,重复(3)。
2.程序中使用的数据结构及符号说明:
#definenum5//假定系统中进程个数为5
structPCB{
charID;
//进程名
intruntime;
//要求运行时间
intpri;
//优先数
charstate;
//状态,R-就绪,F-结束
};
structPCBpcblist[num];
//定义进程控制块数组
3.流程图:
(1)主程序流程图:
(2)子程序init()流程图:
(3)子程序max_pri_process()流程图:
开始
定义i,key,max=100
i=0
i<
num
pcblist[i].state==’r’
max<
pcblist[i].pri&
&
pcblist[i].state=='
R'
max=pcblist[i].prikey=i
pcblist[key].state=='
F'
return-1
returnkey
结束
i=i+1
(4)子程序show()流程图:
定义i
输出提示
输出pcblist[i]的ID,pri,runtime,state
提示按键继续
(5)子程序run()流程图:
4.源程序清单
//按优先数调度算法实现处理器调度的程序
#include"
stdio.h"
string.h"
#definenum5//假定系统中进程个数为5
structPCB
{
voidinit()//PCB初始化子程序
inti;
for(i=0;
num;
i++)
{
printf("
PCB[%d]:
IDpriruntime\n"
i+1);
//为每个进程任意指定pri和runtime
scanf("
%s%d%d"
&
pcblist[i].ID,&
pcblist[i].pri,&
pcblist[i].runtime);
pcblist[i].state='
;
//进程初始状态均为就绪
getchar();
//接收回车符
}
}
intmax_pri_process()//确定最大优先级进程子程序
intmax=-100;
//max为最大优先数,初始化为-100
intkey;
{if(pcblist[i].state=='
r'
)//r为辅助状态标志,表示正在运行
return-1;
//返回-1
else
if(max<
)//从就绪进程中选取优先数最大的进程
max=pcblist[i].pri;
//max存放每次循环中的最大优先数
key=i;
//将进程号赋给key
if(pcblist[key].state=='
)//具有最大优先数的进程若已运行完毕
//则返回-1
else//否则
returnkey;
//将key作为返回值返回
voidshow()//显示子程序
{inti;
\nIDpriruntimestate\n"
);
-------------------------------------------------\n"
i++)//依次显示每个进程的名、优先数、要求运行时间和状态
%s%6d%8d%s\n"
pcblist[i].ID,pcblist[i].pri,pcblist[i].runtime,&
pcblist[i].state);
printf("
pressanykeytocontinue...\n"
voidrun()//进程运行子程序
{inti,j;
intt=0;
//t为运行次数
for(j=0;
j<
j++)
{t+=pcblist[j].runtime;
}//运行次数即为各个进程运行时间之和
\nbeforerun,theconditonis:
\n"
show();
//调用show()子程序显示运行前PCB的情况
//等待输入回车符
t;
j++)
{while(max_pri_process()!
=-1)//具有最大优先数的进程没有运行完,让其运行
{
pcblist[max_pri_process()].state='
//将其状态置为r,表示其正在运行
}
)
{pcblist[i].pri-=1;
//将当前运行进程的优先数减1
pcblist[i].runtime--;
//要求运行时间减1
{
if(pcblist[i].runtime==0)
//运行完则将该进程状态置为结束
//未运行完将其状态置为就绪
}
show();
//显示每次运行后各PCB的情况
//等待回车进入下一次运行
}
voidmain()//按动态优先数调度主程序
init();
//初始化各个进程PCB
run();
//进程调度模拟
#definenum10//进程数为10
\n进程名优先数行时间状态\n"
按回车继续....\n"
注意:
如果进程运行时间不足将会继续运行知道时间用完为止\n"
\n运行前状态为: