动态优先权进程调度算法模拟实验报告Word格式.docx
《动态优先权进程调度算法模拟实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法模拟实验报告Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
![动态优先权进程调度算法模拟实验报告Word格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/e50a5af0-a82a-4f4c-a658-aab902bdf82f/e50a5af0-a82a-4f4c-a658-aab902bdf82f1.gif)
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。
三、设计思路和方法
通过VC++程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模组,构造一个PCB结构体即进程控制块结构体,用来记录当前进程的的相关状态信息,包括进程标识符、处理机状态、进程调度信息、进程控制信息。
并通过C++语言模拟计算机的相关调度算法,对构建的PCB进程进行模拟调度和运行,从而实现用计算机对进程的调度过程进行过程仿真。
四、数据结构和算法
数据结构:
1.包含PCB信息的结构体
2.包含进程信息的顺序表结构
算法:
优先权=(等待时间+要求服务时间)/要求服务时间
Rp=(等待时间+要求服务时间)/要求服务时间=相应时间/要求服务时间
系统将所有就绪队列按优先级高低排成一个队列,每次调度时,将CPU分配给优先级最高的进程,并令其执行一个时间片,而后中断,寻找并运行下一个优先级最高的进程。
而所有进程的优先权在随进程的推进或随其等待时间的增加而增加,而被调度之后的程序则降低一定的优先级,从而使所有进程都有运行的机会,从而保证系统能在给定的时间内响应所有用户的请求。
五﹑程序代码和输出
1程序代码如下
#include"
"
PUTIME=0;
pro[i].TIME=0;
cin>
>
pro[i].ID>
pro[i].PRIORITY>
pro[i].REACH;
pro[i].ALLTIME>
pro[i].STARTBLOCK>
pro[i].BLOCKTIME;
server[i]=pro[i].ALLTIME;
if(pro[i].REACH==0)pro[i].STATE=0;
elsepro[i].STATE=4;
}
do{
cout<
<
endl<
当前时刻为:
total;
textcolor(12);
========================各进程状态为======================"
endl;
textcolor(15);
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE"
for(i=0;
i<
N;
i++){
cout<
pro[i].ID<
"
pro[i].PRIORITY<
pro[i].CPUTIME<
;
pro[i].ALLTIME<
pro[i].STARTBLOCK<
pro[i].BLOCKTIME<
pro[i].STATE;
}
total+=time;
if(pro[i].STATE==4&
&
pro[i].REACH<
total){
pro[i].STATE=1;
}
time1=pro[i].ALLTIME;
if(pro[i].STATE==0){
if(pro[i].ALLTIME<
=time){
PUTIME+=time1;
pro[i].ALLTIME=0;
pro[i].STATE=3;
pro[i].TIME=total-time+time1;
}
else{
PUTIME+=time;
pro[i].ALLTIME-=time;
pro[i].STARTBLOCK--;
if(pro[i].STARTBLOCK==0){
pro[i].STATE=1;
pro[i].BLOCKTIME=time1;
pro[i].STARTBLOCK=time1;
}
pro[i].PRIORITY-=3;
pro[i].TIME=total;
if(pro[i].STATE==1){
pro[i].BLOCKTIME--;
if(pro[i].BLOCKTIME==0)pro[i].STATE=2;
pro[i].TIME=total;
if(pro[i].STATE==2){
PUTIME+=time;
pro[i].PRIORITY++;
max=-100;
l1=-1;
l=-1;
if(pro[i].PRIORITY>
max&
(pro[i].STATE==0||pro[i].STATE==2)){
l=i;
max=pro[i].PRIORITY;
if(pro[i].STATE==0)l1=i;
if(l!
=-1&
l!
=l1)pro[l].STATE=0;
if(l1!
=-1)pro[l1].STATE=2;
flag=0;
if(pro[i].STATE!
=3){
flag=1;
break;
if(flag==0)break;
}while
(1);
cout<
当前时刻:
textcolor(12);
textcolor(15);
for(i=0;
各进程运行结束!
进程号到达时间结束时间周转时间带权周转时间"
textcolor(10);
pro[i].TIME<
pro[i].TIME-pro[i].REACH<
(float)(pro[i].TIME-pro[i].REACH)/server[i]<
sum+=pro[i].TIME-pro[i].REACH;
平均周转时间为:
(float)sum/N<
}
2输入
注意:
本程序中状态代表如下
0-运行1-阻塞2-就绪3-结束4-未到达
请输入进程数:
5
请设置时间片长度:
4
请输入各进程初始状态:
IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME
123014
264031
203452
212434
152453
3输出结果
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1200144
2600314
2004524
2104344
1504534
1200131
2004511
2104331
1504521
8
1200121
2700300
2104502
2104321
1504511
12
1200111
2700303
2204502
2104311
1604500
16
1300100
2304502
2204302
1600503
20
1300103
2404500
2304302
24
2400503
2404300
28
2400303
进程号到达时间结束时间周转时间带权周转时间
1316131.#INF
24841.#INF
232421
222826
121614
六﹑遇到问题和体会
本次试验感觉难度比较大,有很多生疏的指令。
但在老师和同学的帮助下都解决了。
总体上还是对进程概念和进程调度过程有了一个更深的理解。
在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正!
本文利用C语言对动态优先权的进程调度算法进行了设计和模拟实现。
程序可实现动态的进行各个进程相关信息的录入,如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME等信息。
并充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。
程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。
由于抢占式调度算法与硬件密切相关,由软件实现非常困难,所以本程序实现的是非抢占式的动态优先权进程调度算法。
抢占式的动态优先权进程调度算法的模拟实现有待于进一步研究。