操作系统课程设计进程调度模拟设计-先来先服务,优先_第1页
操作系统课程设计进程调度模拟设计-先来先服务,优先_第2页
操作系统课程设计进程调度模拟设计-先来先服务,优先_第3页
操作系统课程设计进程调度模拟设计-先来先服务,优先_第4页
操作系统课程设计进程调度模拟设计-先来先服务,优先_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、武汉理工大学系统软件开发实训A课程设计说明书 学 号:课 程 设 计课程名字系统软件开发实训A题 目进程调度模拟设计先来先服务、优先级法学 院计算机科学与技术学院专 业计算机科学与技术专业班 级姓 名指导教师李玉强2014年01月13日课程设计任务书学生姓名: 专业班级:指导教师:李玉强 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计先来先服务、优先级法初始条件:1预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1模

2、拟进程调度,能够处理以下的情形:能够选择不同的调度算法(要求中给出的调度算法); 能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等; 根据选择的调度算法显示进程调度队列; 根据选择的调度算法计算平均周转时间和平均带权周转时间。2设计报告内容应说明: 课程设计目的与功能; 需求分析,数据结构或模块说明(功能与框图); 源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结。时间安排:设计安排3周:查阅、分析资料 1天系统软件的分析与建模 4天系统软件的设计 5天系统软件的实现 3天撰写文档 1天课程设计验收答辩 1天设计验收安排:设计周的第三周的指定时间到实验室进行

3、上机验收。设计报告书收取时间:课程设计验收答辩完结时。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名: 2013 年 12 月 10日系主任(或责任教师)签名: 2013 年 12 月 10日课程设计报告书1.需求分析1.1设计目的(1)阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入的理解。(2)掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.2程序流程图开 始开 始选择调度算法先来先服务法输入进程队列信息优先级法结束?Y/N结 束YN切 换 算 法1.3设计要求(1)能够选择不

4、同的调度算法(要求中给出的调度算法);(2)能够输入进程的基本信息,如进程名、优先级、到达时间和运行时间等;(3)根据选择的调度算法显示进程调度队列;(4)根据选择的调度算法计算平均周转时间和平均带权周转时间。2.功能设计2.1数据结构进程的结构定义:struct processchar name10; /进程名int no; /进程序号double arrivetime; /进程达到时间double needtime; /进程运行时间 double starttime; /进程开始时间double endtime; /进程结束时间int state; /进程状态,0表示未执行,1表示已执行i

5、nt priority; /进程优先级process *next; process *head=Null;int count; ;2.使用链表存储进程并按照到达时间排序、开始开始链表空?只有一节点比较当前节点的到达时间与连续两个节点(p1,p1-next)的到达时间至少两个节点结 束YN插 到 链 头比较当前节点与已存在节点的到达时间在两节点之间?插入它们之间插 入p1=p1-nextvoid insert(process *current) if (head!=Null)if(head-next=Null) /如果只有一个节点if(current-arrivetimearrivetime)

6、/如果比链头到达时间早,则插入链头current-next=head;head=current;elsecurrent-next=Null;head-next=current; else /如果至少两个节点 process *p1=head; if(head-arrivetime current-arrivetime ) current-next=head; head=current; else int flag=1; while(p1-next!=Null) /当head后面不为空时一直做 /如果在两个节点间 if(p1-arrivetime arrivetime & p1-next-arr

7、ivetime current-arrivetime) current-next=p1-next; p1-next=current; flag=0; break; else p1=p1-next; /如果到达时间最大,则插到链尾 if (flag=1) p1-next=current; current-next=Null; else head=current;2.2先来先服务算法设计 1.FCFS算法说明将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。在该算法中,每个作业或进程按照它们在队列中等待时间长短来决定它们是否

