ImageVerifierCode 换一换
格式:DOCX , 页数:32 ,大小:335.63KB ,
资源ID:9918939      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9918939.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(进程调度程序.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

进程调度程序.docx

1、进程调度程序进程调度程序摘 要进程管理是操作系统中的重要功能,用来创建进程、撤消进程、实现进程状态转换,它提供了在可运行的进程之间复用CPU的方法。在进程管理中,进程调度是核心,因为在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态,当就绪进程个数大于处理器数目时,就必须依照某种策略决定哪些进程优先占用处理器。本文通过两种算法模拟实现了进程之间的调度。关键词:创建进程;先来先服务;优先级调度目 录 1绪论 12模块代码算法 22.1创建进程 22.2创建PCB 22.3 CPU调度与分配模块 22.4CPU模拟运行模块 32.5可强占优先进程调度模块 43函数调用关系图 73.1总体

2、流程图 73.2可强占优先调度流程图 83.3 先来先服务调度流程 94测试结果 105结论 13参考文献 14致 谢 15附录 161绪论在操作系统中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。采用算法时,则要考虑多方面因素,以便达到最佳效果。做好这个课程设计,有利于加深对操作系统进程调度知识的理解。在这次进程调度程序设计中采用两种算法,最高优先级数优先的调度算法和先来先服

3、务算法,对多个进程进行调度,每个进程有三个基本状态,初始状态为就绪状态、运行状态和结束状态。最高优先级数优先的调度算法中,程序的某进程运行时间以时间片为单位计算,各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即Pro_time-process-needtime,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1,对于遇到优先数一致的情况,采用先来先服务策略解决。基于这种思想设计下面的程序流程图,在流程图的基础上采用c+语言和进程调度算法设计了进程运行程序。 2模块代码算法2.1

4、创建进程 struct ProcessPcb,定义PCB相关变量 processPcb()next=NULL; char pro_name20; /进程的名字 int time_submit ; /提交时间,从时间为1开始计时 int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成) int pro_priority ; /进程优先级 int time_start ; /开始执行的时间 int time_end ; /结束的时间 int time_wait ; /等待的时间 int pro_state ; /进程的状态 (就绪,执行,完成) int

5、time_left ; /还需多少时间单位,初始化为所需的执行时间 int time_turn ; /周转时间 double time_aver ; /带权周转时间2.2创建PCB CpuModel CpuModel()pcbnum=0; void cpurun(); /cpu模拟运行函数 bool GetPcb(); /进程输入函数 void ShowPcb(); /将输入的进程展示出来 void PriModel(); /可强占的优先进程调度模式 void FcfsModel(); /先到先服务调度模式 ProcessPcb PcbList100; /按提交时间排的未就绪进程队列() 2.

6、3 CPU调度与分配模块 class CpuModel public: CpuModel() pcbnum=0; void cpurun(); /cpu模拟运行函数 bool CreatePcb(); /进程输入函数 void ShowPcb(); /将输入的进程展示出来 void PriModel(); /可强占的优先进程调度模式 void FcfsModel(); /先到先服务调度模式 private: ProcessPcb PcbList100; /按提交时间排的未就绪进程 int pcbnum ; /进程数量 int freetime ; /cpu空闲时间 int allturn ;

7、/总周转时间 float allaver ; /总带权周转时间 ;2.4cpu模拟运行模块 void CpuModel:cpurun() int choose = 0 ; while(1) cout* 主菜单 *endl; cout-endl; cout* 1: 创建进程 *endl; cout* 2: 显示已创建的进程 *endl; cout* 3: 可强占的优先进程调度 *endl; cout* 4: 先到先服务调度 *endl; cout* 5: 退出系统 *endl; coutchoose ; coutendl ; switch(choose) case 1: CreatePcb();

