优先级法多级反馈轮转法Word文件下载.docx
《优先级法多级反馈轮转法Word文件下载.docx》由会员分享,可在线阅读,更多相关《优先级法多级反馈轮转法Word文件下载.docx(31页珍藏版)》请在冰豆网上搜索。
吴利军工作单位:
计算机科学与技术学院
题目:
进程调度模拟设计——优先级法、多级反馈轮转法
初始条件:
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();
voidproc_switch();
//进程切换
voidproc_switch_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函数部分
3.1.1main函数代码:
intmain(intargc,char*argv[])
{
charcommand;
srand((unsigned)time(NULL));
restart();
while((command=get_command())!
='
0'
);
}
3.2进程调度方法部分
3.2.1.多级轮转反馈函数代码:
//进程执行(RRMF算法)
voidproc_run_rrmf()
shortslices_out=0;
try_wakeup_procs();
printf("
>
"
if(running==NULL){
printf(没?
有®
D进?
程¨
¬
到Ì
?
达ä
!
\n"
return;
}
进程正在运行:
"
running->
name);
running->
used_run_time++;
next=NULL;
show_process(running);
if(running->
used_run_time==running->
run_time)
{
running->
finish_time=sys_clock;
use_slices=(QUEUE_NUM+1)-running->
priority;
append(&
finished_list,&
running);
slices_out=1;
elseif((rand()%100+1)<
30){
sleep_time=(rand()%5+1);
waiting_list,&
else{
running->
use_slices--;
if(0==running->
use_slices){
slices_out=1;
if(running->
priority>
PRIORITY4)
running->
priority--;
running->
append(&
ready_list[QUEUE_NUM-running->
priority],&
}
if(slices_out)
running=NULL;
3.2.2.优先级法函数代码
voidproc_run()
if(running==NULL){printf("
没有进程抵达\n"
进程正在运行:
serving_ready_list,&
running=NULL;
4.测试用例,运行结果与运行情况分析
4.1测试用例
运行界面
4.2运行结果
用多级轮转反馈法进行进程调度的结果如下图所示:
用优先级法进行进程调度所得到的结果如下图所示:
5.自我评价与总结
5.1本次课程设计做得比较好地方
本次课程设计条理清楚,能够运用两种不同的方法来进行进程调度。
在进程调度函数的实现时运用的结构体来实现各个的功能。
5.2什么地方做得不太好,以后如何改正
实验中一些不太好的部分就是本次实验虽然完成了老师所要求的任务,但是程序设计的界面还不是很优秀,用户体验不是很