8、优先享受服务。在没有特殊理由要优先调度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为无论是追加还是取出一个队列元素在操作上都是最简单的。2.创建进程void createFCFS() process *q1=new process ; coutcount; coutendl; int number=1; while(numberno=number; cout进程序号numberendl; coutq1-name; coutq1-arrivetime; coutq1-needtime; q1-next=NULL; insert(q1); number+; coutend

9、lnextP=null结 束YN前一个结束,后一个进程是否到达p节点:开始时间=到达时间 结束时间=开始时间+执行时间 系统时间=结束时间并计算周转时间和带权周转时间P=head-nextNp节点:开始时间=系统时间 结束时间=开始时间+执行时间 系统时间=结束时间并计算周转时间和带权周转时间P=head-nextYvoid printFCFS() process *p=new process; double systime=0; /记录系统时间 double turn=0; /平均周转时间 double turnw=0; /平均带权周转时间 if(head=NULL) cout没有进程调度s

10、tarttime=head-arriveTime; head-endtime=head-arrivetime+head-needtime; systime=head-endtime; turn=turn+(head-endtime - head-arrivetime); turnw=turnw+(head-endtime - head-arrivetime) / head-needtime; p=head-next; while(p!=NULL) if(p-arrivetimesystime) /如果前一个结束后一个还没到达 p-starttime=p-arrivetime; p-endtim

11、e=p-starttime+p-needtime; systime=p-endTime; turn=turn+(p-endtime-p-arrivetime); turnw=turnw+(p-endtime-p-arrivetime)/p-needtime; p=p-next; else /如果前一个未结束时后一个已经到达 p-starttime=systime; p-endtime=p-starttime+p-needtime; systime=p-endtime; turn=turn+(p-endtime-p-arrivetime); turnw=turnw+(p-endtime-p-ar

12、rivetime)/p-needtime; p=p-next; cout.setf(ios:left); /设置对齐方式为left coutsetw(10)进程序号setw(10)进程名setw(10)到达时间setw(10)开始时间setw(10)执行时间setw(10)结束时间endl; process *temp=head; while(temp!=NULL) cout.setf(ios:left); coutsetw(10)nosetw(10)namesetw(10)arriveTimesetw(10)startTimesetw(10)needTimesetw(10)endTimene

13、xt; cout平均周转时间turn/countendl平均带权周转时间turnw/countnext!=NULL) /回收空间 process *t=new process; t=head-next; head-next=t-next; delete t; head=NULL; 2.3 优先级算法的设计1.PIRO算法及说明优先级法可被用作作业或进程的调度策略。首先,系统或用户按某种原则为作业或进程指定一个优先级来表示该作业或进程所享有的调度优先权。该算法的核心是确定进程或作业的优先级。 确定优先级的方法可分为两类。即动态法和静态法静态法根据作业或进程的静态特性,在作业或进程开始执行之前就确

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

15、id createPRIO() process *q1=new process; coutcount; coutendl; int number=1; while(numberno=number; cout进程序号numberendl; coutq1-name; coutq1-priority; coutq1-arriveTime; coutq1-needTime; q1-next=NULL; insert(q1); number+; coutendl2) process *n0=head; process *n1=n0-next; process *n2=n1-next; for(int i

16、=0;iarrivetime arrivetime priority priority) n1-next=n2-next; n0-next=n2; n2-next=n1; n1=n0-next; n2=n0-next-next; n0=n1; n1=n2; n2=n2-next; 4.输出调度结果开 始开 始链表空?Head节点:开始时间=到达时间 结束时间=开始时间+执行时间 系统时间=结束时间并计算周转时间和带权周转时间P=head-nextP=null结 束N到达&未执行p节点:开始时间=系统时间 结束时间=开始时间+执行时间 系统时间=结束时间标记为已执行并计算周转时间和带权周转时间P

