模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)_第1頁(yè)
模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)_第2頁(yè)
模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)_第3頁(yè)
模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)_第4頁(yè)
模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

模擬進(jìn)程調(diào)度功能的設(shè)計(jì)與實(shí)現(xiàn)操作系統(tǒng)課程設(shè)計(jì)(JAVA版本)

操作系統(tǒng)課程設(shè)計(jì)

--進(jìn)程調(diào)度?系統(tǒng)模擬實(shí)現(xiàn)

?、設(shè)計(jì)內(nèi)容及意義

1.課程設(shè)計(jì)內(nèi)容

使?java語(yǔ)?或C++語(yǔ)?編程實(shí)現(xiàn)模擬操作系統(tǒng)進(jìn)程調(diào)度?系統(tǒng)的基本

功能;實(shí)現(xiàn)先來(lái)先服務(wù)、時(shí)間?輪轉(zhuǎn)、多級(jí)反饋輪轉(zhuǎn)法對(duì)進(jìn)程進(jìn)?的調(diào)

度過(guò)程;掌握各個(gè)調(diào)度算法的特點(diǎn)。

2.該課程設(shè)計(jì)意義

理解進(jìn)程調(diào)度的概念

深?了解進(jìn)程控制塊的功能、進(jìn)程的創(chuàng)建、刪除以及進(jìn)程各個(gè)狀態(tài)間的轉(zhuǎn)換過(guò)程

從實(shí)?的?度對(duì)《數(shù)據(jù)結(jié)構(gòu)》課程內(nèi)容進(jìn)?更深?理解和更熟練的應(yīng)?

進(jìn)?步練習(xí)對(duì)Java及C++語(yǔ)?的熟練使?

?、設(shè)計(jì)?案

1.硬件環(huán)境

PC?臺(tái)

2.開(kāi)發(fā)語(yǔ)?及?具

操作系統(tǒng):MSwindowsXP

C++版:VisualStudio2008+MFC

Java版:Eclipse3.4+JavaSwing

3.設(shè)計(jì)思路

系統(tǒng)設(shè)備表?于存取調(diào)度過(guò)程中進(jìn)程可申請(qǐng)的資源

進(jìn)程控制塊主要負(fù)責(zé)具體進(jìn)程信息的保存

等待隊(duì)列、就緒隊(duì)列、完成隊(duì)列?于保存執(zhí)?過(guò)程的狀態(tài)信息

進(jìn)程調(diào)度進(jìn)程(類、線程)在就緒隊(duì)列與等待隊(duì)列之間進(jìn)?調(diào)度

主界?顯?調(diào)度過(guò)程的三個(gè)隊(duì)列的狀態(tài)信息

?戶創(chuàng)建進(jìn)程放?就緒隊(duì)列等待調(diào)度

三、功能模塊設(shè)計(jì)

1.進(jìn)程狀態(tài)轉(zhuǎn)換

2.PCB信息

主要負(fù)責(zé)保存各進(jìn)程基本信息

提供外部狀態(tài)設(shè)置和讀取接?

3.系統(tǒng)設(shè)備類

系統(tǒng)設(shè)備的基本信息

設(shè)備狀態(tài)設(shè)置、讀取接?

4.調(diào)度類

向就緒隊(duì)列添加新創(chuàng)建進(jìn)程

從就緒隊(duì)列取相應(yīng)進(jìn)程執(zhí)?

將執(zhí)?阻塞進(jìn)程放?等待隊(duì)列

檢測(cè)系統(tǒng)設(shè)備表,分配、釋放設(shè)備、喚醒等待進(jìn)程

執(zhí)?完成程序放?完成隊(duì)列(僅為保存狀態(tài),?系統(tǒng)部分)

提供獲取執(zhí)?狀態(tài)的外部接?,即各個(gè)隊(duì)列數(shù)據(jù)的獲取

5.視圖類

提供?戶操作接?(調(diào)度策略選擇、進(jìn)程創(chuàng)建)

顯?各隊(duì)列狀態(tài)信息

創(chuàng)建進(jìn)程調(diào)度類線程,調(diào)?調(diào)度類的接?

四、程序總控流程圖

1.?戶接?、調(diào)度算法、進(jìn)程狀態(tài)轉(zhuǎn)換關(guān)系?意

系統(tǒng)總體設(shè)計(jì)

頁(yè)1

2.調(diào)度算法基本?作流程?意

頁(yè)?

1

進(jìn)程調(diào)度框架

五、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)

1.PCB(進(jìn)程基本信息)

類結(jié)構(gòu)

說(shuō)明

1.pid進(jìn)程ID

2.pName進(jìn)程名

/doc/63393269b84ae45c3b358c30.htmlerName進(jìn)程?戶

4.priority進(jìn)程優(yōu)先級(jí)

