动态优先权进程调度算法模拟实验报告.docx
《动态优先权进程调度算法模拟实验报告.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法模拟实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
![动态优先权进程调度算法模拟实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/2/e50a5af0-a82a-4f4c-a658-aab902bdf82f/e50a5af0-a82a-4f4c-a658-aab902bdf82f1.gif)
动态优先权进程调度算法模拟实验报告
华北电力大学
实验报告
实验名称动态优先权进程调度算法模拟
课程名称计算机操作系统
专业班级:
学生姓名:
学号:
成绩:
指导教师:
实验日期:
一﹑实验目的:
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
二﹑实验内容:
(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,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""
#include""
PUTIME=0;
pro[i].TIME=0;
cin>>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;
cin>>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<"<textcolor(12);
cout<textcolor(15);
cout<<"IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE"<for(i=0;icout<cout<cout<}
total+=time;
for(i=0;iif(pro[i].STATE==4&&pro[i].REACHpro[i].STATE=1;
}
}
for(i=0;itime1=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++;
pro[i].TIME=total;
}
}
max=-100;
l1=-1;
l=-1;
for(i=0;iif(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;
for(i=0;iif(pro[i].STATE!
=3){
flag=1;
break;
}
}
if(flag==0)break;
}while
(1);
cout<"<textcolor(12);
cout<textcolor(15);
cout<<"IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE"<for(i=0;icout<cout<cout<}
cout<"<cout<<"进程号到达时间结束时间周转时间带权周转时间"<textcolor(10);
for(i=0;icout<<""<sum+=pro[i].TIME-pro[i].REACH;
}
cout<<"平均周转时间为:
"<<(float)sum/N<textcolor(15);
}
2输入
注意:
本程序中状态代表如下
0-运行1-阻塞2-就绪3-结束4-未到达
请输入进程数:
5
请设置时间片长度:
4
请输入各进程初始状态:
IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME
123014
264031
203452
212434
152453
3输出结果
当前时刻为:
0
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1200144
2600314
2004524
2104344
1504534
当前时刻为:
4
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1200131
2600314
2004511
2104331
1504521
当前时刻为:
8
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1200121
2700300
2104502
2104321
1504511
当前时刻为:
12
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1200111
2700303
2204502
2104311
1604500
当前时刻为:
16
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1300100
2700303
2304502
2204302
1600503
当前时刻为:
20
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1300103
2700303
2404500
2304302
1600503
当前时刻为:
24
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1300103
2700303
2400503
2404300
1600503
当前时刻:
28
========================各进程状态为======================
IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE
1300103
2700303
2400503
2400303
1600503
各进程运行结束!
进程号到达时间结束时间周转时间带权周转时间
1316131.#INF
24841.#INF
232421
222826
121614
平均周转时间为:
六﹑遇到问题和体会
本次试验感觉难度比较大,有很多生疏的指令。
但在老师和同学的帮助下都解决了。
总体上还是对进程概念和进程调度过程有了一个更深的理解。
在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正!
本文利用C语言对动态优先权的进程调度算法进行了设计和模拟实现。
程序可实现动态的进行各个进程相关信息的录入,如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME等信息。
并充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。
程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。
由于抢占式调度算法与硬件密切相关,由软件实现非常困难,所以本程序实现的是非抢占式的动态优先权进程调度算法。
抢占式的动态优先权进程调度算法的模拟实现有待于进一步研究。