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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

进程调度模拟说明书.docx

1、进程调度模拟说明书*实践教学*兰州理工大学计算机与通信学院2012年秋季学期操作系统课程设计题 目: 进程调度模拟实验专业班级: 计算机(2)班 姓 名: 温天波 学 号: 10240220 指导教师: 李 睿 成 绩: 目录1、设计目的意义.3 1.1、目的意义.3 1.2、实现目标.32、设计方案思想.43、程序功能模块设计.4 3.1、总体模块.4 3.2、部分模块.5 3.3、详细功能描述.74、程序总控流程图.75、函数的调用关系.9 6、测试数据及测试结果.97、设计体会及收获.138、参考资料.149、源代码.15 摘要 在操作系统的运行中,进程调度模拟实验是验证有N个进程并发执

2、行时的优选择方法,是系统性能达到最优的组合。进程的调度算法有:采用最高优先级的优先算法(即把处理机分配给优先级最高的进程)和先来先服务算法。每一个进程都有一个控制块PCB。进程控制块包含进程名,优先级,到达时间需要运行时间,已用CPU时间,进程状态等。进程的优先级及需要的运行时间可以实现的人为定义,进程的运行时间片以时间片为单位进行运算,在进行模拟调度的过程中可以创建进程和输入时间。其基本流程的操作主要以流程和界面解释为主。从而验证系统性能最大化的发挥。进程的运行时间以 每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。 关键字:进程,进程控制块

3、( PCB),优先数,调度算法 1、 设计目的意义 1.1、目的意义 通过课程设计理解进程调度的概念,深入了解进程控制的功能、进程的创建、删除以及进程各个状态间的转换过程;实现先来先服务、时间片轮转、最短作业优先、优先级调度算法对进程进行的调度过程;通过观察有关的队列结构的内容的动态变化过程深入体会各个调度算法的特点;从而能够更好的巩固从书本上学到的知识。 编程过程中需要建立队列等结构进行各种操作,通过该次课程设计,我们更加从实用的角度对数据结构课程内容进行更深入理解和更熟练的应用。使用C+语言进行编程,通过对调度功能的编程实现,不但能有效训练我们对编程语言的熟练使用,还能促进我们独立思考解决

4、问题、以及独立查新获取知识的能力。1.2、实现目标 一个进程的生命期可以划分为一组状态,这些状态刻画了整个进程。系统根据PCB结构中的状态值控制过程。在进程的生命期内,一个进程至少具有5种基本状态,它们是:初始态、执行状态、等待状态、就绪状态和终止状态。通过系统设计,实现进程相关数据结构的创建和查看功能;实现多种进程调度算法:先来先服务算法、优先级调度算法、时间片轮转法等;实现对执行进程的阻塞,对等待进程的唤醒等功能。进程的转换过程如下:2、计方案思想本程序用两种算法(最高优先级数优先的调度算法和先来先服务算法)对多个进程进行调度,每个进程有三个状态,初始状态为就绪状态。 最高优先级数优先的调

5、度算法中,程序的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即Pro_time-process-needtime。进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。对于遇到优先数一致的情况,采用先来先服务策略解决。 进程根据外界条件的不断变化引起状态的改变,可以利用系统时间片的大小、进程执行时间、进入主存的时间、系统内存大小、以及调度算法的选择来作为条件对进程进行调度。通过在对话框中添加按钮、文本编辑框、列表等控件,并为控件关联相应的变量和

6、消息函数,实现各个控件内部以及控件之间的协同工作,并使用定时器进行时间的设置,从而完成系统所要求的进程调度工作。Windows应用程序,操作系统,计算机硬件之间的相互关系如下: 3、程序功能模块设计(程序功能模块划分及层次等) 3.1、总体模块 3.2、部分模块 3.3、详细功能描述 根据需要设置系统内存的大小选择不同的进度调度算法进行进程调度模拟设置进程的各种属性值创建进程根据进程不同状态放在不同的位置显示进程调度过程中的动态变化情况在某一时间点击按钮进行进程调度模拟进程调度模拟过程中可以暂停调度过程,查看进程的状态变化过程通过双击状态列表中的某个进程可以查看进程的各属性值对执行进程、就绪进

