进程调度模拟实现_第1页
进程调度模拟实现_第2页
进程调度模拟实现_第3页
进程调度模拟实现_第4页
进程调度模拟实现_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、1操作系统课程设计报告题目: 进程调度算法的模拟实现 专业计算机科学与技术学生姓名刘远强班级计算机131学号1310704109指导教师韩 立 毛完成日期信 息 工 程 学 院11目 录1 概述21.1 设计目的21.2 设计要求22 设计原理22.1 先来先效劳算法22.2 短进程优先算法22.3高优先权优先算法22.4高响应比优先算法33 概要设计33.1 功能结构34 详细设计44.1 用户界面模块设计44.2 算法模块设计45 测试与分析125.1 测试方案125.2 测试结果125.3 结果分析146 设计小结157 参考文献15附录 源程序代码16题目:进程调度算法的模拟实现1 概

2、述1.1 设计目的在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有假设干个,也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占用处理机。要求学生设计一个模拟处理机调度算法,以稳固和加深处理机调度的概念。1.2 设计要求a)至少有四种作业调度算法;b)能根据不同的调度算法算出每个作业的周转时间和带权周转时间,并通过一组作业算出系统的平均周转时间和平均带权周转时间,比拟各种算法的优缺点;c)设计一个实用的用户界面,以便选择不同的作业调度算法。2 设计原理 先来先效劳算法 每次调度都是从后备作业队列中选择一个或多个最先进入该队列的

3、作业,将它们调入内存,为它们分配资源创立进程,然后放入就绪队列。2.2 短进程优先算法短进程优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。a当该算法用于作业调度时,系统从后备作业队列中选择假设干个优先级最高的,且系统能满足资源要求的作业装入内存运行。b当该算法用于进程调度时,将把处理机分配给就绪进程队列中优先级最高的进程。 高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先效劳和最短作业优先两种算法的特点。3 概要设计3.1 功能结构函数调用流程图如图31图314 详

4、细设计4.1 用户界面模块设计用户界面包含4种算法的选择项及退出项,并能根据对应选项做出相应反响。选择算法那么进入所选算法进行进一步计算,选择退出那么关闭界面,输入其他错误字符会显示错误提示。void main()int choice;cout*进程调度算法模拟实现*endl;*endl;cout*3.高优先权优先算法*4.高响应比优先算法*endl;cout*5.退出*endl;l1:cout请输入您的选择:choice;JCB *head=NULL;switch(choice)case 1:head=create(head);FCFS(head);goto l1;case 2:head=c

5、reate(head);SJF(head,jnum);goto l1;case 3:head=create(head);SUPER(head,jnum);goto l1;case 4:head=create(head);HRN(head,jnum);goto l1;case 5:break;default:cout输入错误!n请重新输入:next;cout作业执行顺序为:;while(p!=NULL)cout-name;p=p-next;coutendl;coutnext;while(s!=NULL)coutsetw(4)namesetw(7)htimesetw(10)starttimeset

6、w(11)ftimesetw(10)zhouzhuansetw(10)daiquannext;coutendl; cout 平均周转时间:total/(double)jnumendl;cout平均带权周转时间:weight/(double)jnumendl;cout*endl;total=0;weight=0;b)短作业优先算法:每次查找所有HEAD的结点,并将结点中最小作业所需运行时间的结点复制并连接到短作业优先链表的最后节点中。每复制一个结点,结点的是否被复制位置。共复制HEAD链表长度的LENGTH次,就复制完毕。这样形成的最短作业优先链表就刚刚好是按作业所需运行时间按从小到大的顺序排列

7、的了。void SJF(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head);coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于

8、暂存将要执行的作业while(q & q-htime ntimentime)flag=q;q=q-next;/输出当前执行作业的信息 coutsetw(4)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime);cout setw(11)htime + flag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;dr

9、unTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(flag=head) /在链表头head=head-next; else /在链表中p1=head;while(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag; /删除这个作业所占的节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; c

10、out平均带权周转时间为:drunTime/nendl;cout*endl;c)高优先权优先算法:其中的操作和短作业优先差不多。因为作业在输入时已经有了作业时间和优先权,高优先权算法是查找HEAD中最高优先权的结点进行复制。void SUPER(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head)

11、;coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于暂存将要执行的作业while(q & q-htime superflag-super)flag=q;q=q-next;/输出当前执行作业的信息 coutsetw(4)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime

12、);cout setw(11)htime + flag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;drunTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(flag=head) /在链表头head=head-next; else /在链表中p1=head;while(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag

13、; /删除这个作业所占的节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; cout平均带权周转时间为:drunTime/nendl;cout*endl;d)高响应比优先算法:首先是将HEAD整个链表复制过来形成高响应比链表,然后每执行一次就算出正在执行作业以后所有结点的响应比,查找出响应比最高的那个结点,将响应比最高的结点插入到正在执行作业后面。这样执行下一个结点时,必定是未执行所有结点中响应比最高的结点。void HRN(JCB *hea

14、d,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head);coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于暂存将要执行的作业/计算当前链表中作业的