5.subtime進(jìn)程提交時(shí)間

6.totalTime進(jìn)程需要執(zhí)?的總時(shí)間

7.runtime進(jìn)程已經(jīng)運(yùn)?時(shí)間

8.dcReqlst當(dāng)前進(jìn)程所需要的設(shè)備請(qǐng)求表

2.Dispatcher(進(jìn)程調(diào)度進(jìn)程)

類結(jié)構(gòu)

說(shuō)明

1.sysTime系統(tǒng)時(shí)間

2.isContention當(dāng)前調(diào)度是否為搶占?式

3.prelst就緒隊(duì)列

4.waitlst等待隊(duì)列

5.finishlst完成隊(duì)列

6.executing正在執(zhí)?的進(jìn)程

7.sysDclst系統(tǒng)設(shè)備表

3.Device(系統(tǒng)設(shè)備)

說(shuō)明

1.dcid設(shè)備標(biāo)識(shí)

2.dcType設(shè)備類型

3.dcTime該設(shè)備?次I/O服務(wù)需要時(shí)間

4.dcPid使?該設(shè)備的進(jìn)程

5.dcDisc設(shè)備描述

6.dcLefTime設(shè)備剩余服務(wù)時(shí)間

六、程序代碼結(jié)構(gòu)

1.類層次關(guān)系

2.詳細(xì)說(shuō)明

Dispatcher定義進(jìn)程調(diào)度進(jìn)程的基本信息和接?

FIFODispatcher、PLevelDispatcher、RRDispatcher、MRDispatcher分別實(shí)現(xiàn)相應(yīng)的調(diào)度算法

Device為系統(tǒng)設(shè)備

DeviceReq為進(jìn)程設(shè)備請(qǐng)求,包括請(qǐng)求設(shè)備ID和時(shí)間

七、代碼實(shí)現(xiàn)分析

1.算法分析(各算法過(guò)程見(jiàn)下流程圖)

設(shè)備的分配釋放

先來(lái)先服務(wù)

優(yōu)先級(jí)調(diào)度

時(shí)間?輪轉(zhuǎn)

多級(jí)反饋輪轉(zhuǎn)

設(shè)備分配釋放

頁(yè)1

先進(jìn)先出進(jìn)程調(diào)度算法

頁(yè)1

優(yōu)先級(jí)進(jìn)程調(diào)度算法(搶占式)

頁(yè)1

時(shí)間?輪轉(zhuǎn)調(diào)度算法

頁(yè)1

多級(jí)反饋輪轉(zhuǎn)調(diào)度算法(搶占式)

頁(yè)1

2.具體實(shí)現(xiàn)(代碼部分有詳細(xì)注釋)

進(jìn)程的插?

@Override

publicvoidaddPreProc(Processproc){

//按優(yōu)先級(jí)加到就緒隊(duì)列

this.prelst.add(proc);

intloc;

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

//?proc?的元素后移?個(gè)位置

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);

}

}

取出進(jìn)程

@Override

publicProcessdelPreProc(){

//取優(yōu)先級(jí)最?者,即為第?個(gè)

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

returnnull;

}

returnthis.prelst.remove(0);//返回最??個(gè)}

先進(jìn)先出算法的調(diào)度

@Override

