操作系统课程设计进程调度模拟.doc

上传人:仙人指路1688 文档编号:4079702 上传时间:2023-04-03 格式:DOC 页数:14 大小:235.50KB
返回 下载 相关 举报
操作系统课程设计进程调度模拟.doc_第1页
第1页 / 共14页
操作系统课程设计进程调度模拟.doc_第2页
第2页 / 共14页
操作系统课程设计进程调度模拟.doc_第3页
第3页 / 共14页
操作系统课程设计进程调度模拟.doc_第4页
第4页 / 共14页
操作系统课程设计进程调度模拟.doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《操作系统课程设计进程调度模拟.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计进程调度模拟.doc(14页珍藏版)》请在三一办公上搜索。

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

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

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

4、的名字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算法实现过程流程图:四、 测试结果及分析 1.开始运行,显示: 2.输入进程数,各进程属性: 关于提交时间执行时间等,将检测输入是否数字,不是数字即退出程序。 3.显示各进程属性,以及关于调度算法的选择项:此处的优先级数,是用100减去执行时间。对于优先级数相同,则默认FIFO。4.测试可强占的优先进程调度:一次调度完成,将计算此次运行中CPU的利用率。5. 可强占的优先进程调度算法结束,回到算法选择界面: 6. 先到先

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

8、状态#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 ; /开始执行

9、的时间 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(); /进程输入函数 vo

10、id 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 ; ShowPc

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

13、bnum=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; P

14、cbListi.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:ShowPc

15、b() 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

16、-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(pcb1-next!=

17、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 进程编号: pro_i

18、d 进程名字: 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-pr

19、o_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:FcfsModel()

20、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

21、_submit=time) quequee+=PcbListpnum+; /查找time时间片的运行进程 if(quef=quee) cout 没有可运行的进程endl; freetime+; else /运行进程 if(quequef.time_left=quequef.time_exe) /该进程是否已开始 quequef.time_start=time; /设置开始时间 quequef.pro_state=EXECUTE; /设置状态为执行 quequef.time_left-; /剩余执行时间减去时间片1 /打印进程信息 cout进程编号: quequef.pro_id 进程名字: q

22、uequef.pro_name 提交时间: quequef.time_submit 执行时间: quequef.time_exe n开始时间: quequef.time_start 还剩时间: quequef.time_leftendl ; /该进程是否执行结束 if(quequef.time_left=0) quequef.time_end=time; quequef.time_turn= quequef.time_end-quequef.time_submit+1; quequef.time_aver= quequef.time_turn/(double)quequef.time_exe;

23、 quequef.pro_state=END; coutn进程quequef.pro_id运行结束:n进程名字: quequef.pro_name 提交时间: quequef.time_submit 执行时间: quequef.time_exe 开始时间: quequef.time_start 结束时间: quequef.time_endn周转时间: quequef.time_turn 带权周转: quequef.time_averendl ; quef+; /pcb出队列 / CPU模拟结束 coutn所有进程运行完毕!endl; double c=(time-freetime)/(double)time*100; coutncpu利用率:c%endl;int main() CpuModel cpu; cpu.cpurun(); return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号