课程设计报告操作系统原理专业计算机科学与技术学生姓名班级M计算机081学号指导教师完成日期2010年1月10日1题目:进程调度的模拟实现一、设计目的本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。二、设计内容(1)概述编写并调试一个单道处理系统的作业等待模拟程序。在多道程序和多任务系统中,系统内同时处于就绪状态的进程可能有若干个。也就是说能运行的进程数大于处理机个数。为了使系统中的进程能有条不紊地工作,必须选用某种调度策略,选择一进程占有处理机。要求学生设计一个模拟处理机调度算法,以巩固和加深处理机制调度的概念。设计要求:(1)进程调度算法包括:时间片轮转法,短作业优先算法,动态优先级算法。(2)可选择进程数量。(3)本程序包括三种算法,用C++语言实现,执行时在主界面选择算法,进入子页面后输入进程数,执行,显示结果。(2)设计原理1、先来先服务算法原理:每次调度是从就绪队列中,选择一个最先进入就绪队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。特点:利于长进程,而不利于短进程。2、短作业优先服务算法原理:它是从就绪队列中选择一个估计运行时间最短的进程,将处理器分配给该进程,使之占有处理器并执行,直到该进程完成或因发生事件而阻塞,然后退出处理器,再重新调度。3、最高响应比优先算法原理:它是从就绪队列中选择一个响应比最高的进程,让其获得处理器执行,直到该进程完成或因等待事件而退出处理器为止。特点:既照顾了短进程,又考虑了进程到达的先后次序,也不会使长进程长期得不到服务,因此是一个比较全面考虑的算法,但每次进行调度时,都需要对各个进程计算响应比。所以系统开销很大,比较复杂。(3)详细设计及编码2源代码:#includeiostream#includestringusingnamespacestd;classProcess{public:stringProcessName;//进程名字intTime;//进程需要时间intleval;//进程优先级intLeftTime;//进程运行一段时间后还需要的时间};//////////////////////////////////////////////////////voidCopy(Processproc1,Processproc2);//把proc2赋值给proc1voidSort(Processpr[],intsize);//此排序后按优先级从大到小排列voidsort1(Processpr[],intsize);//此排序后按需要的cpu时间从小到大排列voidFcfs(Processpr[],intnum,intTimepice);//先来先服务算法voidTimeTurn(Processprocess[],intnum,intTimepice);//时间片轮转算法voidPriority(Processprocess[],intnum,intTimepice);//优先级算法//////////////////////////////////////////////////////////////////////////voidmain(){inta;coutendl;cout选择调度算法:endl;cout1:FCFS2:时间片轮换3:优先级调度4:最短作业优先endl;cina;constintSize=30;Processprocess[Size];intnum;intTimePice;cout输入进程个数:endl;cinnum;cout输入此进程时间片大小:endl;cinTimePice;for(inti=0;inum;i++){3stringname;intCpuTime;intLeval;cout输入第i+1个进程的名字、cpu时间和优先级:endl;cinname;cinCpuTimeLeval;process[i].ProcessName=name;process[i].Time=CpuTime;process[i].leval=Leval;coutendl;}for(intk=0;knum;k++)process[k].LeftTime=process[k].Time;//对进程剩余时间初始化cout(说明:在本程序所列进程信息中,优先级一项是指进程运行后的优先级!!);coutendl;coutendl;cout进程名字共需占用CPU时间还需要占用时间优先级状态endl;if(a==1)Fcfs(process,num,TimePice);elseif(a==2)TimeTurn(process,num,TimePice);elseif(a==3){Sort(process,num);Priority(process,num,TimePice);}else//最短作业算法,先按时间从小到到排序,再调用Fcfs算法即可{sort1(process,num);Fcfs(process,num,TimePice);}}/////////////////////////////////voidCopy(Processproc1,Processproc2)4{proc1.leval=proc2.leval;proc1.ProcessName=proc2.ProcessName;proc1.Time=proc2.Time;}/////////////////////////////////////////////voidSort(Processpr[],intsize)//以进程优先级高低排序{//直接插入排序for(inti=1;isize;i++){Processtemp;temp=pr[i];intj=i;while(j0&&temp.levalpr[j-1].leval){pr[j]=pr[j-1];j--;}pr[j]=temp;}//直接插入排序后进程按优先级从小到大排列for(intd=size-1;dsize/2;d--){Processtemp;temp=pr[d];pr[d]=pr[size-d-1];pr[size-d-1]=temp;}//此排序后按优先级从大到小排列}///////////////////////////////////////////////////voidsort1(Processpr[],intsize)//以进程时间从低到高排序{//直接插入排序for(inti=1;isize;i++){Processtemp;temp=pr[i];intj=i;while(j0&&temp.Timepr[j-1].Time){pr[j]=pr[j-1];5j--;}pr[j]=temp;}}////////////////////////////////////////先来先服务算法的实现/////////////////////////////////voidFcfs(Processprocess[],intnum,intTimepice){//process[]是输入的进程,num是进程的数目,Timepice是时间片大小//while(true){if(num==0){cout所有进程都已经执行完毕!endl;exit(1);}if(process[0].LeftTime==0){cout进程process[0].ProcessName已经执行完毕!endl;for(inti=0;inum;i++)process[i]=process[i+1];num--;}elseif(process[num-1].LeftTime==0){cout进程process[num-1].ProcessName已经执行完毕!endl;num--;}else{coutendl;//输出正在运行的进程process[0].LeftTime=process[0].LeftTime-Timepice;process[0].leval=process[0].leval-1;coutprocess[0].ProcessNameprocess[0].Time;6coutprocess[0].LeftTimeprocess[0].leval运行;coutendl;for(ints=1;snum;s++){coutprocess[s].ProcessNameprocess[s].Time;coutprocess[s].LeftTimeprocess[s].leval等待endl;;}}//elsecoutendl;system(pause);coutendl;}//while}//////////////////////////////////////////////////////时间片轮转调度算法实现//////////////////////////////////////////////voidTimeTurn(Processprocess[],intnum,intTimepice){while(true){if(num==0){cout所有进程都已经执行完毕!endl;exit(1);}if(process[0].LeftTime==0){cout进程process[0].ProcessName已经执行完毕!endl;for(inti=0;inum;i++)process[i]=process[i+1];num--;}if(process[num-1].LeftTime==0){7cout进程process[num-1].ProcessName已经执行完毕!endl;num--;}elseif(process[0].LeftTime0){coutendl;//输出正在运行的进程process[0].LeftTime=process[0].LeftTime-Timepice;process[0].leval=process[0].leval-1;coutprocess[0].ProcessNameprocess[0].Time;coutprocess[0].LeftTimeprocess[0].leval运行;coutendl;for(ints=1;snum;s++){coutprocess[s].ProcessNameprocess[s].Time;coutprocess[s].LeftTimeprocess[s].leval;if(s==1)cout就绪endl;elsecout等待endl;}Processtemp;temp=process[0];for(intj=0;jnum;j++)process[j]=process[j+1];process[num-1]=temp;}//elsecoutendl;system(pause);coutendl;}//while}8///////////////////////////////////////////////////////优先级调度算法的实现////////////////////////////////////////////////voidPriority(Processprocess[],intnum,intTimepice){whi