7、程进行强制“阻塞”操作对等待进程进行强制“就绪”操作将没有执行完毕的进程进行强制“杀死”操作 4、程序总控流程图 优先级数调度 先来先服务 退出程序1.可强占优先调度算法实现过程流程图: 2 FCFS算法实现过程流程图: 5、函数的调用关系 设计创建进程的结构类型定义和结构变量说明struct ProcessPcb,定义PCB相关变量: ProcessPcb()next=NULL; char pro_name20; /进程的名字 int time_submit ; /提交时间,从时间的1开始计时 int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成

8、) int pro_priority ; /进程优先级 int time_start ; /开始执行的时间 int time_end ; /结束的时间 int time_wait ; /等待的时间 int pro_state ; /进程的状态 (就绪,执行,完成) int time_left ; /还需多少时间单位,初始化为所需的执行时间 int time_turn ; /周转时间 double time_aver ; /带权周转时间 创建PCB类class CpuModel,定义程序中使用的各函数: CpuModel()pcbnum=0; void cpurun(); /cpu模拟运行函数

9、bool GetPcb(); /进程输入函数 void ShowPcb(); /将输入的进程展示出来 void PriModel(); /可强占的优先进程调度模式 void FcfsModel(); /先到先服务调度模式ProcessPcb PcbList100; /按提交时间排的未就绪进程队列() 主函数调用已定义的各函数,完成进程模拟。6、测试数据及测试结果 1.开始运行,显示: 2.输入进程数,各进程属性: 关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。 3.显示各进程属性,以及关于调度算法的选择项:此处的优先级数,是用100减去执行时间。对于优先级数相同,则默认FIF

10、O。4.测试可强占的优先进程调度:一次调度完成,将计算此次运行中CPU的利用率。5.可强占的优先进程调度算法结束,回到算法选择界面: 6.先到先服务调度算法运行情况: 7.选择3,回车,退出程序。 7、设计体会及收获 这次的课程设计给我们很大的收获,使我们对操作系统的基本知识有了进一步的提高,并在实践中对各种概念有了进一步的深化,开始的时候总觉得很简单的课程设计,不过在实际的动手操作中没有想象中的那么轻松。 程序的设计思想的精巧的重要性,是不管怎么说都不为过的,好的设计可以让大家很快的明白你的思想,而且很方便的来实现它。良好的编程习惯,它可以使你的程序很方便的被别人阅读,也很方便的被更改,所以

11、可以的话,尽可能多的写出注释,没有人会闲你写的太多。尽可能多的和小组成员讨论,自己写的东西可能存在逻辑上的失误,而自己可能并不知道,或者完成了后才发现自己根本没有符合要求 。在多人一起协调工作的时候,队员的交流是非常重要的,接口的说明和思想的交流都是很关键的部分。基本的语言功底一定要扎实,通过课程设计,我们有把C+复习了一下,并编程能力也有一定得提高。从使用的角度对数据结构等课程有了更深入的认识和掌握。体验了使用MFC开发的过程,很好的巩固了从书本上学到的知识,对更深入的学习Visual C+很有帮助。尤其在编程过程中得到很多很实用的编程经验。课程设计结束了,不只学到了设计进程的创建以及状态如

12、何转换的思想,重要的是有了多人合作的经验,这是平时上课或是书本上无法获得的宝贵财富。8、参考文献王明,Linux操作系统应用教程 陕西科学技术出版社.2006.12 张丽芬,刘利雄.操作系统实验教程. 清华大学出版社.2011.2孟静,操作系统教程原理和实例分析等教育出版社.2010.6周长林,计算机操作系统教程等教育出版社.2011.4张尧学,计算机操作系统教程,清华大学出版社.2010.6任满杰,操作系统原理实用教程,电子工业出版社2010.89源代码#include #include #include #include #include using namespace std ;/进程的

