模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)_第1页
模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)_第2页
模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)_第3页
模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)_第4页
模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

模拟进程调度功能的设计与实现操作系统课程设计(JAVA版本)

操作系统课程设计

--进程调度⼦系统模拟实现

⼀、设计内容及意义

1.课程设计内容

使⽤java语⾔或C++语⾔编程实现模拟操作系统进程调度⼦系统的基本

功能;实现先来先服务、时间⽚轮转、多级反馈轮转法对进程进⾏的调

度过程;掌握各个调度算法的特点。

2.该课程设计意义

理解进程调度的概念

深⼊了解进程控制块的功能、进程的创建、删除以及进程各个状态间的转换过程

从实⽤的⾓度对《数据结构》课程内容进⾏更深⼊理解和更熟练的应⽤

进⼀步练习对Java及C++语⾔的熟练使⽤

⼆、设计⽅案

1.硬件环境

PC⼀台

2.开发语⾔及⼯具

操作系统:MSwindowsXP

C++版:VisualStudio2008+MFC

Java版:Eclipse3.4+JavaSwing

3.设计思路

系统设备表⽤于存取调度过程中进程可申请的资源

进程控制块主要负责具体进程信息的保存

等待队列、就绪队列、完成队列⽤于保存执⾏过程的状态信息

进程调度进程(类、线程)在就绪队列与等待队列之间进⾏调度

主界⾯显⽰调度过程的三个队列的状态信息

⽤户创建进程放⼊就绪队列等待调度

三、功能模块设计

1.进程状态转换

2.PCB信息

主要负责保存各进程基本信息

提供外部状态设置和读取接⼝

3.系统设备类

系统设备的基本信息

设备状态设置、读取接⼝

4.调度类

向就绪队列添加新创建进程

从就绪队列取相应进程执⾏

将执⾏阻塞进程放⼊等待队列

检测系统设备表,分配、释放设备、唤醒等待进程

执⾏完成程序放⼊完成队列(仅为保存状态,⾮系统部分)

提供获取执⾏状态的外部接⼝,即各个队列数据的获取

5.视图类

提供⽤户操作接⼝(调度策略选择、进程创建)

显⽰各队列状态信息

创建进程调度类线程,调⽤调度类的接⼝

四、程序总控流程图

1.⽤户接⼝、调度算法、进程状态转换关系⽰意

系统总体设计

页1

2.调度算法基本⼯作流程⽰意

页⾯

1

进程调度框架

五、数据结构设计

1.PCB(进程基本信息)

类结构

说明

1.pid进程ID

2.pName进程名

/doc/63393269b84ae45c3b358c30.htmlerName进程⽤户

4.priority进程优先级

5.subtime进程提交时间

6.totalTime进程需要执⾏的总时间

7.runtime进程已经运⾏时间

8.dcReqlst当前进程所需要的设备请求表

2.Dispatcher(进程调度进程)

类结构

说明

1.sysTime系统时间

2.isContention当前调度是否为抢占⽅式

3.prelst就绪队列

4.waitlst等待队列

5.finishlst完成队列

6.executing正在执⾏的进程

7.sysDclst系统设备表

3.Device(系统设备)

说明

1.dcid设备标识

2.dcType设备类型

3.dcTime该设备⼀次I/O服务需要时间

4.dcPid使⽤该设备的进程

5.dcDisc设备描述

6.dcLefTime设备剩余服务时间

六、程序代码结构

1.类层次关系

2.详细说明

Dispatcher定义进程调度进程的基本信息和接⼝

FIFODispatcher、PLevelDispatcher、RRDispatcher、MRDispatcher分别实现相应的调度算法

Device为系统设备

DeviceReq为进程设备请求,包括请求设备ID和时间

七、代码实现分析

1.算法分析(各算法过程见下流程图)

设备的分配释放

先来先服务

优先级调度

时间⽚轮转

多级反馈轮转

设备分配释放

页1

先进先出进程调度算法

页1

优先级进程调度算法(抢占式)

页1

时间⽚轮转调度算法

页1

多级反馈轮转调度算法(抢占式)