8、 /创建进程 break; case 2: ShowPcb(); /显示已创建的进程 break; case 3: PriModel(); /可强占的优先进程方式 break; case 4: FcfsModel(); /先到先服务调度方式 break; case 5: return ; /结束程序 coutendl; 2.5可强占优先进程调度模块 void CpuModel:PriModel() coutnext=NULL; while(head-next!=NULL|pnumpcbnum) Sleep(1000); time+; cout*Time: 第time秒endl; while(p

9、numpcbnum & PcbListpnum.time_submitnext=head-next; head-next=pcb; if(head-next=NULL) cout没有可运行的进程next; pcb1=head-next; while(pcb1-next!=NULL) if(pcb-pro_prioritynext-pro_priority) pcb2=pcb1; pcb=pcb1-next; pcb1=pcb1-next; if(pcb-time_left=pcb-time_exe) pcb-time_start=time; pcb-pro_state=EXECUTE; pcb

10、-pro_priority=pcb-pro_priority-3; pcb-time_left-; cout进程编号:pro_idpro_name提交时间: time_submit执行时间:time_exe n 开始时间:time_start 还剩时间:time_left优先级数: pro_priorityendl ; 3函数调用关系图3.1总体流程图 3.2可强占优先调度流程图是 否图3.2可强占优先调度流程图 是 3.3 先来先服务调度流程是否否是是图3.3 先来先服务调度流程图 4测试结果1)创建进程: 图 4.1创建进程 2)显示创建进程: 图 4.2显示创建进程3)可强占的优先进程调

11、度过程: 图 4.3可强占的优先进程调度过程 图 4.4可强占的优先进程调度过程4)先来先服务进程调度过程: 图 4.5先来先服务进程调度过程 图 4.6先来先服务进程调度过程 图 4.7 先来先服务进程调度过程 5)退出系统: 图4.8退出系统 5结论课程设计是一门实践性较强的课程,通过在课堂里接受老师对知识的讲解,以及我们在课后对这些知识的理解,通过课程设计我们可以对知识做到学以致用的目的。在这次操作系统课程设计中,我们小组所要实践练习的是关于进程的调度,进程的调度有多种不同的算法,如先来先服务、优先级调度、时间片轮转、短进程优先最短剩余时间优先和最高响应比优先调度算法。由于算法的不同体现

12、出处理器对各个在就绪队列中进程调度的先后次序,体现了处理机的利用效率高低以及在就绪队列中各个进程调度的先后次序。在这次课程设计的过程中,遇到了许多的问题,通过请教同学,上网查资料等途径一一解决,通过这次操作系统的课程设计,加深了对进程调度的理解。在这次课程设计过程中,不同设计阶段出现了不同的问题。在总体设计阶段由于要将两种算法程序合写成一个代码程序,通过使用switch选择语句得以解决。程序在进行调试阶段出现了stdio.h:No sush file or directory问题,原因就是没有安装库文件,通过上网进行查找,由于运行环境缺少头文件资源,解决的方法是下载该文件sudo apt-ge

13、t install libc6-dev,才可以使得程序正确运行。 总体来说我认为操作系统这门学科在计算机科学当中是非常重要的,这次操作系统的课程设计收获颇丰,复习了许多东西,也从新学会了许多东西,我想这也许就是课程设计的最终目的吧。 参考文献1 汤子瀛,哲凤屏.计算机操作系统,西安电子科技大学出版社,1998.2 王清,李光明.计算机操作系统,冶金工业出版社,1995.3 孙钟秀.操作系统教程,高等教育出版社,1999.4 曾明.Linux操作系统应用教程,陕西科学技术出版社,2000.5 张丽芬,刘立雄.操作系统实验教程,清华大学出版社,1990.6 孟静.操作系统教程-原理和实例分,高等教

14、育出版社,2001.7 周长林.计算机操作系统,高等教育出版社,1992.8 张坤.操作系统实验教程,清华大学出版社,1994. 致 谢在这次操作系统课程设计中,我们是三名同学一组,三个同学共同来完成一个题目,我们小组做的是进程调度算法,采用最高优先级数优先的调度算法和先来先服务算法来完成进程的调度运行。由于作业任务的繁重,再加上课设过程中遇到了许多的困难,如在程序撰写、代码的调试与运行以、资料查找、整体设计过程中整体图形的构思和代码的调试与在ubuntu中的运行中遇到了许多的问题,幸好在我们小组同学积极配合查阅资料以及郭文娟老师的帮助师的住下才能够顺利的完成这次课程设计作业。在这里感谢我们组

15、的同学的积极配合以及他们解决问题的能力,感谢郭文娟老师的热切的辅导,让我们在有限的时间里做完这次课程设计作业。再次感谢与本次课设息息相关的各位老师和同学们,谢谢你们的积极参与与配合。附录#include #include #include #include #include using namespace std ; /进程的状态#define UNREADY 0 /未就绪#define READY 1 /就绪#define EXECUTE 2 /执行#define END 3 /完成struct ProcessPcb ProcessPcb() next=NULL; char pro_name

