操作系統(tǒng)課程設(shè)計(jì)完成版new_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)完成版new_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)完成版new_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)完成版new_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)完成版new_第5頁(yè)
已閱讀5頁(yè),還剩24頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

操作系統(tǒng)原理課程設(shè)計(jì)題目:進(jìn)程調(diào)度代碼下載地址/detail/liuwenbin2012/7637075/data/1489164院系:計(jì)算機(jī)科學(xué)與技術(shù)(工)班級(jí)學(xué)號(hào):計(jì)11-2(1,13,14)姓名:劉文斌(組長(zhǎng),14)同組成員:劉國(guó)志(13)、祝萬(wàn)超(1)指導(dǎo)教師:張威2014年7月16日操作系統(tǒng)原理課程設(shè)計(jì)任務(wù)書(shū)一、題目:進(jìn)程調(diào)度二、設(shè)計(jì)要求(1)劉文斌負(fù)責(zé)總體設(shè)計(jì)、界面設(shè)計(jì)和高優(yōu)先權(quán)優(yōu)先調(diào)度算法;祝萬(wàn)超負(fù)責(zé)設(shè)計(jì)與實(shí)現(xiàn)先來(lái)先服務(wù)算法;劉國(guó)志負(fù)責(zé)設(shè)計(jì)與實(shí)現(xiàn)時(shí)間片輪轉(zhuǎn)算法;共同完成一些基礎(chǔ)函數(shù)的設(shè)計(jì)與實(shí)現(xiàn)。(2)查閱相關(guān)資料,自學(xué)具體課題中涉及到的新知識(shí)。(3)采用結(jié)構(gòu)化、模塊化程序設(shè)計(jì)方法,功能要完善,具有一定的創(chuàng)新。(4)所設(shè)計(jì)的程序應(yīng)有輸入、輸出。(5)按要求寫(xiě)出課程設(shè)計(jì)報(bào)告,于設(shè)計(jì)結(jié)束后2天內(nèi)提交。其主要內(nèi)容包括:封皮、課程設(shè)計(jì)任務(wù)書(shū),指導(dǎo)教師評(píng)語(yǔ)與成績(jī)、目錄、概述、軟件總體設(shè)計(jì)、詳細(xì)設(shè)計(jì)、軟件的調(diào)試、總結(jié)、致謝、附錄(帶中文注釋的程序清單)、參考文獻(xiàn)??傮w設(shè)計(jì)應(yīng)配合軟件總體模塊結(jié)構(gòu)圖來(lái)說(shuō)明軟件應(yīng)具有的功能;詳細(xì)設(shè)計(jì)應(yīng)用傳統(tǒng)或N-S流程圖和屏幕抓圖說(shuō)明;調(diào)試的敘述應(yīng)配合出錯(cuò)場(chǎng)景的抓圖來(lái)說(shuō)明出現(xiàn)了哪些錯(cuò)誤,如何解決的。三、課程設(shè)計(jì)工作量一般每人的程序量在200行有效程序行左右,不得抄襲。四、課程設(shè)計(jì)工作計(jì)劃2014年7月6日,指導(dǎo)教師講解布置題目,學(xué)生根據(jù)題目準(zhǔn)備資料;2014年7月6日,進(jìn)行總體方案設(shè)計(jì);2014年7月7日~2014年7月10日,完成程序模塊并通過(guò)獨(dú)立編譯;2014年7月11日~2014年7月16日,將各模塊集成為一完整的系統(tǒng),并錄入足夠數(shù)據(jù)進(jìn)行調(diào)試運(yùn)行;2014年7月17日~2014年7月18日,驗(yàn)收、撰寫(xiě)課程設(shè)計(jì)報(bào)告。指導(dǎo)教師簽章:專(zhuān)業(yè)主任簽章:操作系統(tǒng)原理課程設(shè)計(jì)指導(dǎo)教師評(píng)語(yǔ)與成績(jī)指導(dǎo)教師評(píng)語(yǔ):課程設(shè)計(jì)表現(xiàn)成績(jī):課程設(shè)計(jì)驗(yàn)收成績(jī):課程設(shè)計(jì)報(bào)告成績(jī):課程設(shè)計(jì)總成績(jī):指導(dǎo)教師簽章2014年7月18日目錄TOC\o"1-3"\h\u11987一.課程概述 一.課程概述1.1.設(shè)計(jì)構(gòu)想程序能夠完成以下操作:1、創(chuàng)建進(jìn)程。2、修改進(jìn)程的優(yōu)先級(jí)、創(chuàng)建時(shí)間、服務(wù)時(shí)間。3、啟動(dòng)進(jìn)程算法,先來(lái)先服務(wù)、時(shí)間片輪轉(zhuǎn)、高優(yōu)先級(jí)優(yōu)先調(diào)度。4、進(jìn)程運(yùn)行狀態(tài)顯示。1.2.需求分析在多道程序環(huán)境下,主存中有著多個(gè)進(jìn)程,其數(shù)目往往多于處理機(jī)數(shù)目,要使這多個(gè)進(jìn)程能夠并發(fā)地執(zhí)行,這就要求系統(tǒng)能按某種算法,動(dòng)態(tài)地把處理機(jī)分配給就緒隊(duì)列中的一個(gè)進(jìn)程,使之執(zhí)行。分配處理機(jī)的任務(wù)是由處理機(jī)調(diào)度程序完成的。由于處理機(jī)是最重要的計(jì)算機(jī)資源,提高處理機(jī)的利用率及改善系統(tǒng)必(吞吐量、響應(yīng)時(shí)間),在很大程度上取決于處理機(jī)調(diào)度性能的好壞,因而,處理機(jī)調(diào)度便成為操作系統(tǒng)設(shè)計(jì)的中心問(wèn)題之一。本次實(shí)驗(yàn)在vs2010環(huán)境下實(shí)現(xiàn)先來(lái)先服務(wù)調(diào)度算法,時(shí)間片輪轉(zhuǎn)調(diào)度算法和高優(yōu)先權(quán)調(diào)度算法。1.3.理論依據(jù)