17、=head-nextYvoid printPRIO() process *p=new process; double sysTime=0; /记录系统时间 double turn=0; /平均周转时间 double turnw=0; /平均带权周转时间 if(head=NULL) cout没有进程调度!starttime=head-arrivetime; head-endtime=head-arrivetime+head-needtime; head-state=1; systime=head-endtime; turn=turn+(head-endtime - head-arrivetime

18、); turnw=turnw+(head-endtime - head-arrivetime) / head-needtime; /判断后面的 for(int i=0;inext; while(p!=NULL) changePRIO(double systime); /如果优先级最大的进程已经到达,则执行 if(p-arrivetime state=0) p-starttime=systime; p-endtime=p-arrivetime+p-needtime; systime=p-endtime; p-state=1; turn=turn+(p-endtime-p-arrivetime);

19、 turnw=turnw+(p-endtime-p-arrivetime)/p-needtime; p=p-next; else p=p-next; process *temp=head; cout.setf(ios:left); coutsetw(10)进程序号setw(10)进程名setw(10)优先级setw(10)到达时间setw(10)开始时间setw(10)执行时间setw(10)结束时间endl; while(temp!=NULL) coutsetw(10)nosetw(10)namesetw(10)prioritysetw(10)arriveTimesetw(10)startT

20、imesetw(10)needTimesetw(10)endTimenext; cout平均周转时间:turn/countendl平均带权周转时间:turnw/countnext!=NULL) process *t=new process; t=head-next; head-next=t-next; delete t; head=NULL; 源程序的主要部分主程序主要完成调用各个函数完成相应的功能,以及选择调度算法的输出提示,根据提示并完成相应的算法实现过程。/程序主要部分int main()int choice; /选择服务int go=1;while (go)coutendlendl进程

21、调度模拟设计endlendl; cout1.先来先服务算法endl2.优先级法endl3.退出endlendl;coutchoice;switch(choice) case 1:FCFS();break; /调用先来先服务算法 case 2:PRIO();break; /调用优先计算法 case 3:cout退出endl; go=0;break; /退出,返回首页 default:cout选择有误,请重新输入选择!endl;break;system(pause);return 0;void FCFS() createFCFS(); printFCFS(); void PRIO() create

22、PRIO(); /changePRIO(); printPRIO(); 4.程序测试4.1先来先服务测试用例进程序号进程名称到达时间执行时间1a042b133c224d334.2先来先服务运行结果进程序号进程名称优先级到达时间执行时间1a1042b4163c2244d3354.3先来先服务测试用例4.4优先级算法运行结果5.自我评价与总结本次课程设计的内容基本上是老师在课堂上所讲的,所以我还是比较熟悉先来先服务算法和优先级算法。看到这个题目时,我还是感觉相当轻松的,因为我还是比较熟悉该内容,比较熟悉算法思想。设计过程中要注意流程的条理清晰,易于读懂和规划,程序编写完成以后,实现了预期的效果,达

23、到了设计的要求。界面设计比较清晰明了,易于阅读和理解。本程序中,有些地方有重复,可以通过设计函数来简化程序,例如程序的创建,可以通过函数调用来实现,从而不必在两个算法中分别编写。编写程序时要先画出程序的流程图是非常有必要的,根据流程图的顺序来实现程序,并要注意合理的使用函数调用来使程序得到简化,并且易读易懂。编写程序的时候一定要先画流程图,对应流程图设计函数来简化程序。这次课程设计中比较失败的地方就是优先级算法的输出开始时间和结束时间出了点问题。 这次课程设计使得我受益匪浅,尤其是对优先级调度分析方法有了更深的理解和掌握。通过这次课程设计,我的编程能力又得到了进一步的提高,同时也培养了我的思维

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

25、/进程序号double arrivetime; /进程达到时间double needtime; /进程运行时间 double starttime; /进程开始时间double endtime; /进程结束时间int state; /进程状态int priority; /进程优先级process *next; process *head=Null;int count; ;void FCFS();void PRIO();void createFCFS();void insert(process *current); void printFCFS();void createPRIO();void c

