动态优先权进程调度算法模拟实验报告 华北电力大学.docx
- 文档编号:5899439
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:12
- 大小:18.46KB
动态优先权进程调度算法模拟实验报告 华北电力大学.docx
《动态优先权进程调度算法模拟实验报告 华北电力大学.docx》由会员分享,可在线阅读,更多相关《动态优先权进程调度算法模拟实验报告 华北电力大学.docx(12页珍藏版)》请在冰豆网上搜索。
动态优先权进程调度算法模拟实验报告华北电力大学
一﹑实验目的:
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
二﹑实验内容:
(1)用VC++语言实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:
✧进程标识数ID。
✧进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
✧进程已占用CPU时间CPUTIME。
✧进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
✧进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
✧进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
✧进程状态STATE。
✧队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
✧进程在就绪队列中呆一个时间片,优先数增加1。
✧进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。
三﹑设计思路和方法:
本程序通过结构体来实现计算机的控制模组,由此构造一个PCB结构体,即为进程控制块结构体,以此来记录当前进程的状态情况,包括PCB、调度信息、控制信息和处理机状态。
运用C语言模拟调度算法,对构建的PCB进程进行调度和运行,以此来实现进程调度过程仿真,完成本实验的实验目标与要求。
四﹑主要数据结构和算法:
数据结构包括:
PCB结构体包含进程信息的顺序表结构:
typedefstruct{
intID;//定义进程标识数
intPRIORITY;//定义进程优先数
intCPUTIME;//定义进程已占用CPU时间
intALLTIME;//定义进程还需占用的CPU时间
intSTARTBLOCK;//定义进程的阻塞时间
intBLOCKTIME;//定义进程被阻塞的时间
intSTATE;//0-运行1-阻塞2-就绪3-结束4-未到达
intREACH;//定义到达时间
intTIME;//定义进程推进时刻
}PROCESS;
算法:
优先权=(等待时间+要求服务时间)/要求服务时间
Rp=(等待时间+要求服务时间)/要求服务时间
=相应时间/要求服务时间
计算机CPU将进程按照优先级的高低来排列,并规定一个时间片,当时间片用完后,CPU中断当前任务,下一优先级最高的进程。
调度运行完成后的进程,其优先权会降低,同时,所有进程的优先级随着时间的增加或是进程的推进而增加。
随着时间的推进,所有程序都会有运行的机会,以此来完成用户的要求。
五﹑程序代码和输出
1、程序代码如下
#include"iostream.h"
#include"windows.h"
//#defineN3
typedefstruct{
intID;//定义进程标识数
intPRIORITY;//定义进程优先数
intCPUTIME;//定义进程已占用CPU时间
intALLTIME;//定义进程还需占用的CPU时间
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;//令第i个进程占用CPU的时间为0 pro[i].TIME=0;//令进程推进时刻等于0 cin>>pro[i].ID>>pro[i].PRIORITY>>pro[i].REACH;//输入第i个进程的进程标识数、优先数、到达时间 cin>>pro[i].ALLTIME>>pro[i].STARTBLOCK>>pro[i].BLOCKTIME;//输入第i个进程还需占用的CPU时间、阻塞时间、被阻塞的时间 server[i]=pro[i].ALLTIME;//令server[i]等于第i个进程还需占用的CPU时间 if(pro[i].REACH==0)pro[i].STATE=0;//如果第i个进程的到达时间等于零,那么令其进程状态等于0 elsepro[i].STATE=4;//否则,令其进程状态等于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;//则阻塞第i个进程 } } for(i=0;i time1=pro[i].ALLTIME;//令time1等于第i个进程的还需占用CPU的时间 if(pro[i].STATE==0)//如果第i个进程正在运行,则运行下列程序 if(pro[i].ALLTIME<=time)//如果第i个进程还需占用CPU的时间小于等于时间片长度,则 { pro[i].CPUTIME+=time1;//第i个进程已经占用的CPU时间加上time1,即加上第i个进程还需占用CPU的时间 pro[i].ALLTIME=0;//令第i个进程还需占用的CPU时间为0 pro[i].STATE=3;//结束第i个进程 pro[i].TIME=total-time+time1;//令第i个进程的推进时刻变为当前时刻减去时间片长度加上其还需占用CPU的时间 } else//否则{ pro[i].CPUTIME+=time;//第i个进程已经占用的CPU时间加上时间片长度 pro[i].ALLTIME-=time;//第i个进程还需占用的CPU时间减去时间片长度 pro[i].STARTBLOCK--;//第i个进程的阻塞时间减一 if(pro[i].STARTBLOCK==0)//如果第i个进程的阻塞时间等于0{ pro[i].STATE=1;//则阻塞第i个进程 pro[i].BLOCKTIME=time1;//令第i个进程被阻塞的时间等于其还需占用CPU的时间 pro[i].STARTBLOCK=time1;//令第i个进程的阻塞时间等于其还需占用CPU的时间 } pro[i].PRIORITY-=3;//第i个进程的优先数减三 pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻 } } if(pro[i].STATE==1)//如果第i个进程处于阻塞状态,则{ pro[i].BLOCKTIME--;//第i个进程被阻塞的时间逐一递减 if(pro[i].BLOCKTIME==0)pro[i].STATE=2;//如果第i个进程被阻塞的时间等于0,则 pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻 } if(pro[i].STATE==2)//如果第i个进程处于就绪状态,则{ pro[i].PRIORITY++;//令第i个进程的优先数加一 pro[i].TIME=total;//令第i个进程的进程推进时刻等于当前时刻 } } max=-100;//令max=-100 l1=-1;//l1=-1 l=-1;//l=-1 for(i=0;i if(pro[i].PRIORITY>max&&(pro[i].STATE==0||pro[i].STATE==2))//如果第i个进程的优先级大于max且第i个进程的进程状态等于0或第i个进程的进程状态等于2,则{ l=i;//令l=i max=pro[i].PRIORITY;//令max等于第i个进程的优先数 } if(pro[i].STATE==0)l1=i;//如果第i个进程正在运行,则令l1=i } if(l! =-1&&l! =l1)pro[l].STATE=0;//如果l不等于-1且l不等于l1,则进程l的进程状态等于0 if(l1! =-1&&(pro[l].PRIORITY>pro[l1].PRIORITY))pro[l1].STATE=2;//如果l1不等于-1,且进程l的优先数大于进程l1的优先数,则令进程l1处于就绪状态 flag=0; for(i=0;i if(pro[i].STATE! =3)//如果第i个进程未结束 { flag=1;//则令flag等于1 break;//退出循环 } } if(flag==0)break;//如果flag等于0,则退出循环 }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;//sum等于sum加上第i个进程的推进时刻与第i个进程的到达时刻的差 } cout<<"平均周转时间为: "<<(float)sum/N< textcolor(15); } 2输入 请输入进程数: 3 请设置时间片长度: 4 请输入各进程初始状态: IDPRIORITYREACHALLTIMESTARTBLOCKBLOCKTIME 475936 168467 357568 3输出结果 当前时刻为: 0 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709364 1604674 3505684 当前时刻为: 4 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709364 1604674 3505684 当前时刻为: 8 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709351 1604674 3505671 当前时刻为: 12 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709341 1604661 3505661 当前时刻为: 16 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709331 1604651 3505651 当前时刻为: 20 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709321 1604641 3505641 当前时刻为: 24 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4709311 1604631 3505631 当前时刻为: 28 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4809300 1604621 3505621 当前时刻为: 32 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4545200 1604611 3505611 当前时刻为: 36 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4281102 1704600 3605602 当前时刻为: 40 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4381102 1740603 3705600 当前时刻为: 44 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4481100 1740603 3441500 当前时刻: 48 ========================各进程状态为====================== IDPRIORITYCPUTIMEALLTIMESTARTBLOCKBLOCKTIMESTATE 4490103 1740603 3450503 各进程运行结束! 进程号到达时间结束时间周转时间带权周转时间 4545404.44444 1840328 3745387.6 平均周转时间为: 36.6667 六﹑遇到问题和体会 本次实验主要研究了动态优先权进程调度算法模拟。 动态优先权是指在创建进程时所赋予的优先权,在一些算法中,CPU会根据进程的优先权来决定进程执行的顺序。 这次试验中,我们了解了动态优先权调度算法以就绪队列中各个进程的优先权作为进程调度的依据。 数据越大优先权越高,采用该算法时每次都在就绪队列中优先权最高的进程进行调度。 本次试验中,根据设置不同的PCB相关项目的数值,得到不同的结果,经验证,这些值都符合理论值,用实践验证了理论。 根据老师所给程序,我不仅对动态优先权进程调度算法有了更深刻的了解,同时也进一步重新学习了C语言编程,受益匪浅 遇到的问题只是在程序运行时有一些误解,后来读懂了问题也就解除了。 最后,十分感谢老师的耐心指导!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态优先权进程调度算法模拟实验报告 华北电力大学 动态 优先权 进程 调度 算法 模拟 实验 报告 华北电力 大学