為了描述和管制進(jìn)程的運(yùn)行,系統(tǒng)為每個(gè)進(jìn)程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)——進(jìn)程控制塊PCB(Process

Control

Block),PCB中記錄了操作系統(tǒng)所需的、用于描述進(jìn)程的當(dāng)前情況以及控制進(jìn)程運(yùn)行的全部信息,系統(tǒng)總是通過(guò)PCB對(duì)進(jìn)程進(jìn)行控制,亦即,系統(tǒng)是根據(jù)進(jìn)程的PCB而不是任何別的什么而感知進(jìn)程的存在的,PCB是進(jìn)程存在的惟一標(biāo)志。本次課程設(shè)計(jì)用結(jié)構(gòu)體ProNode代替PCB的功能。1.4.課程任務(wù)1、用C語(yǔ)言(或C++)編程實(shí)現(xiàn)操作模擬操作系統(tǒng)進(jìn)程調(diào)度子系統(tǒng)的基本功能;運(yùn)用多種算法實(shí)現(xiàn)對(duì)進(jìn)程的模擬調(diào)度。

2、通過(guò)編寫(xiě)程序?qū)崿F(xiàn)進(jìn)程或作業(yè)先來(lái)先服務(wù)、按時(shí)間片輪轉(zhuǎn)、高優(yōu)先權(quán),使學(xué)生進(jìn)一步掌握進(jìn)程調(diào)度的概念和算法,加深對(duì)處理機(jī)分配的理解。

3、用MFC實(shí)現(xiàn)程序界面。1.5.功能模塊分析:

1、進(jìn)程概念:進(jìn)程是被獨(dú)立分配資源的最小單位。進(jìn)程是動(dòng)態(tài)概念,必須程序運(yùn)行才有進(jìn)程的產(chǎn)生。

2、進(jìn)程的狀態(tài)模型:

(1)完成:進(jìn)程已經(jīng)完成。

(2)就緒:進(jìn)程已經(jīng)準(zhǔn)備好,一旦有處理器就可運(yùn)行。

3、處理機(jī)調(diào)度:在多道程序設(shè)計(jì)系統(tǒng)中,內(nèi)存中有多道程序運(yùn)行,他們相互爭(zhēng)奪處理機(jī)這一重要的資源。處理機(jī)調(diào)度就是從就緒隊(duì)列中,按照一定的算法選擇一個(gè)進(jìn)程并將處理機(jī)分配給它運(yùn)行,以實(shí)現(xiàn)進(jìn)程并發(fā)地執(zhí)行。 4、進(jìn)程調(diào)度算法的功能:

記錄系統(tǒng)中所有進(jìn)程的執(zhí)行情況、選擇占有處理機(jī)的進(jìn)程、進(jìn)行進(jìn)程的上下文切換。5、進(jìn)程調(diào)度的算法:

(1)先來(lái)先服務(wù)算法:如果早就緒的進(jìn)程排在就緒隊(duì)列的前面,遲就緒的進(jìn)程排在就緒隊(duì)列的后面,那么先來(lái)先服務(wù)總是把當(dāng)前處于就緒隊(duì)列之首的那個(gè)進(jìn)程調(diào)度到運(yùn)行狀態(tài)。

