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

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——模擬進程調(diào)度功能的設(shè)計與實現(xiàn)操作系統(tǒng)課程設(shè)計(MFC版本)

目錄

1、設(shè)計目的意義2

1.1、目的意義21.2、實現(xiàn)目標(biāo)22、設(shè)計方案3

2.1、軟硬件環(huán)境32.2、開發(fā)工具32.3、思路33、程序功能模塊設(shè)計4

3.1、總體模塊43.2、部分模塊43.3、詳細功能描述64、程序總控流程圖65、數(shù)據(jù)結(jié)構(gòu)設(shè)計8

5.1、PCB結(jié)構(gòu)85.2、進程狀態(tài)結(jié)構(gòu)85.3、控件結(jié)構(gòu)96、程序代碼結(jié)構(gòu)97、程序主要代碼解析108、測試數(shù)據(jù)及測試結(jié)果158.1、運行時部分界面15

8.2、數(shù)據(jù)測試記錄179、設(shè)計過程中遇到的問題及解決方法1810、結(jié)論1810.1、系統(tǒng)實現(xiàn)狀況18

10.2、系統(tǒng)特點1810.3、設(shè)計體會及收獲1811、參考資料19

模擬進程調(diào)度功能的設(shè)計與實現(xiàn)

1、設(shè)計目的意義

1.1、目的意義

通過課程設(shè)計理解進程調(diào)度的概念,深入了解進程控制的功能、進程的創(chuàng)立、刪除以

及進程各個狀態(tài)間的轉(zhuǎn)換過程;實現(xiàn)先來先服務(wù)、時間片輪轉(zhuǎn)、最短作業(yè)優(yōu)先、優(yōu)先級調(diào)度算法對進程進行的調(diào)度過程;通過觀測有關(guān)的隊列結(jié)構(gòu)的內(nèi)容的動態(tài)變化過程深入體會各個調(diào)度算法的特點;從而能夠更好的穩(wěn)定從書本上學(xué)到的知識。編程過程中需要建立隊列等結(jié)構(gòu)進行各種操作,通過該次課程設(shè)計,我們更加從實用

的角度對《數(shù)據(jù)結(jié)構(gòu)》課程內(nèi)容進行更深入理解和更熟練的應(yīng)用。

使用C++語言進行編程,通過對調(diào)度功能的編程實現(xiàn),不但能有效訓(xùn)練我們對編程語

言的熟練使用,還能促進我們獨立思考解決問題、以及獨立查新獲取知識的能力。1.2、實現(xiàn)目標(biāo)

一個進程的生命期可以劃分為一組狀態(tài),這些狀態(tài)刻畫了整個進程。系統(tǒng)根據(jù)PCB結(jié)

構(gòu)中的狀態(tài)值控制過程。在進程的生命期內(nèi),一個進程至少具有5種基本狀態(tài),它們是:初始態(tài)、執(zhí)行狀態(tài)、等待狀態(tài)、就緒狀態(tài)和終止?fàn)顟B(tài)。通過系統(tǒng)設(shè)計,實現(xiàn)進程相關(guān)數(shù)據(jù)結(jié)構(gòu)的創(chuàng)立和查看功能;實現(xiàn)多種進程調(diào)度算法:先來先服務(wù)算法、優(yōu)先級調(diào)度算法、時間片輪轉(zhuǎn)法等;實現(xiàn)對執(zhí)行進程的阻塞,對等待進程的喚醒等功能。進程的轉(zhuǎn)換過程如下:

2、設(shè)計方案

2.1軟硬件環(huán)境硬件設(shè)備:PC機

軟件設(shè)備:WINDOWSXP、MicrosoftVisualC++6.02.2、開發(fā)工具

由于現(xiàn)在使用的操作系統(tǒng)大多數(shù)都是微軟公司的產(chǎn)品,為了更好更貼近的模擬操作系

統(tǒng)中進程調(diào)度功能,我們選擇使用C++語言,開發(fā)平臺MicrosoftVisualC++6.0,借助MFC來完成應(yīng)用Windows應(yīng)用程序的開發(fā)。另外通過課余時間的學(xué)習(xí),對Windows應(yīng)用程序的開發(fā)過程也有一些了解,很想學(xué)以致用,做點使用的東西加深對學(xué)習(xí)過的知識的理解與吸收。2.3、思路

進程根據(jù)外界條件的不斷變化引起狀態(tài)的改變,可以利用系統(tǒng)時間片的大小、進程執(zhí)

