1、操作系统课程20162017 年度 第 1 学期实验题目:进程调度院系: 计算机学院班级: 140801学号: 3114002472姓名: 黄凯鑫五邑大学实验报告 任课教师: 白明 成绩评定:实验二题目:进程调度完成日期:2016 年 12 月 11 日1、实验目的(1)设计一个有 n 个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用 CPU 的时间以及进程的状态等,且可按调度算法的不同而增删。(2)调度程序应包含 23 种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。(3)系统应能显示
2、或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程2、实验内容(1)编制和调试示例给出的进程调度程序,并使其投入运行。(2)自行设计或改写一个进程调度程序,在相应机器上调试和运行该程序,其功能应该不亚于示例。(3)直观地评测各种调度算法的性能。3、算法设计算法:(1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度
3、就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。(2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置) 。每过一个时间片,运行进程占用处理机的时间片数加 1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。实验源代码:#include #include #incl
4、ude #include #include #include enum state /进程的状态Ready,Working,Finish;struct pcb /PCB 数据结构int pid;int priority;int cputime;int needtime;int round;state process;pcb *next;int timepiece;pcb *get_process() /优先数算法-输入进程个数int proc;pcb *q;pcb *t;pcb *p;int i=0;cout proc;while (proc10)cout proc;/cout pid=ran
5、d()%10000;q-needtime=rand()%10+1;q-cputime=0;q-priority=rand()%100;q-process=Ready;q-next=NULL; /利用随机数生成进程信息if (i=0)p=q;t=q;elset-next=q;t=q; /尾插法建立 PCB 节点i+; /whilereturn p;void display(pcb *p) /优先数算法结果输出coutpid;coutcputime;coutneedtime;coutneedtime=0)coutpriority;coutprocess)case Ready:coutWorking
6、next;int process_finish(pcb *q) /判断是否所有进程都已完成,是则返回 1int bl=1;while(blq=q-next;return bl;void cpuexe(pcb *q) /优先数算法模拟进程执行函数pcb *t=q;int tp=-1;while(q)if (q-process!=Finish) /未完成的进程置 Ready,完成的进程置 Finishq-process=Ready;if(q-needtime=0)q-process=Finish;if(tppriorityt=q;q=q-next;if(t-needtime!=0) /修改正在执行
7、的进程的信息,并置其状态为 Workingt-priority-=3;if(t-prioritypriority=0;t-needtime-;t-process=Working;t-cputime+;void priority_cal() /优先数算法主控函数pcb *p;system(“cls“);p=get_process();int cpu=0;char key;system(“cls“);coutproc;while(proc10)coutproc;couttimepiece;while(timepiece5)couttimepiece;/coutpid=rand()%10000;q-
8、needtime=rand()%10+1;q-cputime=0;q-round=0;q-process=Ready;q-next=NULL;if (i=0) /尾插法建立 PCB 节点p=q;t=q;elset-next=q;t=q;i+; /whilereturn p;void cpu_round(pcb *p,pcb *q) /时间片算法模拟进程执行函数while(p)if (p-needtime=0) /完成的进程置 Finish,其它置 Readyp-process=Finish;if (p-process=Working)p-process=Ready;p=p-next;q-cpu
9、time+=timepiece; /修改正在执行进程的信息,并置其状态为Workingq-needtime-=timepiece;if(q-needtimeneedtime=0;q-round+;q-process=Working;pcb *get_next(pcb *k,pcb *head) /得到下一个应执行的进程pcb *t;t=k;dot=t-next;while (t if(t=NULL)t=head;while (t!=k return t;void display_round(pcb *p) /时间片算法输出结果coutpid;coutcputime;coutneedtime;c
10、outround;coutprocess)case Ready:coutWorkingnext;void round_cal()pcb * p;pcb * r;system(“cls“);p=get_process_round();int cpu=0;char key;system(“cls“);cout key;switch(key)case 1:priority_cal();break;case 2:round_cal();break;case 3:exit(0);return 0;4、运行与测试P 算法:输入进程数 4 以后,由 srand 函数随机给出各个进程的 needtime 和p
11、riority。之后寻找 priority 最大的优先做,做的过程就是将cputime=cputime+1,needtime=needtime-1 做完之后将 priority=priority-3,再次开始寻找新的高优先级进程。RR 算法:在输入了进程数 3,时间片大小 3 之后,由 srand()函数给出每个函数的needtime。然后从位置靠前的进程开始,工作 3 个单位时间的 cputime,之后cputime=cputime+3,needtime=needtime-3,若 needtime 小于 3,则置0.,round=round+1.由于同一个时间片只能分配给一个进程,不能分割,
12、因此每个 cputime 总是时间片大小的整数倍。5、总结与心得这个实验在编程上的要求很高,由于在数据结构语法上的不扎实,在实现的时候出处碰壁。在老师给的参考的帮助下,完成了这个实验。在实现的过程中,对于书上概念的理解更加深入。例如 pcb 在内存中利用链表的数据结构链接,pcb 中也有各种进程相关的信息。在模拟真机进程调度的同时,对每一个进程的每一步变化都很清晰。在比较这两个算法时,如果时间片过大,就会浪费时间 cpu 时间(因为在进程的最后可能只需要时间片的前面一小部分) ,造成资源浪费。在 P 算法中,优先级每次减少的数也很关键,若是过小了,不能达到照顾低优先级的小进程的作用,若是过大了,优先级这个属性的作用就不明显了。具体的取值还要参考优先数的大小和进程 needtime 的大小。