页1

2.具体实现(代码部分有详细注释)

进程的插⼊

@Override

publicvoidaddPreProc(Processproc){

//按优先级加到就绪队列

this.prelst.add(proc);

intloc;

for(loc=prelst.size()-2;loc>=0;loc--){

//⽐proc⼤的元素后移⼀个位置

Processtemp=prelst.get(loc);

if(proc.Priority

prelst.set(loc+1,temp);

}

else{//将proc放⼊空闲位置

prelst.set(loc+1,proc);

break;

}

}

if(loc<0){

prelst.set(0,proc);

}

}

取出进程

@Override

publicProcessdelPreProc(){

//取优先级最⾼者,即为第⼀个

if(prelst.size()<=0){

returnnull;

}

returnthis.prelst.remove(0);//返回最⼩⼀个}

先进先出算法的调度

@Override

publicvoidrun(inttime){

intproctimeslice=1;//假设处理器指令周期为1个时钟周期

while(time>0){//处理机运⾏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()){

//当前进程是已完成进程,放⼊完成队列,取下⼀进程

proc.setFinishTime(

Dispatcher.getBeginTime()

+Dispatcher.getRunTime());

//设置当前执⾏结束时间

this.addFinishProc(proc);

this.executing=this.delPreProc();

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

优先级抢占算法的调度

@Override

publicvoidrun(inttime,booleanisContention){

if(!isContention){//⾮抢占⽅式

this.run(time);

return;

}

intproctimeslice=1;//假设处理器时钟周期

while(time>0){//处理机运⾏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()){

//当前进程是已完成进程,放⼊完成队列,取下⼀进程

proc.setFinishTime(//设置当前执⾏结束时间

Dispatcher.getBeginTime()+

Dispatcher.getRunTime());

this.addFinishProc(proc);

this.executing=this.delPreProc();

}

}

if(!this.prelst.isEmpty()){//抢占

Processpreproc=this.prelst.get(0);

if(this.executing.Priority>

preproc.Priority){//按优先级抢占

this.addPreProc(this.executing);

this.executing=this.delPreProc();

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

时间⽚轮转

@Override

publicvoidrun(inttime){

intproctimeslice=1;//假设处理器时钟周期

while(time>0){//处理机运⾏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()){

//当前进程是已完成进程,放⼊完成队列,取下⼀进程

proc.setFinishTime(//设置当前执⾏结束时间

Dispatcher.getBeginTime()+

Dispatcher.getRunTime());

this.addFinishProc(proc);

this.executing=this.delPreProc();

}else{

//如果当前时间⽚没有执⾏完,则从就绪队列头移到队列尾部

this.addPreProc(this.executing);

//当前执⾏进程放⼊就绪队列

this.executing=this.delPreProc();

//从就绪队列取下⼀个进程占⽤cpu

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

多级反馈轮转抢占⽅式

@Override

publicvoidrun(inttime,booleanisContention){

intproctimeslice=1;//假设处理器时钟周期

while(true){

--time;

if(this.executing==null){//没有进程占⽤处理机则空转

this.executing=this.delPreProc();

if(this.executing!=null){//每调度⼀次重新计算时间⽚

time=this.executing.getPriority()*3+1;

}

break;

}

else{//执⾏当前进程

Processproc=this.executing;

//下⼀次执⾏需要的设备

DcRequestreq=proc.getNextReq();

if(req!=null&&

req.getReqtime()<=proc.runtime){

//进程需要请求设备,⽽且执⾏到请求时间

//TODO放⼊等待队列,取下⼀进程

this.addWaitProc(proc);

this.executing=this.delPreProc();

break;//时间⽚未完,设备请求,重新调度

}else{//⽆资源请求

proc.run(proctimeslice);

if(proc.isFinished()){

//当前进程是已完成进程,放⼊完成队列,取下⼀进程

proc.setFinishTime(//设置当前执⾏结束时间

Dispatcher.getBeginTime()+

Dispatcher.getRunTime());

this.addFinishProc(proc);

this.executing=this.delPreProc();

break;//时间⽚

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论