进程调度模拟设计――先来先服务、优先级法_第1页
进程调度模拟设计――先来先服务、优先级法_第2页
进程调度模拟设计――先来先服务、优先级法_第3页
进程调度模拟设计――先来先服务、优先级法_第4页
进程调度模拟设计――先来先服务、优先级法_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学 号: 2课 程 设 计题 目进程调度模拟设计先来先服务、优先级法学 院计算机科学与技术学院专 业计算机科学与技术专业班 级计算机009班姓 名 永指导教师 汪祥莉 2012年01月13日 目录课程设计任务书.21.需求分析.3 1.1设计目的.3 1.2设计要求.32.功能设计.3 2.1数据结构.3 2.2先来先服务算法设计.4 2.2.1先来先服务算法的定义及说明.4 2.3优先级算法的设计.6 2.3.1优先级算法的定义及说明.6 2.3.2优先级进程调度及实现过程.6 2.3.3优先级调度流程图.10 2.4进程参数的输入.11 2.5调度结果的输出.123.源程序的主要部分.12

2、4.程序测试.14 4.1先来先服务测试用例.14 4.2先来先服务运行结果.15 4.3优先级算法测试用例.15 4.4优先级算法运行结果.165.程序流程图.176.自我评价与总结.187.源程序清单.19课程设计任务书学生姓名: 永 专业班级: 计算机0909班 指导教师: 汪祥莉 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计先来先服务、优先级法 初始条件:1预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1

3、模拟进程调度,能够处理以下的情形: 能够选择不同的调度算法(要求中给出的调度算法); 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等; 根据选择的调度算法显示进程调度队列; 根据选择的调度算法计算平均周转时间和平均带权周转时间。2设计报告内容应说明: 课程设计目的与功能; 需求分析,数据结构或模块说明(功能与框图); 源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如

4、果有,简要说明该方法);v)对实验题的评价和改进意见,请你推荐设计题目。时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日进程调度模拟设计先来先服务、优先级法1.需求分析 1.1设计目的(1)阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。(2)掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.2设计要求

5、(1)能够选择不同的调度算法(要求中给出的调度算法);(2)能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;(3)根据选择的调度算法显示进程调度队列;(4)根据选择的调度算法计算平均周转时间和平均带权周转时间。2.功能设计 2.1数据结构1. 进程的结构定义: struct Process /定义进程控制块 char name10;/ 进程名int priority; /进程优先级float arive; /进程到达时间float run; /进程运行时间float finish; /进程完成时间float zz; /进程周转时间float dqzz; /进程带权周转时间boo

