优先级法多级反馈轮转法进程调度模拟设计.docx
《优先级法多级反馈轮转法进程调度模拟设计.docx》由会员分享,可在线阅读,更多相关《优先级法多级反馈轮转法进程调度模拟设计.docx(31页珍藏版)》请在冰豆网上搜索。
![优先级法多级反馈轮转法进程调度模拟设计.docx](https://file1.bdocx.com/fileroot1/2022-11/16/58a674ed-7440-4b93-974f-2157706a101d/58a674ed-7440-4b93-974f-2157706a101d1.gif)
优先级法多级反馈轮转法进程调度模拟设计
学号:
课程设计
题目
进程调度模拟设计——优先级法、多级反应轮转法
学院
计算机学院
专业
班级
姓名
指导教师
吴利军
2021
年
1
月
15
日
课程设计任务书
学生姓名:
指导教师:
吴利军工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——优先级法、多级反应轮转法
初始条件:
1.预备内容:
阅读操作系统的处理机办理章节内容,对进程调度的功能以及进程调度算法有深入的理解。
2.实践准备:
掌握一种计算机高级语言的使用。
要求完成的主要任务:
〔包孕课程设计工作量及其技术要求,以及仿单撰写等具体要求〕
1.模拟进程调度,能够处理以下的情形:
⑴能够选择分歧的调度算法〔要求中给出的调度算法〕;
⑵能够输入进程的根本信息,如进程名、优先级、到达时间和运行时间等;
⑶按照选择的调度算法显示进程调度队列;
⑷按照选择的调度算法计算平均周转时间和平均带权周转时间。
2.设计敷陈内容应说明:
⑴需求分析;
⑵功能设计〔数据构造及模块说明〕;
⑶开发平台及源轨范的主要局部;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结:
〕你认为你完成的设计哪些地方做得比力好或比力出色;
〕什么地方做得不太好,以后如何改正;
〕从本设计获得的收获〔在写,调试,执行过程中的经历和教训〕;
〕完成此题是否有其他方式〔如果有,简要说明该方式〕;
时间放置:
设计放置一周:
周1、周2:
完成轨范分析及设计。
周2、周3:
完成轨范调试及测试。
周4、周5:
验收、撰写课程设计敷陈。
〔考前须知:
严禁抄袭,一旦发现,一律按0分记〕
指导教师签名:
年月日
系主任〔或责任教师〕签名:
年月日
进程调度模拟设计
——优先级法、多级轮转反应法
1设计目的与功能
1.1设计目的
了解进程调度中的相关知识,能够使用其中的方式来进展进程调度模拟设计。
本次课程设计的重点是多级轮转反应法和优先级法的使用,要求熟练掌握并运用他们,并能够运用一种高级语言来完成这个轨范。
1.2设计功能
模拟进程调度,能够处理以下的情形:
⑴能够选择分歧的调度算法〔要求中给出的调度算法〕;
⑵能够输入进程的根本信息,如进程名、优先级、到达时间和运行时间等;
⑶按照选择的调度算法显示进程调度队列;
⑷按照选择的调度算法计算平均周转时间和平均带权周转时间。
2.需求分析,数据构造或模块说明(功能与框图)
2.1需求分析
无论是在处理系统、分时系统还是实时系统,用户进程数一般都多于处理机数,这将导致用户进程互相争夺处理机。
另外,系统进程也同样需要使用处理机。
这就要求进程调度轨范按照必然的策略,动态地把处理机分派给处于就绪队列中的某一个进程,以使之执行。
进程调度的主要任务是按照某种策略和方式拔取一个处于就绪状态的进程占用处理机。
这次课程设计所要求使用的方式是时间片轮转和优先级法,并且能够选择分歧的算法。
而时间片轮转法的根本思路是让每个进程在就绪队列中的等待时间与享受办事的时间成比例。
时间片轮转法的根本概念是将CPU的处理时间分成固定大小的时间片。
如果一个进程选中之后用完了系统规定的时间片,但未完成要求的任务,那么它自行释放本身所占有的CPU而排到就绪队列的末尾,等待下一次调度。
同时,进程调度轨范又去调度当前就绪队列中的第一个进程或作业。
优先级法是系统或用户按某种原那么为作业或进程指定一个优先级来暗示该作业或进程所享有的调度优先权。
优先级高的作业或进程优先调度。
按照所需求,这个进程调度的实现过程如下列图所示:
2.2数据构造和模块说明
主要数据构造:
structPCB{
charname[NAME_LEN];
intpriority;//优先级
intarrive_time;//到达时间,即创立时间
intrun_time;//需要的时间片数
intfinish_time;//完成时间
intsleep_time;//用于模拟进程的阻塞耗时
intswitch_time;//切换队列的时间〔SRR专用〕
intused_run_time;//已经用过的时间片数
shortuse_slices;//每次占用CPU将消耗的时间片数分歧队列中的进程的值纷歧样〔RRMF专用〕
structPCB*next;
};
轨范中主要函数
charget_command();//显示主菜单并承受用户令
voidadd_process();//添加一个PCB构造进入预先准备队列
voidstart_scheduling();//演示进程调度队列,SRR版
voidstart_scheduling_rrmf();//RRMF版
voidcalculate_time_costs();//计算并显示平均周转时间,平均带权周转时间
voidswitch_algorithm();//切换调度算法〔线性优先级法,多级反应轮转法〕
voidview_list(structPCB*list);//查看队列中内容
voidhelp_menu();//显示辅助菜单
voidrestart();//释放资源,重新开场
voidman_auto();//手动自动切换
voidappend(structPCB**head,structPCB**node);//添加于所指队列的队尾
voidshow_process(structPCB*node);//显示一个PCB的内容
voidtime_slice();//一个时间片
voidproc_run();//进程执行
voidproc_run_rrmf();//RRMF版
voidproc_switch();//进程切换
voidproc_switch_rrmf();//RRMF版
voidtry_wakeup_procs();//遍历等待队列,减少sleep_time,唤醒sleep_time降至进程
3.源轨范的主要局部
本次轨范主要由三个局部组成:
main函数局部,该局部主要包含main函数;LRU算法局部,该局部主要包含LRU函数、setm(intm,intn)函数和mini(int*b)函数;OPT算法局部,该局部主要包含OPT函数和getOpt(intinPage)函数。
3.1main函数局部
main函数代码:
intmain(intargc,char*argv[])
{
charcommand;
srand((unsigned)time(NULL));
restart();
while((command=get_command())!
='0');
}
3.2进程调度方式局部
//进程执行〔RRMF算法〕
voidproc_run_rrmf()
{
shortslices_out=0;
try_wakeup_procs();
printf(">");
if(running==NULL){
printf(没?
有®D进?
程¨¬到Ì?
达ä?
!
\n");
return;
}
printf("进程正在运行:
",running->name);
running->used_run_time++;
running->next=NULL;
show_process(running);
printf("\n");
if(running->used_run_time==running->run_time)
{
running->finish_time=sys_clock;
running->use_slices=(QUEUE_NUM+1)-running->priority;
append(&finished_list,&running);
slices_out=1;
}
elseif((rand()%100+1)<30){
running->sleep_time=(rand()%5+1);
running->use_slices=(QUEUE_NUM+1)-running->priority;
append(&waiting_list,&running);
slices_out=1;
}
else{
running->use_slices--;
if(0==running->use_slices){
slices_out=1;
if(running->priority>PRIORITY4)
running->priority--;
running->use_slices=(QUEUE_NUM+1)-running->priority;
append(&ready_list[QUEUE_NUM-running->priority],&running);
}
}
if(slices_out)
running=NULL;
}
voidproc_run()
{
try_wakeup_procs();
printf(">");
if(running==NULL){printf("没有进程抵达\n");
return;
}
printf("进程正在运行:
",running->name);
running->used_run_time++;
running->next=NULL;
show_process(running);
printf("\n");
if(running->used_run_time==running->run_time)
{
running->finish_time=sys_clock;
append(&finished_list,&running);
}
elseif((rand()%100+1)<30){
running->sleep_time=(rand()%5+1);
append(&waiting_list,&running);
}
else{
append(&serving_ready_list,&running);
}
running=NULL;
}
4.测试用例,运行结果与运行情况分析
4.1测试用例
运行界面
4.2运行结果
用多级轮转反应法进展进程调度的结果如下列图所示:
用优先级法进展进程调度所获得的结果如下列图所示:
5.自我评价与总结
5.1本次课程设计做得比力好地方
本次课程设计条理清楚,能够运用两种分歧的方式来进展进程调度。
在进程调度函数的实现时运用的构造体来实现各个的功能。
5.2什么地方做得不太好,以后如何改正
实验中一些不太好的局部就是本次实验虽然完成了教师所要求的任务,但是轨范设计的界面还不是很优秀,用户体验不是很好。
以后需要在这方面改善,一个好的轨范不仅要有高效率,易