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

下载本文档

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

文档简介

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

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

3、第三周的指定时间到实验室进行上机验收 设计报告书收取时间:课程设计验收答辩完结时。(注意事项:严禁抄袭,一旦发现,抄与被抄的律按 0 分记)指导教师签名: 2013年 12 月 10 日系主任(或责任教师)签名: 2013年 12 月 10 日课程设计报告书1.需求分析1.1 设计目的(1) 阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有深入 的理解。(2) 掌握一种计算机高级语言的使用。程序流程图要求完成的主要任务:(包括课程设计工作量及其技术要求, 以及说明书撰写等具体要求)1.21.3设计要求(1) 能够选择不同的调度算法(要求中给出的调度算法);(2) 能够输入进

4、程的基本信息,如进程名、优先级、到达时间和运行时间等;(3) 根据选择的调度算法显示进程调度队列;(4) 根据选择的调度算法计算平均周转时间和平均带权周转时间。1 表示已执行2. 功能设计2.1 数据结构1. 进程的结构定义: struct process char name10; int no; double arrivetime; double needtime;double starttime; double endtime; int state; int priority; process *next; process *head=Null;/进程名/进程序号/进程达到时间/进程运行时

5、间/进程开始时间/进程结束时间/进程状态, 0 表示未执行,/进程优先级int count;;2. 使用链表存储进程并按照到达时间排序void in sert(process *curre nt)if (head!=Null)if(head-n ext=Null)/如果只有一个节点if(curre nt-arrivetimearrivetime)/ 女口果比链头至 U达时间早,则插入链头curre nt-n ext=head; head=curre nt;elsecurrent-next=Null;head-next=current;else/如果至少两个节点process *p1=head;

6、if(head-arrivetime current-arrivetime )current-next=head; head=current;elseint flag=1;while(p1-next!=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

7、=current; current-next=Null;else head=current;2.2 先来先服务算法设计1. FCFS 算法说明将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先 服务的方式进行调度处理,是一种最普遍和最简单的方法。在该算法中,每个作业或进程 按照它们在队列中等待时间长短来决定它们是否优先享受服务。 在没有特殊理由要优先调 度某类作业或进程时,从处理的角度来看,FCFS方式是一种最合适的方法,因为无论是追 加还是取出一个队列元素在操作上都是最简单的。2. 创建进程void createFCFS()process *q1=new process

8、 ;coutcount;coutendl;int number=1;while(numberno=number;cout 进程序号 numberendl;coutq1-name;coutq1-arrivetime;coutq1-needtime;q1-next=NULL;insert(q1);number+;coutendlendl;3. 进程调度及输出结果IyHead节点:开始时间=到达时间结束时间=开、八刖1 Fp节点:开始时间=p节点:开始时间=到达时间系统时间 束时间二开 束时间二开void prin tFCFS()process *p=new process;double systi

9、me=0;/记录系统时间double turn=0;/平均周转时间double turnw=0;/平均带权周转时间if(head=NULL)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!

10、=NULL)if(p-arrivetimesystime) / 如果前一个结束后一个还没到达p-starttime=p-arrivetime; 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; systi

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

12、)nosetw(10)namesetw(10)arriveTimese tw(10)startTimesetw(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;2.3 优先级算法的设计1. PIRO 算法及说明优先级法可被用作作业或进程的调度策略。首先,系统或用户按某种原则为作业或 进程指定一个优先级来表示该作业或

13、进程所享有的调度优先权。 该算法的核心是确定进程 或作业的优先级。确定优先级的方法可分为两类。即动态法和静态法静态法根据作业或进程的静态特 性,在作业或进程开始执行之前就确定它们的优先级,一旦开始执行之后就不能改变。动 态法则不然,它把作业或进程的静态特性和动态特性结合起来确定作业或进程的优先级, 随着作业或进程的执行过程,其优先级不断变化。静态优先级中,可以由用户自己根据作业的紧急程度输入一个适当的优先级,为防 止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用;也可以 由系统或操作员根据作业类型指定优先级。动态优先级中,基于静态优先级的调度算法实 现简单, 系统开销小,

14、 但由于静态优先级一旦确定之后, 直到执行结束为止始终保持不变, 从而系统效率较低,调度性能不高。现在的操作系统中,如果使用优先级调度的话,则大 多采用动态优先级的调度策略。2. 创建进程void 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);numb