行時間、進入主存的時間、系統(tǒng)內(nèi)存大小、以及調(diào)度算法的選擇來作為條件對進程進行調(diào)度。通過在對話框中添加按鈕、文本編輯框、列表等控件,并為控件關(guān)聯(lián)相應(yīng)的變量和消息函數(shù),實現(xiàn)各個控件內(nèi)部以及控件之間的協(xié)同工作,并使用定時器進行時間的設(shè)置,從而完成系統(tǒng)所要求的進程調(diào)度工作。Windows應(yīng)用程序,操作系統(tǒng),計算機硬件之間的相互關(guān)系如下:

3、程序功能模塊設(shè)計(程序功能模塊劃分及層次等)

3.1、總體模塊

3.2、部分模塊

3.3、詳細功能描述

根據(jù)需要設(shè)置系統(tǒng)內(nèi)存的大小

選擇不同的進度調(diào)度算法進行進程調(diào)度模擬設(shè)置進程的各種屬性值創(chuàng)立進程

根據(jù)進程不同的狀態(tài)放在不同的位置顯示進程調(diào)度過程中的動態(tài)變化狀況在某一時間點擊按鈕進行進程調(diào)度模擬

進程調(diào)度模擬過程中可以暫停調(diào)度過程,查看進程的狀態(tài)變化過程通過雙擊狀態(tài)列表中的某個進程可以查看進程的各屬性值對執(zhí)行進程、就緒進程進行強制“阻塞〞操作對等待進程進行強制“就緒〞操作

將沒有執(zhí)行完畢的進程進行強制“殺死〞操作

4、程序總控流程圖

(見下頁)

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

5.2、進程狀態(tài)結(jié)構(gòu)

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

程序主要函數(shù)如下,各函數(shù)通過關(guān)聯(lián)相關(guān)變量進行消息傳遞CProgressExDlg::CProgressExDlg(CWnd*pParent/*=NULL*/)

:CDialog(CProgressExDlg::IDD,pParent)

構(gòu)造函數(shù),調(diào)用基類CProgressExDlg,并傳遞兩個參數(shù):一個CProgressExDlg類的IDD成員,一個是父窗口指針。

voidCProgressExDlg::DoDataExchange(CDataExchange*pDX)

主要用來完成對話框數(shù)據(jù)的交換和校驗。voidCProgressExDlg::OnButPause()

用于暫停進程調(diào)度操作

voidCProgressExDlg::OnButStart()

用于啟動進程調(diào)度

voidCProgressExDlg::OnButton1()

用于復(fù)位,清除各進程

voidCProgressExDlg::OnButton2()

用于創(chuàng)立進程

voidCProgressExDlg::OnButtonBlock()

用于使選定進程進入就緒狀態(tài)

voidCProgressExDlg::OnButtonKill()

用于殺死選定進程

voidCProgressExDlg::OnButtonNotify()

用于阻塞選定進程

HBRUSHCProgressExDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)

用于設(shè)置顯示進程屬性時的字體和顏色

voidCProgressExDlg::OnDblclkListReadypro()

用于雙擊就緒隊列中的某個進程,進而顯示其屬性voidCProgressExDlg::OnDblclkListRunpro()

用于雙擊執(zhí)行隊列中的某個進程,進而顯示其屬性voidCProgressExDlg::OnDblclkListWaitpro()

用于雙擊等待隊列中的某個進程,進而顯示其屬性BOOLCProgressExDlg::OnInitDialog()

初始化對話框

voidCProgressExDlg::OnPaint()

繪制對話框

voidCProgressExDlg::OnTimer(UINTnIDEvent)

處理各種調(diào)度算法

7、程序主要代碼解析

由于代碼較多,以下只列出了先來先服務(wù)算法和最短作業(yè)優(yōu)先算法的代碼。

if(nIDEvent==0)//為先來先服務(wù)調(diào)度算法

{

if(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())==0)(ReadyVec.size()!=0))//假使沒有進程運行,先擇優(yōu)先級最高的進入運行{

sort(ReadyVec.begin(),ReadyVec.end(),Compare);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

ReadyVec[0].status=0;

RunVec.push_back(ReadyVec[0]);tempRunPcb=ReadyVec[0];

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-DeleteString(0);CStringbuf;

buf.Format(%d%s,ReadyVec[0].PID,ReadyVec[0].PName);((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-AddString(buf);}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()!=0)){

RunVec[0].WorkTime-=100;

if(RunVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()==0)){

RunVec[0].WorkTime-=100;

if(RunVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}}