13、状态#define UNREADY 0 /未就绪#define READY 1 /就绪#define EXECUTE 2 /执行#define END 3 /完成/进程的PCB结构类型定义和结构变量说明struct ProcessPcb ProcessPcb()next=NULL; char pro_name20; /进程的名字 int time_submit ; /提交时间,从时间的1开始计时 int time_exe ; /进程所需的运行时间 int pro_id ; /进程ID(系统生成) int pro_priority ; /进程优先级 int time_start ; /开始执行的

14、时间 int time_end ; /结束的时间 int time_wait ; /等待的时间 int pro_state ; /进程的状态 (就绪,执行,完成) int time_left ; /还需多少时间单位,初始化为所需的执行时间 int time_turn ; /周转时间 double time_aver ; /带权周转时间 ProcessPcb *next;/封装CPU调度与分配程序模块。进程类class CpuModelpublic: CpuModel()pcbnum=0; void cpurun(); /cpu模拟运行函数 bool GetPcb(); /进程输入函数 void

15、 ShowPcb(); /将输入的进程展示出来 void PriModel(); /可强占的优先进程调度模式 void FcfsModel(); /先到先服务调度模式private: ProcessPcb PcbList100; /按提交时间排的未就绪进程队列 int pcbnum ; /进程数量 int freetime ; /cpu空闲时间 int allturn ; /总周转时间 float allaver ; /总带权周转时间 ;#include/cpu模拟运行函数void CpuModel:cpurun() if(!GetPcb() /进程输入函数 return ; ShowPcb(

16、); /展示所需执行进程信息 int choose = 0 ; while(1) cout*请选择需要模拟的CPU调度算法!*endl ; cout* 1: 可强占的优先进程调度 *endl ; cout* 2: 先到先调度 *endl; cout* 3: 退出系统 *endl ; coutchoose ; coutendl ; switch(choose) case 1: PriModel(); /可强占的优先进程方式 break; case 2: FcfsModel(); /先到先服务调度方式 break; default:return; /结束程序 coutendl; /按进程提交时间排

17、序的比较函数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; return num;/进程输入函数bool CpuModel:GetPcb() char num10; cout * 进程调度模拟实验 *n; cout * 计算机科学与技术二班 *n; cout * 温天波 *n; coutnum; /输入进程个数 pcbnum=isnumber(num); if(pcbnu

18、m=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; return 0; coutnum; PcbListi.time_exe=isnumber(num); if(PcbListi.time_exe=0) cout*输入有错*n; return 0; PcbL

19、isti.time_left=PcbListi.time_exe; /设置剩余执行时间 PcbListi.pro_state=UNREADY; /设置状态为未就绪 PcbListi.pro_priority=100-PcbListi.time_exe; /设置优先级, / 优先级=100-执行时间 coutendl ; sort(PcbList,PcbList+pcbnum,cmp); /按提交时间排序 for(i=0;ipcbnum;i+) PcbListi.pro_id=i+1; /设置Id,根据提交时间 return 1;/展示所需执行进程信息void CpuModel:ShowPcb(

20、) 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; /head 指针不用,head-next开始为就绪队列 /模拟cpu开始工作 while(head-ne

21、xt!=NULL|pnumpcbnum) Sleep(1000); time+; /时间片为1 cout*Time: 第time秒endl; /打印 / 进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列) while(pnumpcbnum & PcbListpnum.time_submitnext=head-next; /插在head之后 head-next=pcb; /查找在time时间片应该运行的进程 if(head-next=NULL) cout 没有可运行的进程next; pcb1=head-next; /查找当前优先级最高的就绪进程 while(pcb1-next!=NUL

22、L) 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; /优先级数减3 pcb-time_left-; /剩余执行时间减去时间片1 /打印该进程信息 cout 进程编号: pro_id 进

23、程名字: pro_name 提交时间: time_submit 执行时间: time_exe n 开始时间: time_start 还剩时间: time_left 优先级数: pro_prioritytime_left=0) pcb2-next=pcb2-next-next;/将其在就绪队列中出列 pcb-time_end=time; /设置结束时间 pcb-time_turn=pcb-time_end-pcb-time_submit+1; /计算周转时间 pcb-time_aver=pcb-time_turn/(double)pcb- time_exe; /计算带权周转时间 pcb-pro_state=END; coutn进程pro_id运行结束:n

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

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