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

下载本文档

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

文档简介

1、 操作系统课程设计 进程调度模拟班级: 计算机科学与技术三班学号: 200805030312 1、 实验要求 编写一个进程调度程序,允许多个进程共行的进程调度程序。 采用最高优先级数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法。 每个进程用一个进程控制块( pcb)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用cpu时间、进程状态等等。 进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。 进程的运行时间以时间片为单位进行计算。 每个进程的状态可以是就绪 w(wait)、运行r(run)、或

2、完成f(finish)三种状态之一。 就绪进程获得 cpu后都只能运行一个时间片。用已占用cpu时间加1来表示。 如果运行一个时间片后,进程的已占用 cpu时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用cpu时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待cpu。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的 pcb,以便进行检查。 重复以上过程,直到所有进程都完成为止。2、 设计思路 本程序用两种算法(最高优先级数优先的调度算法和先来先服务算法)对多个进程进行调度,每个进程有三

3、个状态,初始状态为就绪状态。 最高优先级数优先的调度算法中,程序的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。在优先级数优先的调度算法中,优先级数的值设计为100与运行时间的差值,即pro_time-process-needtime。进程每执行一次,优先数减3,cpu时间片数加1,进程还需要的时间片数减1。对于遇到优先数一致的情况,采用先来先服务策略解决。 三、详细设计 设计创建进程的结构类型定义和结构变量说明struct processpcb,定义pcb相关变量: processpcb()next=null;char pro_na

4、me20; /进程的名字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_aver ; /

5、带权周转时间 创建pcb类class cpumodel,定义程序中使用的各函数: cpumodel()pcbnum=0; void cpurun(); /cpu模拟运行函数bool getpcb(); /进程输入函数void showpcb(); /将输入的进程展示出来void primodel(); /可强占的优先进程调度模式void fcfsmodel(); /先到先服务调度模式processpcb pcblist100;/按提交时间排的未就绪进程队列() 主函数调用已定义的各函数,完成进程模拟。结构框图:主函数开始,显示开始信息输入进程数,以及各个进程属性 输出进程列表以及相关属性选择进

6、程模拟算法 优先级数调度 先来先服务 退出程序调用函数,输出运行过程调用函数,输出运行过程退出程序输出显示运行结果,输出重新运行选择信息流程图: 1.可强占优先调度算法实现过程流程图: fcfs算法实现过程流程图:4、 测试结果及分析 1.开始运行,显示: 2.输入进程数,各进程属性: 关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。 3.显示各进程属性,以及关于调度算法的选择项:此处的优先级数,是用100减去执行时间。对于优先级数相同,则默认fifo。4.测试可强占的优先进程调度:一次调度完成,将计算此次运行中cpu的利用率。5. 可强占的优先进程调度算法结束,回到算法选择界

7、面: 6. 先到先服务调度算法运行情况: 7. 选择3,回车,退出程序。6、 设计心得 类与结构体的设计创建遇到盲点,一部分知识很少用到,忘记了,经过查阅,复习了遗忘的知识点。 循环的嵌套,通过查阅,编程,重新熟悉温习了关于各种循环的嵌套实现。能较好的运用嵌套。 通过使用几种算法模拟进程的调度,更好理解了计算机中各进程间的协调正常运行,也一定程度上巩固了操作系统知识,融汇了一些以前不甚理解的操作系统知识。附录: 程序源代码以及注释 /进程pcb类和模拟cpu的进程类的声明#include #include #include #include #include using namespace s

8、td ; /进程的状态#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_star

9、t ; /开始执行的时间 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(); /

10、进程输入函数 void 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

11、 ; showpcb(); /展示所需执行进程信息 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

12、; /按进程提交时间排序的比较函数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(nu

13、m); if(pcbnum=0) cout*输入有错*n;return 0; int i; for(i=0;ipcbnum;i+)/输入进程信息 cout*请依次输入第i+1个进程的信息*endl ; coutpcbl_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; re

14、turn 0; pcblisti.time_left=pcblisti.time_exe; /设置剩余执行时间 pcbl_state=unready; /设置状态为未就绪 pcbl_priority=100-pcblisti.time_exe; /设置优先级, 优先级=100-执行时间 coutendl ; sort(pcblist,pcblist+pcbnum,cmp); /按提交时间排序 for(i=0;ipcbnum;i+) pcbl_id=i+1; /设置id,根据提交时间 return 1; /展示所需执行进程信息void cpumod

15、el:showpcb() int i; coutn*所需执行的进程信息如下*n; for(i=0;ipcbnum;i+) cout 进程编号: pcbl_id 进程名字: pcbl_name 提交时间: pcblisti.time_submit 执行时间: pcblisti.time_exe 优先级数: pcbl_priorityendl ; coutendl; /可强占的优先进程调度模式void cpumodel:primodel() coutnext=null; /head 指针不用,head-next开始为就绪队列 /模拟cpu开始工作 w

16、hile(head-next!=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(pc

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

18、编号: pro_id 进程名字: 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; /计算带权周转

19、时间 pcb-pro_state=end; coutn进程pro_id运行结束:n进程名字: pro_name 提交时间: time_submit 执行时间: time_exe 开始时间: time_start 结束时间: time_endn周转时间: time_turn 带权周转时间: time_averendl ; /模拟cpu工作结束 coutn 所有进程运行完毕!endl; double c=(time-freetime)/(double)time*100; coutn cpu利用率:c%endl; /可强占的优先进程调度模式结束 /先到先服务调度模式void cpumodel:fcf

20、smodel() cout*先到先服务进程调度过程如下*n; freetime=0; /初始化系统空闲时间为0 int time=0; /时间 int pnum=0; /已就绪进程数目 processpcb que100; /就绪队列 int quef=0,quee=0; /就绪队列的头指针和尾指针/模拟cpu开始工作 while(quefquee|pnumpcbnum) sleep(1000); time+; /时间片为1 cout*time: 第time秒endl; /打印 /进程就绪(查看未就绪的进程中在该时间片是否可以进入就绪队列) while(pnumpcbnum & pcblistpnum.time_submit=time) quequee+=pcblistpnum+; /查找time时间片的运行进程 if(quef=quee) cout 没有可运行的进程endl; freetime+; else /运行进程 if(quequef.time_left=quequef.time_exe) /该进程是否已开始 quequef.time_start=time; /设置开始时间 _state=execute; /设置状态为执行 quequef.time_left-; /剩余执行时间减去时间片1 /打印进程信息 cout进程编号: quequ

温馨提示

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

评论

0/150

提交评论