if((((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-GetCount())!=0){

if(WaitVec.size()!=0){

sort(WaitVec.begin(),WaitVec.end(),Compare);for(intj=0;jWaitVec.size();j++){

if(WaitVec[j].MemCount=m_memSize){

//刪除掉可以進入就緒隊列的優(yōu)先權(quán)最高的進程m_memSize-=WaitVec[j].MemCount;WaitVec[j].status=1;

ReadyVec.push_back(WaitVec[j]);

vectorPCB::iteratorpos=WaitVec[j];WaitVec.erase(pos);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-DeleteString(j);CStringbuf;

buf.Format(%d%s,ReadyVec[j].PID,ReadyVec[j].PName);((CListBox

*)GetDlgItem(IDC_LIST_RUNPRO))-InsertString(ReadyVec.size(),buf);

}}

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-ResetContent();for(j=0;jWaitVec.size();j++){

CStringbuf;

buf.Format(%d%s,WaitVec[j].PID,WaitVec[j].PName);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-InsertString(j,buf);}

}}

UpdateData(FALSE);}

elseif(nIDEvent==1)//最短作業(yè)優(yōu)先算法{if((!ReadyVec.empty())((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())==0)){

std::stable_sort(ReadyVec.begin(),ReadyVec.end(),CompareByWkt);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

ReadyVec[0].status=0;

RunVec.push_back(ReadyVec[0]);ReadyVec[0].WorkTime-=100;

tempRunPcb=ReadyVec[0];CStringbuf;

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-GetText(0,buf);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-DeleteString(0);((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-AddString(buf);UpdateData(false);}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()!=0)){

ReadyVec[0].WorkTime-=100;

if(ReadyVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();UpdateData(false);

m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}

//操作阻塞隊列

stable_sort(WaitVec.begin(),WaitVec.end(),CompareByWkt);if(WaitVec.size()!=0){

if(WaitVec[0].MemCount=m_memSize){

m_memSize-=WaitVec[0].MemCount;WaitVec[0].status=1;

ReadyVec.push_back(WaitVec[0]);vectorPCB::iteratorpos=WaitVec.begin();WaitVec.erase(pos);

if(ReadyVec.size()!=0){

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

UpdateData(false);}

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-ResetContent();for(inti=0;iWaitVec.size();i++){

CStringbuf;

buf.Format(%d%s,WaitVec[i].PID,WaitVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-InsertString(i,buf);}

UpdateData(FALSE);}}}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.empty())){

ReadyVec[0].WorkTime-=100;

if(ReadyVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();UpdateData(FALSE);m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();}}else{

UpdateData(FALSE);}}

8、測試數(shù)據(jù)及測試結(jié)果

8.1、運行時部分界面剛啟動時

添加進程后:

先來先服務(wù)算法調(diào)度點擊開始模擬后:

雙擊執(zhí)行進程時:

點擊阻塞時:

8.2、數(shù)據(jù)測試記錄

9、設(shè)計過程中遇到的問題及解決方法

滿足進程動態(tài)生成的需要,使用向量vector進行存放進程

向量vector中的內(nèi)容不能直接使用下標(biāo)刪除,使用迭代器iterator并結(jié)合函數(shù)erase

使用。

使用組合框ComboBox時沒有下拉滾動條,可以剛開始時把組合框畫的大一點就可以。運行時同一個進程在不同的兩個狀態(tài)同時出現(xiàn),在狀態(tài)轉(zhuǎn)換時刪除列表框中的內(nèi)容后

要更新一下。

進程運行完后對應(yīng)的內(nèi)存資源沒有增加,在每次的進程運行終止或是從執(zhí)行狀態(tài)轉(zhuǎn)換

到等待狀態(tài),都要釋放資源。

編碼過程中也出現(xiàn)了規(guī)律不夠嚴密等錯誤,經(jīng)過一一排查都把錯誤改正了。

10、結(jié)論

10.1、系統(tǒng)實現(xiàn)狀況

課程設(shè)計任務(wù)書中所要求的功能我們都已經(jīng)確鑿無誤的實現(xiàn),測試中沒有出現(xiàn)什么錯

誤。該系統(tǒng)實現(xiàn)了進程控制的功能、進程的創(chuàng)立、刪除以及進程各個狀態(tài)間的轉(zhuǎn)換過程;實現(xiàn)了先來先服務(wù)、時間片輪轉(zhuǎn)、最短作業(yè)優(yōu)先、優(yōu)先級調(diào)度算法對進程進行調(diào)度過程;系統(tǒng)界面上所有的功能部件說明的功能都已實現(xiàn)。10.2、系統(tǒng)特點

溫馨提示

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

評論

0/150

提交評論