动态优先权进程调度算法模拟实验报告.docx
- 文档编号:28749399
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:11
- 大小:17.87KB
动态优先权进程调度算法模拟实验报告.docx
《动态优先权进程调度算法模拟实验报告.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法模拟实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
动态优先权进程调度算法模拟实验报告
华北电力大学
实验报告
实验名称动态优先权进程调度算法模拟
课程名称计算机操作系统
专业班级:
学生:
学号:
成绩:
指导教师:
实验日期:
一﹑实验目的:
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
二﹑实验容:
(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"iostream.h"
#include"windows.h"
//#defineN3
typedefstruct{
intID;
intPRIORITY;
intCPUTIME;
intALLTIME;
intSTARTBLOCK;
intBLOCKTIME;
intSTATE;//0-运行1-阻塞2-就绪3-结束4-未到达
intREACH;
intTIME;
}PROCESS;
voidtextcolor(intcolor)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}
voidmain(){
inti,time,max,l,l1,time1,flag=0,total=0,N,server[10],sum=0;
PROCESSpro[10];
textcolor(13);
cout<<"注意:
本程序中状态代表如下"< textcolor(15); cout<<"请输入进程数: "; cin>>N; cout<<"请设置时间片长度: "; cin>>time; cout<<"请输入各进程初始状态: "< cout<<"IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME"< for(i=0;i pro[i].CPUTIME=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;i cout< cout< cout< } total+=time; for(i=0;i if(pro[i].STATE==4&&pro[i].REACH pro[i].STATE=1; } } for(i=0;i time1=pro[i].ALLTIME; if(pro[i].STATE==0){ if(pro[i].ALLTIME<=time){ //pro[i].CPUTIME+=time1; pro[i].ALLTIME=0; pro[i].STATE=3; pro[i].TIME=total-time+time1; } else{ //pro[i].CPUTIME+=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){ //pro[i].CPUTIME+=time; pro[i].PRIORITY++; pro[i].TIME=total; } } max=-100; l1=-1; l=-1; for(i=0;i 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; for(i=0;i if(pro[i].STATE! =3){ flag=1; break; } } if(flag==0)break; }while (1); cout< "< textcolor(12); cout< textcolor(15); cout<<"IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE"< for(i=0;i cout< cout< cout< } cout< "< cout<<"进程号到达时间结束时间周转时间带权周转时间"< textcolor(10); for(i=0;i cout<<""< 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 2324215.25 2228266.5 1216143.5 平均周转时间为: 15.6 六﹑遇到问题和体会 本次试验感觉难度比较大,有很多生疏的指令。 但在老师和同学的帮助下都解决了。 总体上还是对进程概念和进程调度过程有了一个更深的理解。 在这次试验中也暴露出自己不少的缺点,希望以后试验中可以改正! 本文利用C语言对动态优先权的进程调度算法进行了设计和模拟实现。 程序可实现动态的进行各个进程相关信息的录入,如CPUTIME、ALLTIME、STARTBLOCK、BLOCKTIME等信息。 并充分考虑了进程在执行过程中可能发生的多种情况,更好的体现了进程的就绪态、执行态、阻塞态三者之间的关系以及相互的转换。 程序的运行过程清晰的体现了动态优先权的调度算法的执行过程,有利于加深对算法的理解和掌握。 由于抢占式调度算法与硬件密切相关,由软件实现非常困难,所以本程序实现的是非抢占式的动态优先权进程调度算法。 抢占式的动态优先权进程调度算法的模拟实现有待于进一步研究。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 优先权 进程 调度 算法 模拟 实验 报告