16、20; /进程的名字 int time_submit ; /提交时间,从时间的1开始计时 int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成) int pro_priority ; /进程优先级 int time_start ; /开始执行的时间 int time_end ; /结束的时间 int time_wait ; /等待的时间 int pro_state ; /进程的状态 (就绪,执行,完成) int time_left ; /还需多少时间单位,初始化为需的执行时间 int time_turn ; /周转时间 double time_av

17、er ; /带权周转时间 ProcessPcb *next; ; class CpuModel public: CpuModel() pcbnum=0; void cpurun(); /cpu模拟运行函数 bool CreatePcb(); /进程输入函数 void ShowPcb(); /将输入的进程展示出来 void PriModel(); /可强占的优先进程调度模式 void FcfsModel(); /先到先服务调度模式 private: ProcessPcb PcbList100; int pcbnum ; /进程数量 int freetime ; /cpu空闲时间 int allt

18、urn ; /总周转时间 float allaver ; /总带权周转时间 ;#includevoid CpuModel:cpurun() int choose = 0 ; while(1) cout* 主菜单 *endl; cout-endl; cout* 1: 创建进程 *endl; cout* 2: 显示已创建的进程 *endl; cout* 3: 可强占的优先进程调度 *endl; cout* 4: 先到先服务调度 *endl; cout* 5: 退出系统 *endl; coutchoose ; coutendl ; switch(choose) case 1: CreatePcb()

19、; /创建进程 break; case 2: ShowPcb(); /显示已创建的进程 break; case 3: PriModel(); /可强占的优先进程方式 break; case 4: FcfsModel(); /先到先服务调度方式 break; case 5: return ; /结束程序 coutendl; bool cmp(ProcessPcb a,ProcessPcb b) if(a.time_submit0&a0=9) num=a0-0; else return -1; for(i=1;i=0&ai=9) num=num*10+ai-0; else return -1; r

20、eturn num; bool CpuModel:CreatePcb() char num10; coutnum; /输入进程个数 pcbnum=isnumber(num); if(pcbnum=0) cout*输入有错*n; return 0; int i; for(i=0;ipcbnum;i+) /输入进程信息 cout*请依次输入第i+1个进程的信息*endl ; coutPcbListi.pro_name ; coutnum; PcbListi.time_submit=isnumber(num); if(PcbListi.time_submit=0) cout*输入有错*n; retu

21、rn 0; coutnum; PcbListi.time_exe=isnumber(num); if(PcbListi.time_exe=0) cout*输入有错*n; return 0; PcbListi.time_left=PcbListi.time_exe; /设置剩余执行时间 PcbListi.pro_state=UNREADY; /设置状态为未就绪 PcbListi.pro_priority=100-PcbListi.time_exe; coutendl ; sort(PcbList,PcbList+pcbnum,cmp); /按提交时间排序 for(i=0;ipcbnum;i+)

22、PcbListi.pro_id=i+1; /设置Id,根据提交时间 return 1; void CpuModel:ShowPcb() int i; coutn*所需执行的进程信息如下*n; for(i=0;ipcbnum;i+) cout进程编号:PcbListi.pro_id进程名字: PcbListi.pro_name 提交时间:PcbListi.time_submit 执行时间: PcbListi.time_exe 优先级数: PcbListi.pro_priorityendl ; coutendl; void CpuModel:PriModel() coutnext=NULL; wh

23、ile(head-next!=NULL|pnumpcbnum) Sleep(1000); time+; /时间片为1 cout*Time: 第time秒endl; /打印 while(pnumpcbnum & PcbListpnum.time_submitnext=head-next; /插在head之后 head-next=pcb; if(head-next=NULL) cout没有可运行的进程next; pcb1=head-next; while(pcb1-next!=NULL) if(pcb-pro_prioritynext-pro_priority) pcb2=pcb1; pcb=pcb1-next; pcb1=pcb1-next; if(pcb-time_left=pcb-time_exe) /该进程是否已开始 pcb-time_start=time; /设置开始时间 pcb-pro_state=EXECUTE; /设置状态为执行 pcb-pro_priority=pcb-pro_priority-3; pcb-time_left-; /剩余执行时间减去时间片 cout进程编号:pro_id进程名字: pro_name提交时间: time_submit执行时间:time

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1