6、l run_flag; /进程是否运行标志2.2先来先服务算法设计 2.2.1先来先服务算法的定义及说明 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。在该算法中,每个作业或进程按照它们在队列中等待时间长短来决定它们是否优先享受服务。在没有特殊理由要优先调度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为无论是追加还是取出一个队列元素在操作上都是最简单的。 2.2.2进程调度及实现过程void fcfs(Process pro,int k)/先来先服务法 for(int i = 0 ; i =

7、k-2;i+)int min = i;for(int j = i+1;jk;j+)if(proj.arive promin.arive)min = j;Process tmpPrp;memcpy(&tmpPrp,&proi,sizeof(Process);memcpy(&proi,&promin,sizeof(Process);memcpy(&promin,&tmpPrp,sizeof(Process);int n;cout进程调度顺序为:;for(n = 0;n = k-1;n+) ;coutendl;pro0.finish = pro0.arive+pro0.r

8、un; pro0.zz = pro0.finish - pro0.arive;pro0.dqzz = pro0.zz/pro0.run;for(n=1;n = k;n+)pron.finish = pron.run+pron-1.finish;pron.zz = pron.finish-pron.arive;float averagezz,averagedqzz;averagezz=0;averagedqzz=0;for(n=0;n=k-1;n+) averagezz+=pron.zz;averagezz=averagezz/k; cout平均周转时间为:averagezzendl;for(n

9、=0;n=k-1;n+)pron.dqzz=pron.zz/pron.run;averagedqzz += pron.dqzz;averagedqzz=averagedqzz/k; cout带权平均周转时间为:averagedqzzendl;2.3 优先级算法的设计 2.3.1优先级算法的定义及说明 优先级法可被用作作业或进程的调度策略。首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。该算法的核心是确定进程或作业的优先级。 确定优先级的方法可分为两类。即动态法和静态法静态法根据作业或进程的静态特性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执

10、行之后就不能改变。动态法则不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级,随着作业或进程的执行过程,其优先级不断变化。 静态优先级中,可以由用户自己根据作业的紧急程度输入一个适当的优先级,为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用;也可以由系统或操作员根据作业类型指定优先级。动态优先级中,基于静态优先级的调度算法实现简单,系统开销小,但由于静态优先级一旦确定之后,直到执行结束为止始终保持不变,从而系统效率较低,调度性能不高。现在的操作系统中,如果使用优先级调度的话,则大多采用动态优先级的调度策略。 2.3.2优先级进程调度及实现过程首先是

11、判定优先级并返回在进程表中索引int FindShouldBeRun(Process pro,int n)/判定优先级并返回在进程表中索引int index = -1; for(int i = 0 ; i n; i+)if(proi.arive = finish & proi.run_flag = false)index = i;if(i n-1)for(i = i+1; i = n-1;i+)if(proi.arive proindex.priority & proi.run_flag = false)index = i;return index;return index;return in

12、dex;然后是进行优先级调度void pri(Process pro,int n)/优先级法int i , j;int min = 0;/找出提交时间最早的与第一个交换数据for(i =1; i n;i+)if(proi.arivepromin.arive)min = i;Process tmpPrp;memcpy(&tmpPrp,&pro0,sizeof(Process);memcpy(&pro0,&promin,sizeof(Process);memcpy(&promin,&tmpPrp,sizeof(Process);cout进程调度顺序为:; ;pro0.f

13、inish = pro0.arive+pro0.run;pro0.zz = pro0.finish - pro0.arive;pro0.dqzz = pro0.zz/pro0.run;pro0.run_flag = true; finish = pro0.finish;for(i = 1;i = n-1; i+ )int index = FindShouldBeRun(pro,n);if(index = -1)coutERRORendl;return; ;proindex.run_flag = true;proindex.finish = finish + p

14、roindex.run;proindex.zz = proindex.finish - proindex.arive;proindex.dqzz = proindex.zz /proindex.run; finish += proindex.run;float zzTime = 0.0f;float dqzzTime = 0.0f;for(j = 0 ; j n ; j+)zzTime += proj.zz;dqzzTime += proj.dqzz;zzTime /= n;dqzzTime /= n;cout平均周转时间:zzTimeendl;cout平均带全周转时间:dqzzTimeend

15、l;return ;2.3.3优先级调度流程图开始大于进程数?是 否查找第一个被调度的进程,对第一个被调度的进程求相应的参数开始时间=达到时间结束时间=开始时间+执行时间系统时间=结束时间计算周转时间和带权时间大于进程数? 是结束查找下一个被调度的进程,对找到的下一个被调度的进程求相应的参数 否 开始时间=达到时间结束时间=开始时间+执行时间系统时间=结束时间标记为已执行计算周转时间和带权时间2.4进程参数的输入 该过程主要完成各数据的输入,包括进程个数、各进程的名称、各进程的到达时间,各进程的运行时间和各进程的优先级,以及完成初始化各数据。int pinput( ) int i;printf

16、(请输入进程个数:);scanf(%d,&counter);printf(请输入各进程名称:);for(i=0;icounter;i+) scanf(%s,);printf(请输入各进程的到达时间:);for(i=0;icounter;i+) scanf(%f,&e_time);printf(请输入各进程的运行时间:);for(i=0;icounter;i+) scanf(%f,&tasksi.run_time);printf(请输入各进程的优先级:);for(i=0;icounter;i+) scanf(%d,&tasksi.priority);fo

17、r(i=0;icounter;i+)proi.arive=0;proi.finish=0;proi.order=0;ti.run_flag=0;return 0;2.5调度结果的输出该过程主要完成各数据的输出,包括进程名、到达时间、运行时间、优先级、执行顺序,以及将结果显示在界面上。void print(Process pro,int n)/显示进程for(int i=0;i=n-1;i+)cout进程i+1: endl; cout进程i+1优先级:proi.priority endl;cout进程i+1到达时间:proi.arive endl;cout进程i+1运行时间:p

18、roi.run endl;3. 源程序的主要部分 主程序主要完成调用各个函数完成相应的功能,以及选择调度算法的输出提示,根据提示并完成相应的算法实现过程。 int main()while(true)int i,j;int n;coutn;Process *pro = new Processn;for(i = 0 ; i n; i+)memset(&proi,0,sizeof(Process); cout请输入进程名:;for(i=0;;cout请输入进程优先级:;for(i=0;iproi.priority;cout请输入各进程到达时间:;for(i=0;iproi.ari

19、ve;cout请输入各进程运行时间:;for(i=0;iproi.run; cout请选择您要使用的进程调度算法endl;cout1.先来先服务法:endl;cout2.优先级法:endl;cout其他.退出:j;if(j=1) print(pro,n);fcfs(pro,n);else if(j=2) print(pro,n); pri(pro,n);else return 0;4.程序测试 4.1先来先服务测试用例进程序号进程名称到达时间执行时间1a042b133c224d334.2先来先服务运行结果4.3优先级算法测试用例进程序号进程名称优先级到达时间执行时间1a1042b4163c22

20、44d3354.4优先级算法运行结果5.程序流程图 开始 请输入进程个数请输入各进程名称请输入各进程的到达时间请输入各进程的运行时间请输入各进程的优先级请选择调度算法 优先级调度先来先服务退出 执行完 执行完6.自我评价与总结 本次课程设计的内容基本上是老师在课堂上所讲的,所以我还是比较熟悉先来先服务算法和优先级算法。看到这个题目时,我还是感觉相当轻松的,因为我还是比较熟悉该内容,比较熟悉算法思想。设计过程中要注意流程的条理清晰,易于读懂和规划,程序编写完成以后,实现了预期的效果,达到了设计的要求。界面设计比较清晰明了,易于阅读和理解。本程序中,有些地方有重复,可以通过设计函数来简化程序,例如

21、程序的创建,可以通过函数调用来实现,从而不必在两个算法中分别编写。编写程序时要先画出程序的流程图是非常有必要的,根据流程图的顺序来实现程序,并要注意合理的使用函数调用来使程序得到简化,并且易读易懂。 通过课程设计的实际上机操作,它有助于我们更好地掌握和理解知识,更有利于我们查漏补缺。要知道知识是死的,能够运用起来它将具有很大的活力。在平时的学习中,由于受一些因素影响,学的不是很好。但通过上机操作完成一项完整的程序设计以后,加深了我对这门课的认识,进一步较好地掌握所学的内容,并要做到完善自己的知识体系,然后从中找出自己的不足。 这次课程设计使得我受益匪浅,尤其是对优先级调度分析方法有了更深的理解

22、和掌握。通过这次课程设计,我的编程能力又得到了进一步的提高,同时也培养了我的思维能力。总的说来,这次课程设计不仅丰富了我的理论知识,也加强了我的动手能力,还锻炼了我的思维能力。在实验程序编写和调试过程中我学会了很多,也认识到了自己的不足,我还需要进一步的努力,以致取得更大的进步。我需要的就是要对自己有信心,脚踏实地,持之以恒,遇到困难时要冷静思考,勇敢面对,直到得出结果。在实验设计过程中,我也养成了较好地习惯,先有框架,然后跟着框架发展,最后就是要注重细节,要做到严谨和缜密。不可否认这种好习惯让我受益无限,我也必须拥有它,以致我获得更多。7.源程序清单#includeusing namespa

23、ce std;struct Process/定义进程控制块 char name10;/ 进程名int priority; /进程优先级float arive; /进程到达时间float run; /进程运行时间float finish; /进程完成时间float zz; /进程周转时间float dqzz; /进程带权周转时间bool run_flag; /进程是否运行标志;float finish = 0.0f;void print(Process pro,int n)/显示进程 for(int i=0;i=n-1;i+) cout进程i+1: endl; cout进程i+

24、1优先级:proi.priority endl;cout进程i+1到达时间:proi.arive endl;cout进程i+1运行时间:proi.run endl;void fcfs(Process pro,int k)/先来先服务法 for(int i = 0 ; i =k-2;i+) int min = i;for(int j = i+1;jk;j+) if(proj.arive promin.arive) min = j; Process tmpPrp;memcpy(&tmpPrp,&proi,sizeof(Process);memcpy(&proi,&promin,sizeof(Pro

25、cess);memcpy(&promin,&tmpPrp,sizeof(Process); int n;cout进程调度顺序为:;for(n = 0;n = k-1;n+) ;coutendl;pro0.finish = pro0.arive+pro0.run; pro0.zz = pro0.finish - pro0.arive;pro0.dqzz = pro0.zz/pro0.run;for(n=1;n = k;n+) pron.finish = pron.run+pron-1.finish;pron.zz = pron.finish-pron.arive;fl

26、oat averagezz,averagedqzz;averagezz=0;averagedqzz=0;for(n=0;n=k-1;n+) averagezz+=pron.zz; averagezz=averagezz/k; cout平均周转时间为:averagezzendl;for(n=0;n=k-1;n+) pron.dqzz=pron.zz/pron.run;averagedqzz += pron.dqzz;averagedqzz=averagedqzz/k; cout带权平均周转时间为:averagedqzzendl; int ShouldRun(Process pro,int n)/

27、判定优先级并返回在进程表中索引 int index = -1;for(int i = 0 ; i n; i+) if(proi.arive = finish & proi.run_flag = false) index = i;if(i n-1) for(i = i+1; i = n-1;i+) if(proi.arive proindex.priority & proi.run_flag = false) index = i;return index;return index;return index;void pri(Process pro,int n)/优先级法 int i , j;in

28、t min = 0;/找出提交时间最早的与第一个交换数据for(i =1; i n;i+) if(proi.arivepromin.arive) min = i;Process tmpPrp;memcpy(&tmpPrp,&pro0,sizeof(Process);memcpy(&pro0,&promin,sizeof(Process);memcpy(&promin,&tmpPrp,sizeof(Process); cout进程调度顺序为:; ;pro0.finish = pro0.arive+pro0.run;pro0.zz = pro0.finish - pro0.arive;pro0.dqzz = pro0.zz/pro0.run;pro0.run_flag = true; finish = pro0.finish; for(i = 1;i = n-1; i+ ) int index = ShouldRun(pro,n);if(index = -1) coutERRORendl;return; ;proindex.run_flag = tr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论