15、响应比while(q & q-htime htime)/(q-ntime) (time - flag-htime)/(flag-ntime)flag=q;q=q-next;if(timehtime)/如果上一次结束时间比当前选中要执行作业的结束时间小time=flag-htime; /那么当前作业开始时间为提交时间/输出当前执行作业的信息 coutsetw(4)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime);cout setw(

16、11)htime + flag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;drunTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(flag=head) /在链表头head=head-next; else /在链表中p1=head;while(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag; /删除这个作业所占的

17、节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; cout平均带权周转时间为:drunTime/nendl;cout*endl;5 测试与分析5.1 测试方案先选择算法,输入进程数、作业名、优先级、到达时间、估计运行时间,得出相应的作业名、提交时间 、开始时间 、结束时间 、周转时间、带权周转时间。通过四种算法之间的比拟了解他们的优缺点。5.2 测试结果5.3 结果分析由测试结果可知每种算法的优缺点:a先来先效劳算法:有利于长作业进程而不利

18、于短作业进程有利于CPU繁忙型作业进程而不利于I/O繁忙型作业进程。b)短作业优先算法:比FCFS改善平均周转时间和平均带权周转时间短作业的等待时间;提高系统的吞吐量;对长作业非常不利,可能长时间得不到执行;未能依据作业的紧迫程度来划分执行的优先级;c)难以准确估计作业进程的执行时间,从而影响调度性能。c)高优先权算法:动态优先级优点是使相应的优先级调度算法比拟灵活、科学,可防止有些进程一直得不到调度,也可防止有些进程长期垄断处理机。动态优先级缺点是需要花费相当多的执行程序时间,因而花费的系统开销比拟大。d)高响应比优先算法:短作业与先后次序的兼顾,且不会使长作业长期得不到效劳响应比计算系统开

19、销,增加系统开销。6 设计小结 通过改程序对操作系统的基础 知识了解得更透彻了,同时对磁盘调度的四种算法先来先效劳算法,短进程优先调度算法,优先权算法,高响应比调度算法有了更深刻的理解和掌握,使我能够为进程调度选择适当的算法,提高CPU工作效率。进行进程调度程序设计的过程中,得到老师的大力指导和同学的支持,在此向他们表示感谢。经过自己的动手操作和同学老师的指导我成功的做出了课程设自己感到很快乐。在整个过程中自己也感受到了集体团结的力量,今后无论是在工作还是学习中我都会发样这种精神。7 参考文献1 韩立毛,李先锋. 计算机操作系统实践教程M,南京:南京大学出版社,2021.10.2 严蔚敏,吴伟

20、民. 数据结构M,北京:清华大学出版社,2021.43 张尧学,史美林. 计算机操作系统教程M,北京:清华大学出版社,2021 .8.4 孙静宇. 计算机操作系统课程设计指导书M,山西:太原理工出版社,2021 .4.附录 源程序代码#include#include#includeusing namespace std;#define MAX_NUM 15typedef struct JCBchar name10;/作业名float htime;/作业到达时间float ntime;/作业估计运行的时间float starttime;/作业开始运行时间float ftime;/作业完成的时间f

21、loat zhouzhuan;/周转时间float daiquan;/带权周转时间float xiangyingbi;/相应比int super;/优先级JCB *next;/定义指向下一个作业的指针JCB;int jnum;/定义作业数为jnumfloat total;/记录所有作业的总时间double weight;/记录所有作业的带权周转时间JCB *create(JCB *head);/创立作业队列void dealFCFS(JCB *head);/FCFS记录处理void sortFCFS(JCB *head);/将作业按到达的先后顺序排列void FCFS(JCB *head);/

22、先来先效劳算法void SJF(JCB *head,int n);/短作业优先算法void SUPER(JCB *head,int n);/高优先权优先算法void HRN(JCB *head,int n);/高响应比优先算法void main()int choice;cout *进程调度算法实现*endl;cout *1.先来先效劳算法*2.短作业优先算法*endl;cout *3.高优先权优先算法*4.高响应比优先算法*endl;cout*5. 退出*endl;l1:cout请输入您的选择:choice;JCB *head=NULL;switch(choice)case 1:head=cr

23、eate(head);FCFS(head);goto l1;case 2:head=create(head);SJF(head,jnum);goto l1;case 3:head=create(head);SUPER(head,jnum);goto l1;case 4:head=create(head);HRN(head,jnum);goto l1;case 5:break;default:cout输入错误!n请重新输入:endl;goto l2;/创立节点与作业输入JCB *create(JCB *head)JCB *p1,*p2;p1=p2=new JCB;head=p1;coutjnum

