华北科技学院计算机学院综合性实验实验报告课程名称《计算机操作系统》实验学期2015至2016学年第一学期学生所在系部计算机系年级2013专业班级计科B133学生姓名谢培旗学号201307014319任课教师王祥仲实验成绩计算机学院制华北科技学院计算机学院综合性实验报告第1页《计算机操作系统》课程综合性实验报告开课实验室:基础二2015年12月4日实验题目进程调度算法模拟程序设计一、实验目的通过对进程调度算法的模拟,进一步理解进程的基本概念,加深对进程运行状态和进程调度过程、调度算法的理解。二、设备与环境1.硬件设备:PC机一台2.软件环境:安装Windows操作系统或者Linux操作系统,并安装相关的程序开发环境,如C\C++\Java等编程语言环境。三、实验内容(1)用C语言(或其它语言,如Java)编程实现对N个进程采用某种进程调度算法(如动态优先权调度算法、先来先服务算法、短进程优先算法、时间片轮转调度算法)调度执行的模拟。(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。进程已占用CPU时间CPUTIME。进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。进程状态STATE。队列指针NEXT,用来将PCB排成队列。(3)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1。进程每运行一个时间片,优先数减3。(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。华北科技学院计算机学院综合性实验报告第2页(5)分析程序运行的结果,谈一下自己的认识。四、实验结果及分析本实验设计到三个进程调度,分别是:先来先服务调度算法,非抢占式短进程调度算法,最高响应比优先调度算法。以下为本次实验结果截图及分析:程序运行界面截图:1.先来先服务调度算法华北科技学院计算机学院综合性实验报告第3页分析:当在进程调度中采用FCFS算法时,每次调度是从就绪的进程队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后,进程调度才将处理机分配给其它进程。程序计算结果如图,设有5个进程:a、b、c、d、e在不同时间到达,按其到达时间排序则为:a-b-c-d-e,即调用先来先服务算法以后进程运行的顺序是:a-b-c-d-e。2.非抢占式短进程调度算法SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行。程序计算结果如图,设有5个进程:a、b、c、d、e在不同时间到达,按其所需服务时间长短排序则为:a-b-e-c-d,即调用非抢占式短进程优先调度算法以后进程运行的顺序是:a-b-e-c-d。华北科技学院计算机学院综合性实验报告第4页3.最高响应比优先调度算法(//注:该截图一小处地方是错的)如果我们能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断滴增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:优先权=1+等待时间/要求服务时间。由上式可以看出:1.如果作业的等待时间相同,则要求服务的时间越短,其优先权越高,因而类似于SJF算法,有利于短作业。2.当要求服务时间相同时,作业的优先权又决定于其等待时间,因而该算法又类似于FCFS算法。3.对于长作业的优先级,可以随着等待时间的增加而提高,当期等待时间足够长时,也可以过得处理机。因此该算法实现了较好的折中。当然,在利用该算法时,每次要进行调度之前,都需要先做响应比的计算,显然会增加系统开销。设有5个进程:a、b、c、d、e在不同时间到达,显然a、b按顺序执行,然后计算c、d、e的优先权,计算得出优先权:cde,于是c进入进程调度,此时,d、e的等待时间延长,需重新计算d、e的优先权,计算得出优先权ed,于是e进入进程调度,最后执行d。实验体会:进程调度算法的优劣对于系统运行至关重要,进程调度影响着系统运行的速度以及系统开销。在本次实验,本人早早地开始想如何根据书本进程调度的知识敲代码,但开始做还是最近两天,总的来说比较满意,不足的地方即是运行时界面排版由于精度的问题没有更好的解决。华北科技学院计算机学院综合性实验报告第5页在实验过程中,本人重温了课本上的知识,又锻炼了实践能力。源代码:#includecstdlib#includeiostream#includeiomanipusingnamespacestd;structfcfs{//先来先服务算法从这里开始charname[10];floatarrivetime;floatservicetime;floatstarttime;floatfinishtime;floatzztime;floatdqzztime;};//定义一个结构体,里面包含的有一个进程相关的信息fcfsa[100];voidinput(fcfs*p,intN){inti;coutendl;printf(请您输入进程的名字到达时间服务时间:(例如:a0100)\n\n);for(i=0;i=N-1;i++){printf(请您输入进程%d的信息:\t,i+1);scanf(\t\t\t%s%f%f,&p[i].name,&p[i].arrivetime,&p[i].servicetime);华北科技学院计算机学院综合性实验报告第6页}}voidPrint(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN){intk;printf(\n\n调用先来先服务算法以后进程运行的顺序是:);printf(%s,p[0].name);for(k=1;kN;k++){printf(--%s,p[k].name);}coutendl;printf(\n具体进程调度信息:\n);printf(\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n);for(k=0;k=N-1;k++){printf(\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n,p[k].name,p[k].arrivetime,p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}getchar();//此处必须要有这个函数,否则就看不到显示器上面的输出,可以看到的结果只是一闪而过的一个框剪}华北科技学院计算机学院综合性实验报告第7页voidsort(fcfs*p,intN)//排序{for(inti=0;i=N-1;i++)for(intj=0;j=i;j++)if(p[i].arrivetimep[j].arrivetime){fcfstemp;temp=p[i];p[i]=p[j];p[j]=temp;}}voiddeal(fcfs*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,float&zztime,float&dqzztime,intN)//运行阶段{intk;for(k=0;k=N-1;k++){if(k==0){p[k].starttime=p[k].arrivetime;p[k].finishtime=p[k].arrivetime+p[k].servicetime;}else{p[k].starttime=p[k-1].finishtime;p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}}华北科技学院计算机学院综合性实验报告第8页for(k=0;k=N-1;k++){p[k].zztime=p[k].finishtime-p[k].arrivetime;p[k].dqzztime=p[k].zztime/p[k].servicetime;}}voidFCFS(fcfs*p,intN){floatarrivetime=0,servicetime=0,starttime=0,finishtime=0,zztime=0,dqzztime=0;sort(p,N);deal(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);Print(p,arrivetime,servicetime,starttime,finishtime,zztime,dqzztime,N);getchar();}//先来先服务算法到此结束structsjf{//最短进程优先调度算法从这里开始charname[10];floatarrivetime;//到达时间floatservicetime;//运行时间floatstarttime;//开始时间floatfinishtime;//完成时间floatzztime;floatdqzztime;};sjfa1[100];voidinput(sjf*p,intN1)//进程信息输入华北科技学院计算机学院综合性实验报告第9页{inti;coutendl;printf(请您输入进程的名字到达时间服务时间:(例如:a0100)\n);for(i=0;i=N1-1;i++){printf(请您输入进程%d的信息:\t,i+1);scanf(\t\t\t%s%f%f,&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}voidPrint(sjf*p,floatarrivetime,floatservicetime,floatstarttime,floatfinishtime,floatzztime,floatdqzztime,intN1)//最终结果输出{intk;printf(\n\t调用非抢占短作业优先调度算法以后进程的调度顺序为:);printf(%s,p[0].name);for(k=1;kN1;k++){printf(--%s,p[k].name);}coutendl;printf(\n具体进程调度信息:\n);printf(\t进程名到达时间服务时间开始时间结束时间周转时间带权周转时间\n);for(k=0;k=N1-1;k++){printf(\t%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\n,p[k].name,p[k].arrivetime,华北科技学院计算机学院综合性实验报告第10页p[k].servicetime,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].dqzztime);}getchar();}voidsort(sjf*p,intN1)//排序{for(inti=0;i=N1-1;i++)for(intj=0;j=i;j++)if(p[i].arrivetimep[j].arrivetime){sjftemp;