福建农林大学计算机与信息学院课程设计报告课程名称:操作系统实习题目:进程调度算法模拟姓名:系:计算机科学与技术系专业:计算机科学与技术年级:2012学号:指导教师:职称:副教授年月日福建农林大学计算机与信息学院计算机类课程设计结果评定目录1.本选题课程设计的目的 (4)2.本选题课程设计的要求 (4)3.本选题课程设计报告内容 (4)3.1前言 (4)3.2进程调度算法模拟的环境 (4)3.3系统技术分析 (4)3.4系统流程图及各模块 (5)3.5程序调试情况 (8)4.总结 (11)参考文献 (11)程序代码 (12)1.设计目的课程设计将课本上的理论知识和实际有机的结合起来,锻炼学生的分析系统,解决实际问题的能力。
提高学生分析系统、实践编程的能力。
2.设计要求利用学到的操作系统和编程知识,完成具有一定难度的系统分析研究或系统设计题目。
其中:专题系统理论研究应包括研究目的、目标,论点和论据以及证明推导等;分析、设计系统应包括编写、调试程序以及最后写出设计报告或系统说明文档文件,系统说明文档包括系统界面、变量说明、系统功能说明、编程算法或思路、流程图和完整程序。
具体要求如下:1、对系统进行功能模块分析、控制模块分析正确;2、系统设计要实用;3、编程简练,可用,功能全面;4、说明书、流程图要清楚。
3.设计方案3.1前言本程序包括三种算法,用C或C++语言实现,执行时在主界面选择算法(可用函数实现),进入子页面后输入进程数,(运行时间,优先数由随机函数产生),执行,显示结果。
3.2本选题设计的环境WindowsXP下的Microsoft Visual C++ 6.03.3系统技术分析(1)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
3.4系统流程图及各模块(1)先来先服务算法 FCFS先来先服务调度算法是一种最简单的调度算法,该算法既可以用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将他们调入内存,为它们分配资源、创建进程,然后放入就绪队列。
在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。
该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。
先来先服务算法流程图:(2)短进程优先算法 SPF短进程(SPF)调度算法则是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
SJ(P)F调度算法能有效地降低作业(进程)的平均等待时间,提高系统吞吐量。
该算法对长作业不利,完全未考虑作业的紧迫程度。
短进程优先算法流程图:(3)时间片轮转法 RR在时间片轮转算法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
当执行的时间片用完时,由一个计数器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能在给定的时间内响应所有用户的请求。
时间片轮转算法流程图:进程结束3.5程序调试情况1.先来先服务算法运行结果2.短进程优先算法运行结果:3.时间片轮转算法运行结果4.总结本课程设计是学习完“计算机操作系统”课程后进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深了我对操作系统基础理论和重要算法的理解。
课程设计是我们专业课程知识综合应用的实践训练,也是为我们以后的工作夯实基础。
通过改程序对操作系统的基础知识了解得更透彻了,同时对磁盘调度的四种算法——先来先服务算法,短进程优先调度算法,时间片轮转调度算法,动态优先级调度有了更深刻的理解和掌握,使我能够为进程调度选择适当的算法,提高CPU工作效率。
进行进程调度程序设计的过程中,得到老师的大力指导和同学的支持,在此向他们表示感谢。
经过自己的动手操作和同学老师的指导我成功的做出了课程设计自己感到很高兴。
在整个过程中自己也感受到了集体团结的力量,今后无论是在工作还是学习中我都会发样这种精神。
参考文献[1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月[2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月下面给出的是用C实现程序的源代码:#include<stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <windows.h>typedef struct pcb{int name;int needtime;int arrivetime;int pri;int state;int cputime;}plist;void action(plist * nowpro);void action(plist * nowpro){Sleep(1000);//将程序的执行暂停一段时间(1000毫秒)printf(" 进程 %d 正在运行",nowpro->name);nowpro->needtime--;if(nowpro->needtime==0){printf(" 进程 %d 结束\n",nowpro->name);/* nowpro->state=1; */printf("-----------------------------\n");}else{printf(" 进程 %d 剩余完成时间 %d\n",nowpro->name,nowpro->needtime);printf("-----------------------------\n");}}void creatpro(int n,plist * process ){int j;for(j=0;j<n;j++){process[j].name= j+1;process[j].needtime=rand()%10+1;process[j].arrivetime=rand()%10;process[j].pri=rand()%4;process[j].state=0;process[j].cputime=0;}}void show( int n,plist * process){int j;for (j=0 ;j<n;j++){printf(" 进程 %d\t",process[j].name);printf(" 剩余完成时间 %d\t",process[j].needtime); printf(" 到达时间 %d\t",process[j].arrivetime); printf(" 优先级 %d\t",process[j].pri);printf(" 状态 %d\t",process[j].state);printf(" cputime %d\n",process[j].cputime);}}void main(){void creatpro(int n,plist * process );void show( int n,plist * process);void fcfs(int n,plist * process);void sjf(int n,plist * process);void rr(int n,plist * pro1);int n; /*the number of process*/int k;plist process[10];printf(" 请输入进程个数(1-10)\n");scanf("%d",&n);creatpro(n,process);show(n,process);printf(" 请选择所需要的调度算法 \n");printf("1 FCFS\t 2 SJF\t 3 RR\n");scanf("%d",&k);switch(k){case 1: fcfs(n,process); break;case 2: sjf(n,process); break;case 3: rr(n,process); break;default : break;}getch();}void fcfs(int n,plist * pro1){void show( int n,plist * process);int i,j,k;int m=0;int time;plist temp;plist pro2[10];for(i=0;i<n;i++){k=0;while(pro1[k].state==1){k++;}temp=pro1[k];for(j=k+1;j<n;j++){if(temp.arrivetime>pro1[j].arrivetime&&pro1[j].state!=1) {temp=pro1[j];k=j;}}pro2[m++]=temp;pro1[k].state=1;}show(n,pro2);for(i=0;i<n;i++){while(pro2[i].needtime>0){action(&pro2[i]);}}}void sjf(int n,plist * pro1){void show( int n,plist * process);int i,j,k;int m=0;plist temp;plist pro2[10];for(i=0;i<n;i++){k=0;while(pro1[k].state==1){k++;}temp=pro1[k];for(j=k+1;j<n;j++){if(temp.needtime>pro1[j].needtime&&pro1[j].state!=1) {temp=pro1[j];k=j;}}pro2[m++]=temp;pro1[k].state=1;}show(n,pro2);for(i=0;i<n;i++){while(pro2[i].needtime>0){action(&pro2[i]);}}}void rr(int n,plist * pro1){void show( int n,plist * process);int i,j,k;int m=0;int time;plist temp;plist pro2[10];for(i=0;i<n;i++){k=0;while(pro1[k].state==1){k++;}temp=pro1[k];for(j=k+1;j<n;j++){if(temp.arrivetime>pro1[j].arrivetime&&pro1[j].state!=1){temp=pro1[j];k=j;}}pro2[m++]=temp;pro1[k].state=1;}show(n,pro2);time=pro2[0].needtime;for(i=0;i<n;i++){if(time<pro2[i].needtime){time=pro2[i].needtime;}}while(time>0){for(i=0;i<n;i++){if(pro2[i].needtime>0){action(&pro2[i]);}}time--;}}int cal(int a ,plist * pro2){int pr;if((a-pro2->arrivetime)<=0){ pr=1; }else{pr=(a-pro2->arrivetime+pro2->needtime)/pro2->needtime; }return pr;}。