15、er+;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;4. 输出调度结果process *p=new process;double sysTime=0;/记录系统时间double turn=0;/平均周转时间double tur

16、nw=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); turnw=turnw+(head-endtime - head-arrivetime) / head-needtime;/判断后面的for(int i=0;inext;while(p!=NULL) changePRIO(

17、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); turnw=turnw+(p-endtime-p-arrivetime)/p-needtime; p=p-next;else p=p-next;process *temp=head;cout.setf(ios:left);coutsetw

18、(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)startTimesetw(10)needTimeset w(10)endTimenext;cout 平均周转时间: turn/countendl 平均带权周转时间:turnw/countnext!=NULL)process *t=new

19、process;t=head-next;head-next=t-next;delete t; head=NULL;根据3. 源程序的主要部分 主程序主要完成调用各个函数完成相应的功能, 以及选择调度算法的输出提示, 提示并完成相应的算法实现过程。/程序主要部分int main()int choice;/选择服务int go=1;while (go)coutendlendl 进程调度模拟设计endlendl;cout1. 先来先服务算法 endl2. 优先级法 endl3. 退出 endlendl;coutchoice; switch(choice)case 1:FCFS();break;/调用

20、先来先服务算法case 2:PRIO();break;/ 调用优先计算法case 3:cout 退出 endl; go=0;break; /退出,返回首页 default:cout 选择有误,请重新输入选择! endl;break;system(pause);return 0;void FCFS()createFCFS();prin tFCFS();void PRIO()createPRIO();/chan gePRIO();prin tPRIO();4程序测试4.1先来先服务测试用例进程序号进程名称到达时间执行时间1a042b133c224d334.2先来先服务运行结果可nlrL-i !_f

21、tsu s 呈IH呈星 ITi 畀尸上p.一T it“ :亠BQ fsh 沥 转s 4TTT圧TI製JLLr3呂IDH1 i 一密-fr讲了丫十卄和白刮谨时闯幵玄白时间执疔日才间AAMHimALHItH1BG6 -&.27744e*06& -6.2?744t 0G6晴选毎:5.自我评价与总结本次课程设计的内容基本上是老师在课堂上所讲的, 所以我还是比较熟悉先来先服务 算法和优先级算法。看到这个题目时,我还是感觉相当轻松的,因为我还是比较熟悉该内 容,比较熟悉算法思想。设计过程中要注意流程的条理清晰,易于读懂和规划,程序编写完成以后,实现了预 期的效果,达到了设计的要求。界面设计比较清晰明了,易

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

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

24、ble 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

25、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;/

26、退出,返回首页设计退出default:cout 选择有误,请重新输入选择! next=Null)/如果只有一个节点 if(current-arrivetimearrivetime) / 如果比链头到达时间早,则插入 链头 current-next=head; head=current;else current-next=Null; head-next=current;else/如果至少两个节点process *p1=head; if(head-arrivetime current-arrivetime ) current-next=head; head=current;elseint flag

27、=1;while(p1-next!=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

28、 process ;coutcount; 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

29、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-arrive

30、time; 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+(p-e

31、ndtime-p-arrivetime)/p-needtime; p=p-next;cout.setf(ios:left);/ 设置对齐方式为 leftcoutsetw(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)arriveTimese tw(10)startTimesetw(1

32、0)needTimesetw(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-

33、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=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;if(head=NULL)cout 没有进程调度! starttime=head-arrivetime;

温馨提示

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

评论

0/150

提交评论