(2)時(shí)間片輪轉(zhuǎn)算法:固定時(shí)間片,每個(gè)進(jìn)程在執(zhí)行一個(gè)時(shí)間片后,輪到下一進(jìn)程執(zhí)行,知道所有的進(jìn)程執(zhí)行完畢。處理器同一個(gè)時(shí)間只能處理一個(gè)任務(wù)。處理器在處理多任務(wù)的時(shí)候,就要看請(qǐng)求的時(shí)間順序,如果時(shí)間一致,就要進(jìn)行預(yù)測(cè)。挑到一個(gè)任務(wù)后,需要若干步驟才能做完,這些步驟中有些需要處理器參與,有些不需要(如磁盤(pán)控制器的存儲(chǔ)過(guò)程)。不需要處理器處理的時(shí)候,這部分時(shí)間就要分配給其他的進(jìn)程。原來(lái)的進(jìn)程就要處于等待的時(shí)間段上。經(jīng)過(guò)周密分配時(shí)間,宏觀(guān)上就象是多個(gè)任務(wù)一起運(yùn)行一樣,但微觀(guān)上是有先后的,就是時(shí)間輪換。(3)優(yōu)先數(shù)算法:即進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí)。系統(tǒng)或用戶(hù)按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。

二.總體方案設(shè)計(jì)2.1程序結(jié)構(gòu)程序一共添加了4個(gè)線(xiàn)程,分別是保存修改線(xiàn)程,先來(lái)先服務(wù)線(xiàn)程,時(shí)間片輪轉(zhuǎn)線(xiàn)程,高優(yōu)先權(quán)優(yōu)先服務(wù)線(xiàn)程。優(yōu)先級(jí)優(yōu)先級(jí)進(jìn)程調(diào)度主模塊進(jìn)程控制界面進(jìn)程調(diào)度算法進(jìn)程狀態(tài)界面先來(lái)先服務(wù)算法時(shí)間片輪轉(zhuǎn)算法高優(yōu)先權(quán)優(yōu)先調(diào)度算法創(chuàng)建時(shí)間服務(wù)時(shí)間圖2.1程序結(jié)構(gòu)圖三.詳細(xì)設(shè)計(jì)3.1.界面設(shè)計(jì)圖3.1.