26、hangePRIO(double systime); void printPRIO() ;/程序主要部分int main()int choice; /选择服务int go=1;while (go)coutendlendl进程调度模拟设计endlendl; cout1.先来先服务算法endl2.优先级法endl3.退出endlendl;coutchoice;switch(choice) case 1:FCFS();break; /调用先来先服务算法 case 2:PRIO();break; /调用优先计算法 case 3:cout退出endl; go=0;break; /退出,返回首页 defa

27、ult:cout选择有误,请重新输入选择!next=Null) /如果只有一个节点if(current-arrivetimearrivetime) /如果比链头到达时间早,则插入链头current-next=head;head=current;elsecurrent-next=Null;head-next=current; else /如果至少两个节点 process *p1=head; if(head-arrivetime current-arrivetime ) current-next=head; head=current; else int flag=1; while(p1-next!

28、=Null) /当head后面不为空时一直做 /如果在两个节点间 if(p1-arrivetime arrivetime & p1-next-arrivetime current-arrivetime) current-next=p1-next; p1-next=current; flag=0; break; else p1=p1-next; /如果到达时间最大,则插到链尾 if (flag=1) p1-next=current; current-next=Null; else head=current;void createFCFS() process *q1=new process ; c

29、outcount; coutendl; int number=1; while(numberno=number; cout进程序号numberendl; coutq1-name; coutq1-arrivetime; coutq1-needtime; q1-next=NULL; insert(q1); number+; coutendlendl; void printFCFS() process *p=new process; double systime=0; /记录系统时间 double turn=0; /平均周转时间 double turnw=0; /平均带权周转时间 if(head=N

30、ULL) cout没有进程调度starttime=head-arriveTime; head-endtime=head-arrivetime+head-needtime; systime=head-endtime; turn=turn+(head-endtime - head-arrivetime); turnw=turnw+(head-endtime - head-arrivetime) / head-needtime; p=head-next; while(p!=NULL) if(p-arrivetimesystime) /如果前一个结束后一个还没到达 p-starttime=p-arri

31、vetime; p-endtime=p-starttime+p-needtime; systime=p-endTime; turn=turn+(p-endtime-p-arrivetime); turnw=turnw+(p-endtime-p-arrivetime)/p-needtime; p=p-next; else /如果前一个未结束时后一个已经到达 p-starttime=systime; p-endtime=p-starttime+p-needtime; systime=p-endtime; turn=turn+(p-endtime-p-arrivetime); turnw=turnw

32、+(p-endtime-p-arrivetime)/p-needtime; p=p-next; cout.setf(ios:left); /设置对齐方式为left coutsetw(10)进程序号setw(10)进程名setw(10)到达时间setw(10)开始时间setw(10)执行时间setw(10)结束时间endl; process *temp=head; while(temp!=NULL) cout.setf(ios:left); coutsetw(10)nosetw(10)namesetw(10)arriveTimesetw(10)startTimesetw(10)needTimes

33、etw(10)endTimenext; cout平均周转时间turn/countendl平均带权周转时间turnw/countnext!=NULL) /回收空间 process *t=new process; t=head-next; head-next=t-next; delete t; head=NULL; void createPRIO() process *q1=new process; coutcount; coutendl; int number=1; while(numberno=number; cout进程序号numberendl; coutq1-name; coutq1-pr

34、iority; coutq1-arriveTime; coutq1-needTime; q1-next=NULL; insert(q1); number+; coutendl2) process *n0=head; process *n1=n0-next; process *n2=n1-next; for(int i=0;iarrivetime arrivetime priority priority) n1-next=n2-next; n0-next=n2; n2-next=n1; n1=n0-next; n2=n0-next-next; n0=n1; n1=n2; n2=n2-next; void printPRIO() process *p=new process; double sysTime=0; /记录系统时间 double turn=0; /平均周转时间 double turnw=0; /平

温馨提示

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

评论

0/150

提交评论