1、衡阳师范学院计算机操作系统课程设计题 目: 进程调度设计 班 级: 计算机系0901班 学 号: 作者姓名: 指导老师: 年 12 月 10 日目 录1.需求分析- 1 -1.1设计目标- 1 -1.2设计要求- 1 -2概要设计- 1 -3.关键数据结构- 2 -4. 程序清单- 2 -4.1具体设计- 2 -4.2调试和分析- 8 -4.3运行结果- 8 -5用户手册- 10 -5.1 运行环境- 10 -5.2 实施文件- 10 -5.3 用户使用说明- 10 -6.参考文件- 10 -7心得体会- 10 -8小组组员任务分配- 11 -1.需求分析1.1设计目标 经过优先权和轮转调度算
2、法模拟加深对进程概念和进程调度过程了解,掌握进程状态之间切换,同时掌握进程调度算法实现方法和技巧。1.2设计要求 (1)设计进程控制块PCB表结构,分别适适用于优先数调度算法和循环轮转调度算 法。 (2)建立进程就绪队列。对两种不一样算法编制入链子程序。(3)编制两种进程调度算法:1)优先数调度;2)循环轮转调度2概要设计1.1设计内容 1.用语言来实现对N个进程采取不一样调度算法进程调度。 2.每个用来标识进程进程控制块PCB用结构来描述,包含一下字段: (1)进程优先数ID,其中0为闲逛进程,用户进程表示数为1,2,3等。 (2)进程优先级Priority,闲逛进程(idle)优先级为0,
3、用户进程优先级大yu0,且随机产生,优先数越大,优先级越高。 (3)进程占用CPU时间CPUtime,进程每运行一次,累计值等于4. (4)进程总共需要运行时间Alltime,利用随机函数产生。 (5)进程状态,0:就绪态;1:运行态;2:阻塞态。 (6)队列指针next,用来讲多个进程控制块PCB连接位队列。 3.优先数改变标准 (1)进程在就绪队列中每呆一个时间片,优先数增加1。 (2)进程每运行一个时间片,优先数减3. 4.在调度前系统中拥有进程数PCB_number由键盘输入,经初始化后,全部进程块PCB链接成就绪队列。2.2实现概要(1)本程序用两种算法对五个进程进行调度,每个进程可
4、有三个状态,并假设初始状态为就绪状态(2)为了便于处理,程序中某进程运行时间以时间片为单位计算。各进程优先数或轮转时间数和进程需运行时间片数初始值均由用户给定。(3)在优先算法中,优先数值为50和运行时间差值,即P TIME-process-needtime。进程每实施一次,优先数减3,CPU时间片数加1,进程还需要时间片数减1。在轮转算法中,采取固定时间片(即:每实施一次进程,该进程实施时间片数为已实施了2个单位),这时,CPU时间片数加2,进程还需要时间片数减2 ,并排列到就绪队列尾上。(4)对于碰到优先数一致情况,采取FIFO策略处理。3.关键数据结构1. struct pcb ( )
5、定义pcb2. Void display ( ) 显示结果信息函数3. Int process finish(pcb *q) 进程完成表示4. Void displa_round ( ) 显示循环轮转调度算法运行结果5. Priority_call ( ) 优先数调度算法6. Void cpu_round ( ) 处理器工作状态4. 程序清单4.1具体设计#include#include#include#include#include#include#define P_NUM 5#define P_TIME 50enum state /进程状态ready,execute,block,finis
6、h;struct pcb /定义PCB块char name4;int priority;int cputime;int needtime;int count;int round;state process;pcb * next;pcb * get_process();pcb * get_process()pcb *q;pcb *t;pcb *p;int i=0;coutinput name and timeendl;while(iq-name ;cinq-needtime ;q-cputime=0;q-priority=P_TIME-q-needtime;q-process=ready;q-n
7、ext=NULL;if(i=0)p=q;t=q;elset-next=q;/t=q;i+;return p;void display(pcb *p) /现实结果信息函数coutname cputime needtime priority stateendl;while(p)coutname cputime needtime priorityprocess)caseready:coutreadyendl;break;caseexecute:coutexecuteendl;break;caseblock:coutblockendl;break;casefinish:coutfinishnext;i
8、nt process_finish(pcb *q) /进程完成标示int b1=1;while(b1&q)b1=b1&q-needtime=0;q=q-next;return b1;void cpuexe(pcb *q)pcb *t=q;int tp=0;while(q)if(q-process!=finish)q-process=ready;if(q-needtime=0)q-process=finish;if(tppriority&q-process!=finish)tp=q-priority;t=q;q=q-next;if(t-needtime!=0)t-priority-=3;t-ne
9、edtime-;t-process=execute;t-cputime+;void priority_cal() /优先数调度算法pcb * p;system(cls); /清屏p=get_process();int cpu=0;system(cls);while(!process_finish(p)cpu+;coutcputime:cpuendl;cpuexe(p);display(p);/Sleep(100);getch(); /压任意键继续system(cls);printf(All processes have finished,press any key to exit);getch
10、();void display_menu() /选择调度算法coutCHOOSE THE ALGORITHM:endl;cout1 PRIORITYendl;cout2 ROUNDROBINendl;cout3 EXITendl;pcb * get_process_round()pcb *q;pcb *t;pcb *p;int i=0;coutinput name and timeendl;while(iq-name;cinq-needtime;q-cputime=0;q-round=0;q-count=0;q-process=ready;q-next=NULL;if(i=0)p=q;t=q;
11、elset-next=q;t=q;i+;return p;void cpu_round(pcb *q) /处理器工作状态q-cputime+=2;q-needtime-=2;if(q-needtimeneedtime=0;q-count+;q-round+;q-process=execute;pcb * get_next(pcb *k,pcb *head)pcb *t;t=k;dot=t-next;while(t&t-process=finish);if(t=NULL)t=head;while(t-next!=k&t-process=finish)t=t-next;return t;void
12、set_state(pcb *p)while(p)if(p-needtime=0)p-process=finish;if(p-process=execute)p-process=ready;p=p-next;void display_round(pcb *p)coutNAME CPUTIME NEEDTIME COUNT ROUND STATEendl;while(p) coutname cputime needtime count roundprocess)caseready:coutreadyendl;break;caseexecute:coutexecuteendl;break;case
13、finish:coutfinishnext;void round_cal() /循环轮转调度pcb *p;pcb *r;system(cls);p=get_process_round();int cpu=0;system(cls);r=p;while(!process_finish(p)cpu+=2;cpu_round(r);r=get_next(r,p);coutcpu cpuendl;display_round(p);set_state(p);/Sleep(100);getch();system(cls);void main()display_menu();int k;scanf(%d,&
14、k);switch(k)case 1:priority_cal();break;case 2:round_cal();break;case 3:break;display_menu();scanf(%d,&k);42调试和分析(1) 为了更清楚地显示调度过程及结果,采取了c+中sleep函数,让程序暂缓实施,结果后调度system(“els”)命令清屏,以免和之前结果混淆,影响观察效果。(2) 在试验时,将五个进程状态调度次序搞反,影响了试验结果,经温习书本知识,重新编写代码,最终得以实现。4.3运行结果5用户手册5.1 运行环境操作系统:Windows XP 应用软件:Microsoft V
15、isual C+6.05.2 实施文件进程调度算法.exe5.3 用户使用说明运行程序以后,得到以下提醒:CHOOSE THE ALGORITHM:PRIOPITYROUNDOBINEXIT其中选1为优先调度算法,选2为循环轮转算法,输入1或2按确定键以后,出现以下提醒:Inpur name and time 在此将试验测试数据输入,确定后即可演示,为了清楚地观察数据结果, 每次调用以后按任意键继续下一时间片调度,直到结束。6.参考文件操作系统试验教程,张丽芬、刘利雄、王全玉等,清华大学出版社。操作系统原理和实践教程周湘贞、曾宪权编,清华大学出版社。Windows操作系统关键编程试验教程,宋晓
16、宇,中国铁道出版社。7心得体会此次课程设计快结束时,我们交流了各自感受,得到体会以下: 一开始听到要课程设计时,我们全部不清楚操作系统编程要怎么设计,然而在仔细阅读书本和试验说明后,发觉只要搞清楚了优先级数调度实现原理后其实并不和我们起初认为那么困难,用优先队列就能够了。这次课程设计最关键是使我们知道了理论和实际相结合是很关键,只有理论知识是远远不够,只有把所学理论知识和实践相结合起来,从理论中得出结论,才能提升自己实际动手能力和独立思索能力。这课程设计,难免会碰到过多种多样问题,即使基础实现了试验要求,不过程序仍然还存在一定问题,在设计过程中碰到问题,我们将会在以后想措施改善。最终,我们在设计过程中发觉了自己不足之处。对部分前面学过知识了解得不够深刻,掌握得不够牢靠,经过这次课程设计以后,我们把前面所学过知识又重新温故了一遍。