1/24操作系统课程设计--进程调度子系统模拟实现一、设计内容及意义1.课程设计内容使用java语言或C++语言编程实现模拟操作系统进程调度子系统的基本功能;实现先来先服务、时间片轮转、多级反馈轮转法对进程进行的调度过程;掌握各个调度算法的特点。2.该课程设计意义理解进程调度的概念深入了解进程控制块的功能、进程的创建、删除以及进程各个状态间的转换过程从实用的角度对《数据结构》课程内容进行更深入理解和更熟练的应用进一步练习对Java及C++语言的熟练使用二、设计方案1.硬件环境PC一台2.开发语言及工具操作系统:MSwindowsXPC++版:VisualStudio2008+MFCJava版:Eclipse3.4+JavaSwing3.设计思路系统设备表用于存取调度过程中进程可申请的资源进程控制块主要负责具体进程信息的保存等待队列、就绪队列、完成队列用于保存执行过程的状态信息进程调度进程(类、线程)在就绪队列与等待队列之间进行调度主界面显示调度过程的三个队列的状态信息用户创建进程放入就绪队列等待调度三、功能模块设计1.进程状态转换等待就绪执行创建进程进程结束2/242.PCB信息主要负责保存各进程基本信息提供外部状态设置和读取接口3.系统设备类系统设备的基本信息设备状态设置、读取接口4.调度类向就绪队列添加新创建进程从就绪队列取相应进程执行将执行阻塞进程放入等待队列检测系统设备表,分配、释放设备、唤醒等待进程执行完成程序放入完成队列(仅为保存状态,非系统部分)提供获取执行状态的外部接口,即各个队列数据的获取5.视图类提供用户操作接口(调度策略选择、进程创建)显示各队列状态信息创建进程调度类线程,调用调度类的接口四、程序总控流程图1.用户接口、调度算法、进程状态转换关系示意启动进程调度进程页面1系统总体设计设置进程基本信息添加设备请求创建进程就绪队列等待队列加入就绪队列用户选择调度策略初始化系统设备表根据具体算法调度进程初始化系统创建进程调度进程初始化进程创建进程请求资源完成队列执行完成3/242.调度算法基本工作流程示意用户选择进程调度算法创建进程根据算法从就绪队列调度某一时刻需要资源从就绪队列取出执行放入等待队列Y执行完毕资源满足YY就绪队列是否有进程等待执行N初始化进程基本信息将进程放入就绪队列页面1进程调度框架五、数据结构设计1.PCB(进程基本信息)类结构ProcessPCB--------PidPnameuserNamePriotitysubtimetotalTimerunTimeDcRequestLst:int:String:String:int:int:int:int:ListDeviceReq说明4/241.pid进程ID2.pName进程名3.userName进程用户4.priority进程优先级5.subtime进程提交时间6.totalTime进程需要执行的总时间7.runtime进程已经运行时间8.dcReqlst当前进程所需要的设备请求表2.Dispatcher(进程调度进程)类结构Dispatcher-------SystimeisContentionpreLstwaitLstfinishLstexecutingsysDcLst:int:boolean:ListProcess:ListProcess:ListProcess:Process:ListProcess说明1.sysTime系统时间2.isContention当前调度是否为抢占方式3.prelst就绪队列4.waitlst等待队列5.finishlst完成队列6.executing正在执行的进程7.sysDclst系统设备表3.Device(系统设备)类结构Device------dcIddcTypedcDiscdcTimedcPiddcleftTime:int:int:String:int:int:int说明1.dcid设备标识2.dcType设备类型3.dcTime该设备一次I/O服务需要时间4.dcPid使用该设备的进程5.dcDisc设备描述6.dcLefTime设备剩余服务时间六、程序代码结构1.类层次关系5/240..10..*0..10..*0..10..*DispatcherFIFODispatcherPLevelDispatcherRRDispatcherMRDispatcherProcessPCBDeviceDeviceReq2.详细说明Dispatcher定义进程调度进程的基本信息和接口FIFODispatcher、PLevelDispatcher、RRDispatcher、MRDispatcher分别实现相应的调度算法Device为系统设备DeviceReq为进程设备请求,包括请求设备ID和时间七、代码实现分析1.算法分析(各算法过程见下流程图)设备的分配释放先来先服务优先级调度时间片轮转多级反馈轮转6/24页面1设备分配释放扫描等待队列是否得到设备取下一等待进程扫描系统设备表取相应设备为进程分配设备设备是否空闲初始化设备标识设备状态NY为下一进程分配设备扫描系统设备表设备忙碌取下一设备执行设备指令查询等待进程查找被服务进程设备指令执行完毕释放设备重置设备状态YY检查下一设备从等待队列删除该进程添加进程到就绪队列YN取下一设备NN设备分配设备释放7/24从就绪队列取下一进程放入等待队列将进程放入完成队列进程调度进程申请资源处理资源请求执行进程进程结束页面1先进先出进程调度算法处理机空转Y正确取得就绪进程YNYYNNN8/24页面1优先级进程调度算法(抢占式)从就绪队列取下一进程释放处理机放入等待队列释放处理机放入完成队列进程调度进程申请资源处理资源请求执行进程进程结束处理机空转Y正确取得就绪进程YNYYYNN放入就绪队列让出处理机就绪队列有更高优先级进程NN9/24页面1时间片轮转调度算法从就绪队列取下一进程释放处理机放入等待队列释放处理机放入完成队列进程调度进程申请资源处理资源请求执行进程时间片减1进程结束处理机空转Y正确取得就绪进程YNYYYNN放入就绪队列让出处理机时间片用完NN10/24页面1多级反馈轮转调度算法(抢占式)从就绪队列取下一进程释放处理机放入等待队列释放处理机放入完成队列进程调度进程申请资源处理资源请求执行进程时间片减1进程结束处理机空转Y正确取得就绪进程YNYYYNN进程优先级减1时间片用完NN放入就绪队列让出处理机进程优先级减1是否有更高优先级进程NY2.具体实现(代码部分有详细注释)进程的插入11/24@OverridepublicvoidaddPreProc(Processproc){//按优先级加到就绪队列this.prelst.add(proc);intloc;for(loc=prelst.size()-2;loc=0;loc--){//比proc大的元素后移一个位置Processtemp=prelst.get(loc);if(proc.Prioritytemp.Priority){prelst.set(loc+1,temp);}else{//将proc放入空闲位置prelst.set(loc+1,proc);break;}}if(loc0){prelst.set(0,proc);}}取出进程@OverridepublicProcessdelPreProc(){//取优先级最高者,即为第一个if(prelst.size()=0){returnnull;}returnthis.prelst.remove(0);//返回最小一个}先进先出算法的调度@Overridepublicvoidrun(inttime){intproctimeslice=1;//假设处理器指令周期为1个时钟周期while(time0){//处理机运行time时间if(this.executing==null){//没有进程占用处理机则空转this.executing=this.delPreProc();}else{//执行当前进程Processproc=this.executing;//下一次执行需要的设备DcRequestreq=proc.getNextReq();if(req!=null&&req.getReqtime()=proc.runtime){//进程需要请求设备,而且执行到请求时间this.addWaitProc(proc);12/24this.executing=this.delPreProc();}else{//无资源请求proc.run(proctimeslice);if(proc.isFinished()){//当前进程是已完成进程,放入完成队列,取下一进程proc.setFinishTime(Dispatcher.getBeginTime()+Dispatcher.getRunTime());//设置当前执行结束时间this.addFinishProc(proc);this.executing=this.delPreProc();}}}super.processWaitlst(proctimeslice);++Dispatcher.runTime;--time;}}优先级抢占算法的调度@Overridepublicvoidrun(inttime,booleanisContention){if(!isContention){//非抢占方式this.run(time);return;}intproctimeslice=1;//假设处理器时钟周期while(time0){//处理机运行time时间if(this.executing==null){//没有进程占用处理机则空转this.executing=this.delPreProc();}else{//执行当前进程Processproc=this.executing;//下一次执行需要的设备DcRequestreq=proc.getNextReq();if(req!=null&&req.getReqtime()=proc.runtime){//进程需要请求设备,而且执行到请求时间//放入等待队列,取下一进程this.addWaitProc(proc);this.executing=this.delPreProc();}else{//无资源请求proc.run(proctimeslice);if(proc.isFinished()){//当前进程是已完成进程,放入完成队列,取下一进程13/24proc.setFinishTime(//设置当前执行结束时间Dispatcher.getBeginTime()+Dispatcher.getRunTime());this.addFinishProc(proc);this.executing=this.delPreProc();}}if(!this.prelst.isEmpty()){//抢占Processpreproc=this.prelst.get(0);if(this.executing.Prioritypreproc.Priority){//按优先级抢占this.addPreProc(this.executing);this.executing=this.delPreProc();}}}super.processWaitlst(proctimeslice);++Dispatcher.runTime;--time;}}时间片轮转@Overridepublicvoidrun(inttime){intproctimeslice=1;//假设处理器时钟周期while(time0){//处理机运行time时间if(this.executing==null){//没有进程占用处理机则空转this.executing=this.delPreProc();}else{/