界面設(shè)計(jì)3.1.1.進(jìn)程屬性控制圖3.1.1.進(jìn)程屬性控制3.1.2.進(jìn)程算法圖3.1.2.進(jìn)程算法3.1.3.進(jìn)程運(yùn)行狀態(tài)顯示.圖3.1.2.進(jìn)程算法3.1.4.設(shè)置停頓時(shí)間圖3.1.4設(shè)置停頓時(shí)間相關(guān)類(lèi)及其主要函數(shù)classSetTime:publicCDialogEx{ DECLARE_DYNAMIC(SetTime)public: SetTime(CWnd*pParent=NULL);//標(biāo)準(zhǔn)構(gòu)造函數(shù) virtual~SetTime();//對(duì)話(huà)框數(shù)據(jù) enum{IDD=IDD_SETTIME};protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持 DECLARE_MESSAGE_MAP()public: intm_time;};SetTime::SetTime(CWnd*pParent/*=NULL*/) :CDialogEx(SetTime::IDD,pParent) ,m_time(3){}3.1.5.設(shè)置時(shí)間片圖3.1.5設(shè)置時(shí)間片相關(guān)類(lèi)及其主要函數(shù)classSeep:publicCDialogEx{ DECLARE_DYNAMIC(Seep)public: Seep(CWnd*pParent=NULL);//標(biāo)準(zhǔn)構(gòu)造函數(shù) virtual~Seep();//對(duì)話(huà)框數(shù)據(jù) enum{IDD=IDD_SLEEP};protected: virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持 DECLARE_MESSAGE_MAP()public: intm_sleep;};3.1.6.菜單圖3.1.5設(shè)置時(shí)間片保存輸入框修改voidCprogressDlg::OnSave(){ CWinThread*MainStartThread; LPVOIDlmainparam=(LPVOID)this;//把this指針作為參數(shù)傳進(jìn)去 MainStartThread=::AfxBeginThread( ThreadFuncSave, (LPVOID)lmainparam, THREAD_PRIORITY_NORMAL, 0, 0, NULL );}設(shè)置時(shí)間片大小voidCprogressDlg::OnSetrr(){ SetTimedlg; if( dlg.DoModal()==IDOK) { m_timerr=dlg.m_time; }}設(shè)置停頓時(shí)間voidCprogressDlg::OnSeeptime(){ Seepdlg; if(dlg.DoModal()==IDOK) { m_sleep=dlg.m_sleep; }}3.2.先來(lái)先服務(wù)調(diào)度3.2.1算法思想

先來(lái)先服務(wù)調(diào)度算法的思想是按照進(jìn)程進(jìn)入就緒隊(duì)列的先后順序調(diào)度并分配處理機(jī)執(zhí)行。先來(lái)先服務(wù)調(diào)度算法是一種不可搶占的算法,先進(jìn)入就緒隊(duì)列的進(jìn)程,先被處理機(jī)運(yùn)行。一旦一個(gè)進(jìn)程占有了處理機(jī),它就一直運(yùn)行下去,直到該進(jìn)程完成工作或者因?yàn)榈却呈录荒芾^續(xù)運(yùn)行時(shí)才釋放處理機(jī)。3.2.2.算法代碼voidCprogressDlg::FCFS(void){ inti=0,j; CreateTimeArray();//創(chuàng)建時(shí)間數(shù)組 while(!IsFinish()) { //找出已創(chuàng)建的進(jìn)程 while(!IsCreate(m_time[i])||m_pronode[m_time[i]].prostate==FINISH) { ++i; if(i==5) { m_systime+=1; i=0; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } } //進(jìn)程服務(wù) for(j=0;j<m_pronode[m_time[i]].servetime;++j) { m_systime+=1; m_pronode[m_time[i]].finishpart+=1; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } m_pronode[m_time[i]].prostate=FINISH; }}3.2.3.算法流程圖開(kāi)始開(kāi)始初始化PCB,輸入進(jìn)程信息進(jìn)程按先后順序進(jìn)入就緒隊(duì)列就緒隊(duì)列空?運(yùn)行進(jìn)程所需CPU時(shí)間撤銷(xiāo)該進(jìn)程結(jié)束NY圖3.2.先來(lái)先服務(wù)調(diào)度流程圖3.3.時(shí)間片輪轉(zhuǎn)調(diào)度3.3.1.算法思想

所有就緒進(jìn)程按先來(lái)先服務(wù)的原則排成一個(gè)隊(duì)列,將新來(lái)的進(jìn)程加到就緒對(duì)列的末尾,每當(dāng)執(zhí)行進(jìn)程調(diào)度時(shí),總是把處理機(jī)分配給隊(duì)首的進(jìn)程,各進(jìn)程占用CPU的時(shí)間片相同。也就是說(shuō)CPU的處理時(shí)間劃分成一個(gè)個(gè)相同的時(shí)間片,就緒隊(duì)列的所有進(jìn)程輪流運(yùn)行一個(gè)時(shí)間片。當(dāng)一個(gè)時(shí)間片結(jié)束時(shí),如果運(yùn)行進(jìn)程用完它的時(shí)間片后還未完成,就強(qiáng)迫運(yùn)行進(jìn)程讓出CPU,就把它送回到就緒隊(duì)列的末尾,等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度又去選擇就緒隊(duì)列中的隊(duì)首進(jìn)程,分配給它一時(shí)間片,以投入運(yùn)行。直至所有的進(jìn)程運(yùn)行完畢。3.3.2.算法流程圖開(kāi)始初始化PCB,輸入進(jìn)程信息各進(jìn)程按順序插入就緒隊(duì)列就緒隊(duì)列空?結(jié)束就緒隊(duì)列第一個(gè)投入運(yùn)行時(shí)間片到,計(jì)數(shù)器加一,CPU時(shí)間加一,所需時(shí)間減一N到達(dá)所需的運(yùn)行時(shí)間插入到就緒隊(duì)列的尾部進(jìn)程完成,撤銷(xiāo)該進(jìn)程Y圖3.3.時(shí)間片輪轉(zhuǎn)調(diào)度流程圖3.3.3.程序代碼voidCprogressDlg::RR(void){ inti=0; CreateTimeArray();//創(chuàng)建時(shí)間數(shù)組 while(!IsFinish()) { //找出已創(chuàng)建的進(jìn)程 while(!IsCreate(m_time[i])||m_pronode[m_time[i]].prostate==FINISH) { ++i; if(i>=5) { m_systime+=1; i=0; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } } //進(jìn)程服務(wù) for(intr=0;r<m_timerr;++r) { if(m_pronode[m_time[i]].finishpart==m_pronode[m_time[i]].servetime) m_pronode[m_time[i]].prostate=FINISH; else { m_systime+=1; m_pronode[m_time[i]].finishpart+=1; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } } ++i; if(i>=5) i=0; }}3.4.優(yōu)先級(jí)調(diào)度3.4.1.算法思想進(jìn)程的執(zhí)行順序由高優(yōu)先級(jí)到低優(yōu)先級(jí),系統(tǒng)或用戶(hù)按某種原則為進(jìn)程指定一個(gè)優(yōu)先級(jí)來(lái)表示該進(jìn)程所享有的確調(diào)度優(yōu)先權(quán)。該算法核心是確定進(jìn)程的優(yōu)先級(jí)。3.4.2.算法流程圖運(yùn)行進(jìn)程運(yùn)行進(jìn)程取出進(jìn)程是否創(chuàng)建創(chuàng)建進(jìn)程隊(duì)列(優(yōu)先級(jí))是否完成開(kāi)始結(jié)束YNNY圖3.4.優(yōu)先級(jí)調(diào)度流程圖3.4.3.程序代碼voidCprogressDlg::HPHS(void){ inti=0; CreateProArray();//創(chuàng)建時(shí)間數(shù)組 while(!IsFinish()) { i=0; //找出已創(chuàng)建的進(jìn)程 while(!IsCreate(m_pro[i])||m_pronode[m_pro[i]].prostate==FINISH) { ++i; if(i==5) { m_systime+=1; i=0; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } } //進(jìn)程服務(wù) for(intr=0;r<m_pronode[m_pro[i]].servetime;++r) { m_systime+=1; m_pronode[m_pro[i]].finishpart+=1; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) } m_pronode[m_pro[i]].prostate=FINISH; }}3.5.基礎(chǔ)函數(shù)3.5.1.進(jìn)度條設(shè)置voidCprogressDlg::ProSet(CProgressCtrl*proset,intser){ proset->SetRange32(0,ser); proset->SetStep(1); proset->SetPos(0);}3.5.2.創(chuàng)建進(jìn)程PBCi<5i<5結(jié)束開(kāi)始inti=0,pro,cre,ser;m_systime=0;否是逐個(gè)創(chuàng)建圖3.5.2創(chuàng)建進(jìn)程PBC流程圖voidCprogressDlg::CreatePro(void){ intpro,cre,ser; m_systime=0; for(inti=0;i<5;++i) { pro=GetDlgItemInt(IDC_PRIORITY1+i); cre=GetDlgItemInt(IDC_CREATE1+i); ser=GetDlgItemInt(IDC_SERVE1+i); m_pronode[i].pro=pro; m_pronode[i].createtime=cre; m_pronode[i].servetime=ser; m_pronode[i].finishpart=0; m_pronode[i].prostate=READY; m_pronode[i].rr=-1; }}3.5.3.更新進(jìn)程運(yùn)行狀態(tài)顯示voidCprogressDlg::ProShow(void){ CStringstr; m_proctrl1.SetPos(m_pronode[0].finishpart); str.Format(_T("%d"),m_pronode[0].finishpart); GetDlgItem(IDC_STATIC1)->SetWindowTextW(str); m_proctrl2.SetPos(m_pronode[1].finishpart); str.Format(_T("%d"),m_pronode[1].finishpart); GetDlgItem(IDC_STATIC2)->SetWindowTextW(str); m_proctrl3.SetPos(m_pronode[2].finishpart); str.Format(_T("%d"),m_pronode[2].finishpart); GetDlgItem(IDC_STATIC3)->SetWindowTextW(str); m_proctrl4.SetPos(m_pronode[3].finishpart); str.Format(_T("%d"),m_pronode[3].finishpart); GetDlgItem(IDC_STATIC4)->SetWindowTextW(str); m_proctrl5.SetPos(m_pronode[4].finishpart); str.Format(_T("%d"),m_pronode[4].finishpart); GetDlgItem(IDC_STATIC5)->SetWindowTextW(str); str.Format(_T("運(yùn)行時(shí)間:%d"),m_systime); GetDlgItem(IDC_STATIC6)->SetWindowTextW(str); Sleep(m_sleep);}3.5.4.判斷當(dāng)前進(jìn)程是否創(chuàng)建BOOLCprogressDlg::IsCreate(intindex){ if(m_pronode[index].createtime>m_systime) returnFALSE; else returnTRUE;}3.5.5.創(chuàng)建時(shí)間隊(duì)列開(kāi)始inttime<-100,s,i<-0,j<-0j<5i<5Time=createtime;S=i;Createtime<time&&rr==-1Rr=0;M_time[i]=s;Time=100;結(jié)束NYNYYN圖3.5.5創(chuàng)建時(shí)間隊(duì)列流程圖voidCprogressDlg::CreateTimeArray(void){ inttime=100,s; for(intj=0;j<5;++j) { for(inti=0;i<5;++i) { if(m_pronode[i].createtime<time&&m_pronode[i].rr==-1) { time=m_pronode[i].createtime; s=i; } } m_pronode[s].rr=0; m_time[j]=s; time=100; }}3.5.6.判斷所有進(jìn)程是否完成BOOLCprogressDlg::IsFinish(void){ intpronum=5,i; //是否所有進(jìn)程完成 for(i=0;i<5;++i){ if((m_pronode[i].prostate)==FINISH) pronum-=1; } if(pronum!=0) returnFALSE; Else returnTRUE; }開(kāi)始inttime<-100,s,i<-0,j<-0j<5i<5Pro=pronode[i].pro;開(kāi)始inttime<-100,s,i<-0,j<-0j<5i<5Pro=pronode[i].pro;S=i;pro<time&&rr==-1Rr=0;M_pro[i]=s;pro=100;結(jié)束NYNYYN圖3.5.7創(chuàng)建優(yōu)先權(quán)隊(duì)列流程圖voidCprogressDlg::CreateProArray(void){ intpro=100,s=0; for(intj=0;j<5;++j) { for(inti=0;i<5;++i) { if(m_pronode[i].pro<pro&&m_pronode[i].rr==-1) { pro=m_pronode[i].pro; s=i; } } m_pronode[s].rr=0; m_pro[j]=s; pro=100; }}3.5.8.先來(lái)先服務(wù)線(xiàn)程函數(shù)UINTThreadFuncFCFS(LPVOIDlp){ criticalSection.Lock(); CprogressDlg*dlg; dlg=(CprogressDlg*)lp; dlg->CreatePro(); dlg->FCFS(); criticalSection.Unlock(); return0;}3.5.9.時(shí)間片輪轉(zhuǎn)線(xiàn)程函數(shù)UINTThreadFuncRR(LPVOIDlp){ criticalSection.Lock(); CprogressDlg*dlg; dlg=(CprogressDlg*)lp; dlg->CreatePro(); dlg->RR(); criticalSection.Unlock(); return0;}3.5.10.高優(yōu)先級(jí)線(xiàn)程函數(shù)UINTThreadFuncHPHS(LPVOIDlp){ criticalSection.Lock(); CprogressDlg*dlg; dlg=(CprogressDlg*)lp; dlg->CreatePro(); dlg->HPHS(); criticalSection.Unlock(); return0;}3.5.11.保存輸入框修改線(xiàn)程函數(shù)UINTThreadFuncSave(LPVOIDlp){ criticalSection.Lock(); CprogressDlg*dlg; dlg=(CprogressDlg*)lp; dlg->Save(); dlg->MessageBox(_T("修改成功!"),_T("提示"),MB_OK); criticalSection.Unlock(); return0;}3.5.12.保存輸入框修改voidCprogressDlg::Save(void){ SendMessage(UM_MYUPDATEDATA,TRUE); ProSet(&m_proctrl1,m_ser1); ProSet(&m_proctrl2,m_ser2); ProSet(&m_proctrl3,m_ser3); ProSet(&m_proctrl4,m_ser4); ProSet(&m_proctrl5,m_ser5); GetDlgItem(IDC_STATIC1)->SetWindowTextW(_T("0")); GetDlgItem(IDC_STATIC2)->SetWindowTextW(_T("0")); GetDlgItem(IDC_STATIC3)->SetWindowTextW(_T("0")); GetDlgItem(IDC_STATIC4)->SetWindowTextW(_T("0")); GetDlgItem(IDC_STATIC5)->SetWindowTextW(_T("0")); GetDlgItem(IDC_STATIC6)->SetWindowTextW(_T("運(yùn)行時(shí)間:0"));}3.5.13.子線(xiàn)程向主線(xiàn)程發(fā)送消息afx_msgLRESULTCprogressDlg::OnUmMyupdatedata(WPARAMwParam,LPARAMlParam){ UpdateData(wParam); return0;}程序的調(diào)試與運(yùn)行結(jié)果說(shuō)明4.1.界面4.1.1問(wèn)題1程序界面出現(xiàn)“卡死”現(xiàn)象原因,當(dāng)程序只有一個(gè)主線(xiàn)程的時(shí)候,程序只有完成當(dāng)前操作的時(shí)候才會(huì)執(zhí)行下一個(gè)操作任務(wù)。解決辦法,分別添加四個(gè)線(xiàn)程,分別是保存修改線(xiàn)程,先來(lái)先服務(wù)線(xiàn)程,時(shí)間片輪轉(zhuǎn)線(xiàn)程,高優(yōu)先權(quán)優(yōu)先服務(wù)線(xiàn)程。圖4.1.1界面調(diào)試4.2.先來(lái)先服務(wù)調(diào)度4.2.1問(wèn)題1無(wú)法正確按照時(shí)間先后順序調(diào)用線(xiàn)程。原因是直接修改PCB隊(duì)列會(huì)導(dǎo)致界面的實(shí)現(xiàn)比較困難,但是不修改又會(huì)導(dǎo)致無(wú)法正確調(diào)度進(jìn)程或者需要更多的函數(shù)輔助,以便實(shí)現(xiàn)相應(yīng)的功能。解決辦法,創(chuàng)建時(shí)間隊(duì)列,添加函數(shù)voidCprogressDlg::CreateTimeArray(void)圖4.2.先來(lái)先服務(wù)調(diào)度調(diào)試4.3.時(shí)間片輪轉(zhuǎn)調(diào)度4.3.1問(wèn)題1進(jìn)程時(shí)間片結(jié)束還沒(méi)有切換下一個(gè)線(xiàn)程。解決辦法 修改該段代碼 m_systime+=1; m_pronode[m_time[i]].finishpart+=1; ProShow();//更新進(jìn)程運(yùn)行狀態(tài)改成如下代碼 if(m_pronode[m_time[i]].finishpart==m_pronode[m_time[i]].servetime) m_pronode[m_time[i]].prostate=FINISH; else { m_systime+=1; m_pronode[m_time[i]].finishpart+=1; ProShow();//更新進(jìn)程運(yùn)行狀態(tài) }圖4.3.1時(shí)間片輪轉(zhuǎn)調(diào)度調(diào)試4.3.2問(wèn)題2進(jìn)程間能切換的時(shí)候,發(fā)現(xiàn)進(jìn)程的時(shí)間片到了,還繼續(xù)對(duì)當(dāng)前進(jìn)程服務(wù),直到進(jìn)程運(yùn)行完成。原因是進(jìn)程的創(chuàng)建時(shí)間隊(duì)列沒(méi)有形成“環(huán)”從隊(duì)頭到對(duì)尾的時(shí)候沒(méi)有再跳回隊(duì)頭。解決辦法,添加以下代碼,當(dāng)執(zhí)行到隊(duì)尾的時(shí)候,就跳回隊(duì)頭。 ++i; if(i>=5) i=0;圖4.3.2時(shí)間片輪轉(zhuǎn)調(diào)度調(diào)試4.4.高優(yōu)先級(jí)優(yōu)先調(diào)度4.4.1問(wèn)題1無(wú)法正確按照優(yōu)先權(quán)高低調(diào)用進(jìn)程。原因是直接修改PCB隊(duì)列會(huì)導(dǎo)致界面的實(shí)現(xiàn)比較困難,但是不修改又會(huì)導(dǎo)致無(wú)法正確調(diào)度進(jìn)程或者需要更多的函數(shù)輔助,以便實(shí)現(xiàn)相應(yīng)的功能。解決辦法,創(chuàng)建優(yōu)先權(quán)隊(duì)列,添加函數(shù)voidCprogressDlg::CreateProArray()圖4.4.1高優(yōu)先級(jí)優(yōu)先調(diào)度4.5基礎(chǔ)函數(shù)調(diào)試4.5.1問(wèn)題1執(zhí)行ThreadFuncSave函數(shù)的時(shí)候出現(xiàn)如下錯(cuò)誤。圖4.5.1hreadFuncSave函數(shù)調(diào)試導(dǎo)致錯(cuò)誤的代碼是: dlg->UpdateData(TRUE);原因該子線(xiàn)程通過(guò)主框架對(duì)象的指針,修改了主線(xiàn)程的數(shù)據(jù),而主線(xiàn)程有自己的安全保護(hù)措施,禁止子線(xiàn)程主動(dòng)修改主線(xiàn)程的數(shù)據(jù),所以導(dǎo)致了錯(cuò)誤。解決辦法,添加一個(gè)自定義消息,子線(xiàn)程向主線(xiàn)程發(fā)送消息,讓主線(xiàn)程自己修改數(shù)據(jù)。繞過(guò)主線(xiàn)程的保護(hù)措施。#defineUM_MYUPDATEDATAWM_USER+100//自定義消息(子線(xiàn)程向主線(xiàn)程發(fā)送消息)afx_msgLRESULTCprogressDlg::OnUmMyupdatedata(WPARAMwParam,LPARAMlParam){ UpdateData(wParam); return0;}4.5.2問(wèn)題2導(dǎo)致錯(cuò)誤的代碼是:voidCprogressDlg::OnSetrr(){ SetTimedlg; if( dlg.DoModal()==IDOK) { m_timerr=dlg.GetDlgItemInt(IDC_TIMEEDIT); }}原因?qū)懥薸f(dlg.DoModal()==IDOK)點(diǎn)擊OK后,窗口已經(jīng)關(guān)閉,不能使用GetDlgItemInt,繼續(xù)使用會(huì)出現(xiàn)野指針的問(wèn)題。解決辦法:窗口對(duì)象消除了,但是對(duì)象的數(shù)據(jù)還沒(méi)有被析構(gòu)函數(shù)清除。修改該代碼m_timerr=dlg.GetDlgItemInt(IDC_TIMEEDIT);改成m_timerr=dlg.m_time;五.課程設(shè)計(jì)總結(jié)通過(guò)做本實(shí)驗(yàn),我在以前學(xué)過(guò)的知識(shí)的基礎(chǔ)上有了提高,學(xué)到了很多新知識(shí):比如將用戶(hù)作業(yè)和就緒進(jìn)程按提交的順序或變?yōu)榫途w狀態(tài)的先后排成隊(duì)列,并按照先來(lái)先服務(wù)的方式進(jìn)行調(diào)度。調(diào)度時(shí)從后備隊(duì)列中選擇若干優(yōu)先權(quán)最高的個(gè)作業(yè)進(jìn)入內(nèi)存;或從就緒隊(duì)列中選擇優(yōu)先權(quán)最高的進(jìn)程,將處理機(jī)分配給它。對(duì)進(jìn)程優(yōu)先、進(jìn)程或作業(yè)先來(lái)先服務(wù)、按時(shí)間片輪轉(zhuǎn)調(diào)度算法以及進(jìn)程調(diào)度的概念和算法,有了更深入的認(rèn)識(shí)!初步理解了操作系統(tǒng)對(duì)于作業(yè)處理的基本思想!了解到算法很重要,又更加明白算法本身可以節(jié)約時(shí)間,而且不同的函數(shù)之間在調(diào)用的時(shí)候要注意很多的問(wèn)題。在動(dòng)手操作過(guò)程中,體會(huì)到了成功的喜悅和遇到問(wèn)題自己解決的能力,對(duì)于我來(lái)說(shuō)是一次提高,讓自己多多的在實(shí)踐中可以加深對(duì)理論的理解,也讓我明白了以后應(yīng)該如何更好,更高效的學(xué)習(xí)。六.后記經(jīng)過(guò)兩周的時(shí)間,課程設(shè)計(jì)終于完成了,他鍛煉了我查閱資料,進(jìn)行方案構(gòu)思的能力。在設(shè)計(jì)過(guò)程中,我按照實(shí)驗(yàn)要求逐步完善設(shè)計(jì)方案,較好的完成了設(shè)計(jì)任務(wù)。

這次課程設(shè)計(jì),由于理論知識(shí)的不足,再加上平時(shí)沒(méi)有設(shè)計(jì)經(jīng)驗(yàn),一開(kāi)始有些手忙腳亂,不知從何入手。但在組員們的熱情幫助下,使我順利地完成了設(shè)計(jì)。雖然困難很多,但是我盡了自己最大的努力去克服,然而還是難免有些疏忽和遺漏的地方。

這次課程設(shè)計(jì)對(duì)我而言是對(duì)計(jì)算機(jī)操作系統(tǒng)課程內(nèi)容掌握情況的一次自我驗(yàn)證和對(duì)以前所學(xué)的各種計(jì)算機(jī)語(yǔ)言的一種檢驗(yàn),從而有著極其重要的意義。通過(guò)這次課程設(shè)計(jì)提高了對(duì)所學(xué)知識(shí)的綜合應(yīng)用能力。七.致謝我們?nèi)M人員感謝給過(guò)我?guī)椭完P(guān)注的所有人,更加感謝張威老師帶領(lǐng)我們完成這次課程設(shè)計(jì),指出我們的不足之處,鼓勵(lì)我們繼續(xù)努力。組長(zhǎng)我感謝組員的默契配合與相互合作。謝謝大家八.附錄8.1.進(jìn)程狀態(tài)宏#define FINISH 0#define READY 18.2.進(jìn)程隊(duì)列結(jié)點(diǎn)structProNode{ intpro;//優(yōu)先級(jí) intcreatetime;//創(chuàng)建時(shí)間 intservetime;//服務(wù)時(shí)間 intfinishpart;//完成部分 intprostate;//進(jìn)程狀態(tài) intrr;//是否加入數(shù)組};8.3.主框架構(gòu)造函數(shù)CprogressDlg::CprogressDlg(CWnd*pParent/*=NULL*/) :CDialogEx(CprogressDlg::IDD,pParent){m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_systime=0; m_pri1=2; m_pri2=4; m_pri3=1; m_pri4=3; m_pri5=5; m_cre1=4; m_cre2=3; m_cre3=8; m_cre4=2; m_cre5=10; m_ser1=9; m_ser2=8; m_ser3=12; m_ser4=6; m_ser5=10; m_timerr=3; m_sleep=450;}8.4.界面控件與類(lèi)變量鏈接voidCprogressDlg::DoDataExchange(CDataExchange*pDX){ C

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論