24、;for(int i=0;inext=NULL;cout请依次输入第i+1p1-namep1-superp1-htimep1-ntime; p2-next=p1;return head;/FCFS算法void sortFCFS(JCB *head)/将作业按到达的先后顺序排列JCB *p,*q,*r,*s;if(head-next!=NULL)p=head-next-next;head-next-next=NULL;while(p)q=p;p=p-next;r=head;s=head-next;while(s&s-htimehtime)r=s;s=s-next;r-next=q;q-next=

25、s;void dealFCFS(JCB *head)/FCFS记录处理sortFCFS(head);JCB *p,*q;q=head-next;q-starttime=q-htime;q-ftime=q-starttime+q-ntime;q-zhouzhuan=q-ftime-q-htime; q-daiquan=q-zhouzhuan/(double)q-ntime;total+=q-zhouzhuan; weight+=q-daiquan;p=q-next; while(p!=NULL)p-starttime=q-ftime;p-ftime=p-starttime+p-ntime;p-z

26、houzhuan=p-ftime-p-htime; p-daiquan=p-zhouzhuan/(double)p-ntime;total+=p-zhouzhuan; weight+=p-daiquan;q=p;p=p-next;void FCFS(JCB *head)/先来先效劳算法dealFCFS(head);JCB *p,*q,*s;p=head-next;cout作业执行顺序为:;while(p!=NULL)cout-name;p=p-next;coutendl;coutnext;while(s!=NULL)coutsetw(4)namesetw(7)htimesetw(10)star

27、ttimesetw(11)ftimesetw(10)zhouzhuansetw(10)daiquannext;coutendl; cout 平均周转时间:total/(double)jnumendl;cout平均带权周转时间:weight/(double)jnumendl;cout*endl;total=0;weight=0;/SJF短作业优先算法void SJF(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pn

28、ameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head);coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于暂存将要执行的作业while(q & q-htime ntimentime)flag=q;q=q-next;/输出当前执行作业的信息 coutsetw(4)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(

29、8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime);cout setw(11)htime + flag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;drunTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(flag=head) /在链表头head=head-next; else /在链表中p1=head;whil

30、e(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag; /删除这个作业所占的节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; cout平均带权周转时间为:drunTime/nendl;cout*endl;/高优先权优先算法void SUPER(JCB *head,int n)JCB *p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j

31、=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head);coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于暂存将要执行的作业while(q & q-htime superflag-super)flag=q;q=q-next;/输出当前执行作业的信息 coutsetw(4

32、)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime);cout setw(11)htime + flag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;drunTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(fla

33、g=head) /在链表头head=head-next; else /在链表中p1=head;while(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag; /删除这个作业所占的节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; cout平均带权周转时间为:drunTime/nendl;cout*endl;/高相应比优先算法void HRN(JCB *head,int n)JCB *

34、p,*p1;JCB *flag=NULL;JCB *q=NULL; double time=0,j=0,runTime=0, drunTime=0;int xuhao=0;string pnameMAX_NUM;for(int ss=0;ssMAX_NUM;ss+)pnamess=;sortFCFS(head);coutendl;coutnext;p=head;while(head)q=head;if(time htime) /如果该作业提交时间早于其它作业,那么先执行该作业time=p-htime;flag=head; /用于暂存将要执行的作业/计算当前链表中作业的响应比while(q &

35、q-htime htime)/(q-ntime) (time - flag-htime)/(flag-ntime)flag=q;q=q-next;if(timehtime)/如果上一次结束时间比当前选中要执行作业的结束时间小time=flag-htime; /那么当前作业开始时间为提交时间/输出当前执行作业的信息 coutsetw(4)xuhao+1;coutsetw(8)name;coutsetw(8)ntime;coutsetw(8)time;coutsetw(10)ntime);coutsetw(10)htime + flag-ntime);cout setw(11)htime + fl

36、ag-ntime)/flag-ntime)htime+flag-ntime); /当前执行作业的周转时间runTime +=j; /记录周转时间time+=flag-ntime;drunTime+=j/flag-ntime; /带权周转时间pnamexuhao=flag-name;xuhao+;/将执行过的作业从链表中删除if(flag=head) /在链表头head=head-next; else /在链表中p1=head;while(p1-next!=flag)p1=p1-next;p1-next=flag-next;delete flag; /删除这个作业所占的节点cout作业执行顺序为:;for(ss=0;ssn;ss+)coutpnamess;if(pnamess+1 !=)cout ;coutendl;cout 平均周转时间为:runTime/nendl; cout平均带权周转时间为:drunTime/nendl;cout*endl; 小学教师培

温馨提示

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

评论

0/150

提交评论