publicvoidrun(inttime){

intproctimeslice=1;//假設(shè)處理器指令周期為1個(gè)時(shí)鐘周期

while(time>0){//處理機(jī)運(yùn)?time時(shí)間

if(this.executing==null){//沒(méi)有進(jìn)程占?處理機(jī)則空轉(zhuǎn)

this.executing=this.delPreProc();

}

else{//執(zhí)?當(dāng)前進(jìn)程

Processproc=this.executing;

//下?次執(zhí)?需要的設(shè)備

DcRequestreq=proc.getNextReq();

if(req!=null&&req.getReqtime()<=proc.runtime){

//進(jìn)程需要請(qǐng)求設(shè)備,?且執(zhí)?到請(qǐng)求時(shí)間

this.addWaitProc(proc);

this.executing=this.delPreProc();

}else{//?資源請(qǐng)求

proc.run(proctimeslice);

if(proc.isFinished()){

//當(dāng)前進(jìn)程是已完成進(jìn)程,放?完成隊(duì)列,取下?進(jìn)程

proc.setFinishTime(

Dispatcher.getBeginTime()

+Dispatcher.getRunTime());

//設(shè)置當(dāng)前執(zhí)?結(jié)束時(shí)間

this.addFinishProc(proc);

this.executing=this.delPreProc();

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

優(yōu)先級(jí)搶占算法的調(diào)度

@Override

publicvoidrun(inttime,booleanisContention){

if(!isContention){//?搶占?式

this.run(time);

return;

}

intproctimeslice=1;//假設(shè)處理器時(shí)鐘周期

while(time>0){//處理機(jī)運(yùn)?time時(shí)間

if(this.executing==null){//沒(méi)有進(jìn)程占?處理機(jī)則空轉(zhuǎn)

this.executing=this.delPreProc();

}

else{//執(zhí)?當(dāng)前進(jìn)程

Processproc=this.executing;

//下?次執(zhí)?需要的設(shè)備

DcRequestreq=proc.getNextReq();

if(req!=null&&req.getReqtime()<=proc.runtime){

//進(jìn)程需要請(qǐng)求設(shè)備,?且執(zhí)?到請(qǐng)求時(shí)間

//放?等待隊(duì)列,取下?進(jìn)程

this.addWaitProc(proc);

this.executing=this.delPreProc();

}else{//?資源請(qǐng)求

proc.run(proctimeslice);

if(proc.isFinished()){

//當(dāng)前進(jìn)程是已完成進(jìn)程,放?完成隊(duì)列,取下?進(jìn)程

proc.setFinishTime(//設(shè)置當(dāng)前執(zhí)?結(jié)束時(shí)間

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){//按優(yōu)先級(jí)搶占

this.addPreProc(this.executing);

this.executing=this.delPreProc();

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

時(shí)間?輪轉(zhuǎn)

@Override

publicvoidrun(inttime){

intproctimeslice=1;//假設(shè)處理器時(shí)鐘周期

while(time>0){//處理機(jī)運(yùn)?time時(shí)間

if(this.executing==null){//沒(méi)有進(jìn)程占?處理機(jī)則空轉(zhuǎn)

this.executing=this.delPreProc();

}

else{//執(zhí)?當(dāng)前進(jìn)程

Processproc=this.executing;

//下?次執(zhí)?需要的設(shè)備

DcRequestreq=proc.getNextReq();

if(req!=null&&req.getReqtime()<=proc.runtime){

//進(jìn)程需要請(qǐng)求設(shè)備,?且執(zhí)?到請(qǐng)求時(shí)間

//放?等待隊(duì)列,取下?進(jìn)程

this.addWaitProc(proc);

this.executing=this.delPreProc();

}else{//?資源請(qǐng)求

proc.run(proctimeslice);

if(proc.isFinished()){

//當(dāng)前進(jìn)程是已完成進(jìn)程,放?完成隊(duì)列,取下?進(jìn)程

proc.setFinishTime(//設(shè)置當(dāng)前執(zhí)?結(jié)束時(shí)間

Dispatcher.getBeginTime()+

Dispatcher.getRunTime());

this.addFinishProc(proc);

this.executing=this.delPreProc();

}else{

//如果當(dāng)前時(shí)間?沒(méi)有執(zhí)?完,則從就緒隊(duì)列頭移到隊(duì)列尾部

this.addPreProc(this.executing);

//當(dāng)前執(zhí)?進(jìn)程放?就緒隊(duì)列

this.executing=this.delPreProc();

//從就緒隊(duì)列取下?個(gè)進(jìn)程占?cpu

}

}

}

cessWaitlst(proctimeslice);

++Dispatcher.runTime;

--time;

}

}

多級(jí)反饋輪轉(zhuǎn)搶占?式

@Override

publicvoidrun(inttime,booleanisContention){

intproctimeslice=1;//假設(shè)處理器時(shí)鐘周期

while(true){

--time;

if(this.executing==null){//沒(méi)有進(jìn)程占?處理機(jī)則空轉(zhuǎn)

this.executing=this.delPreProc();

if(this.executing!=null){//每調(diào)度?次重新計(jì)算時(shí)間?

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

}

break;

}

else{//執(zhí)?當(dāng)前進(jìn)程

Processproc=this.executing;

//下?次執(zhí)?需要的設(shè)備

DcRequestreq=proc.getNextReq();

if(req!=null&&

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

//進(jìn)程需要請(qǐng)求設(shè)備,?且執(zhí)?到請(qǐng)求時(shí)間

//TODO放?等待隊(duì)列,取下?進(jìn)程

this.addWaitProc(proc);

this.executing=this.delPreProc();

break;//時(shí)間?未完,設(shè)備請(qǐng)求,重新調(diào)度

}else{//?資源請(qǐng)求

proc.run(proctimeslice);

if(proc.isFinished()){

//當(dāng)前進(jìn)程是已完成進(jìn)程,放?完成隊(duì)列,取下?進(jìn)程

proc.setFinishTime(//設(shè)置當(dāng)前執(zhí)?結(jié)束時(shí)間

Dispatcher.getBeginTime()+

Dispatcher.getRunTime());

this.addFinishProc(proc);

this.executing=this.delPreProc();

break;//時(shí)間?

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論