版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)說明書</b></p><p><b> 課程設(shè)計(jì)任務(wù)書</b></p><p> 課程名稱:操作系統(tǒng)課程設(shè)計(jì)</p><p> 設(shè)計(jì)題目:進(jìn)程調(diào)度程序設(shè)計(jì)</p><p> 已知技術(shù)參數(shù)和設(shè)計(jì)要求:</p><p><b&
2、gt; 1. 設(shè)計(jì)任務(wù)</b></p><p> 設(shè)計(jì)一個虛擬內(nèi)核,該內(nèi)核能支持多任務(wù)管理。提供創(chuàng)建進(jìn)程、終止進(jìn)程、進(jìn)程狀態(tài)轉(zhuǎn)換,進(jìn)程調(diào)度,上下文切換等功能。</p><p><b> 2. 問題描述</b></p><p><b> 2.1 系統(tǒng)組成</b></p><p>
3、 系統(tǒng)由虛擬內(nèi)核(VKernel)、命令解釋程序(Commander)、用戶程序(Application)、編譯器(Compiler)四部分組成。VKernel首先運(yùn)行,并常駐內(nèi)存。Kernel啟動后,創(chuàng)建Commander進(jìn)程。根據(jù)用戶請求創(chuàng)建多個Application進(jìn)程。Kernel負(fù)責(zé)維護(hù)6個數(shù)據(jù)結(jié)構(gòu),包括時間 (Time), 處理器狀態(tài)(CPUstate),進(jìn)程表 (PCBTable), 就緒隊(duì)列(ReadyState),等待
4、隊(duì)列(BlockedState),運(yùn)行進(jìn)程(RunningState)。Time是系統(tǒng)時間片。CPUstate應(yīng)包括程序計(jì)數(shù)器PC,累加器A、B,狀態(tài)寄存器F的值。PCBTable的每一項(xiàng)是一個進(jìn)程的進(jìn)程控制塊(PCB)。Commander程序、Application程序是用下列CPU虛擬指令書寫的程序:</p><p> CPU虛擬指令(以下指令僅供參考, 設(shè)計(jì)者可以自行設(shè)計(jì))</p><
5、p> MOV n //把整數(shù)n賦給累加器A</p><p> SAV m //把累加器A的值存入地址M</p><p> ADD n //從累加器A的值加上整數(shù)n,結(jié)果送到累加器A。</p><p> SUB n //從累加器A的值減去整數(shù)n,結(jié)果送到累加器A。</p><p> MUL n //從累加器A的值
6、乘以整數(shù)n,結(jié)果送到累加器A。</p><p> DIV n //從累加器A的值除以整數(shù)n,結(jié)果送到累加器A。</p><p> JEQ m //F為0跳轉(zhuǎn)到m</p><p> JLG m //F大于0跳轉(zhuǎn)到m</p><p> JLE m //F大于等于0跳轉(zhuǎn)到m</p><p> JMP
7、 m //無條件跳轉(zhuǎn)到m</p><p> OUT port //累加器的內(nèi)容輸出到端口port。port為0,指顯示器;為1,指揚(yáng)聲器。</p><p> 虛擬系統(tǒng)調(diào)用(以下系統(tǒng)調(diào)用僅供參考, 設(shè)計(jì)者可自行設(shè)計(jì))</p><p> exec() //執(zhí)行程序并創(chuàng)建子進(jìn)程</p><p> exit() //進(jìn)程終止<
8、;/p><p> block() //進(jìn)程等待</p><p> printk() //在屏幕上打印系統(tǒng)信息</p><p> scanf() //從鍵盤輸入一字符串</p><p> msg() //向內(nèi)核發(fā)送消息</p><p> 為了簡化設(shè)計(jì),復(fù)雜的系統(tǒng)調(diào)用當(dāng)作廣義指令處理。</p>
9、<p><b> 2.2命令解釋程序</b></p><p> 命令解釋程序從標(biāo)準(zhǔn)輸入重復(fù)讀入用戶命令,然后以消息形式發(fā)送給內(nèi)核。命令解釋程序處理的命令由設(shè)計(jì)者定義并實(shí)現(xiàn)。</p><p><b> 2.3 編譯器</b></p><p> 編譯器把虛擬指令和虛擬系統(tǒng)調(diào)用編譯為可執(zhí)行字節(jié)碼??蓤?zhí)行字節(jié)碼
10、由內(nèi)核解釋執(zhí)行。</p><p><b> 3. 功能要求</b></p><p> 應(yīng)實(shí)現(xiàn)的功能有:(1)能接收用戶提交的命令并執(zhí)行該命令。(2)執(zhí)行用戶程序:創(chuàng)建進(jìn)程、終止進(jìn)程、調(diào)度進(jìn)程、管理進(jìn)程狀態(tài)轉(zhuǎn)換</p><p><b> 4. 技術(shù)要求</b></p><p> 采用時間輪轉(zhuǎn)和
11、優(yōu)先級調(diào)度混合算法。優(yōu)先級以優(yōu)先數(shù)表示,優(yōu)先數(shù)越大則優(yōu)先級越高。調(diào)度時,就緒隊(duì)列中優(yōu)先數(shù)最大的進(jìn)程優(yōu)先運(yùn)行,相同優(yōu)先數(shù)進(jìn)程按FIFO方式調(diào)度。進(jìn)程運(yùn)行一個時間片以后,其優(yōu)先數(shù)數(shù)減1(即降低一級);進(jìn)程在就緒隊(duì)列中等待3個時間片以后,其優(yōu)先數(shù)加1。優(yōu)先數(shù)范圍0~31。</p><p><b> 5. 界面要求</b></p><p> 用戶界面設(shè)計(jì)不做統(tǒng)一規(guī)定,但應(yīng)
12、做到界面友好,易于操作。</p><p><b> 6. 其他要求</b></p><p> 編程語言和操作系統(tǒng)不限。</p><p> 4.課程設(shè)計(jì)時間:2周(2012.06.04~2012.6.15)</p><p> 5.課程設(shè)計(jì)的考核方式及評分方法</p><p><b&
13、gt; (1) 考核方式</b></p><p> ■ 課程設(shè)計(jì)結(jié)束時,在機(jī)房當(dāng)場驗(yàn)收。</p><p> ■ 教師提供測試數(shù)據(jù),檢查運(yùn)行結(jié)果是否正確。</p><p> ■ 回答教師提出的問題。</p><p> ■ 學(xué)生提交課程設(shè)計(jì)文檔(A4打印件),教師評閱。</p><p><b&g
14、t; (2) 評分方法</b></p><p> 上機(jī)檢查:書面報(bào)告:答辯=6:3:1,沒有通過上機(jī)檢查的或不提交課程設(shè)計(jì)報(bào)告的,其成績直接記為不及格。</p><p> 指導(dǎo)教師簽名: 日期: </p><p> 系主任簽名: 日期: </p><p>&l
15、t;b> 摘要</b></p><p> 本次操作系統(tǒng)課程設(shè)計(jì)的題目是進(jìn)程調(diào)度程序設(shè)計(jì)。在整個設(shè)計(jì)的過程當(dāng)中,用C語言模擬實(shí)現(xiàn)動態(tài)優(yōu)先數(shù)的進(jìn)程調(diào)度算法,動態(tài)優(yōu)先權(quán)是基于某種原則,使進(jìn)程的優(yōu)先數(shù)隨時間而改變。最高優(yōu)先數(shù)調(diào)度就是優(yōu)先權(quán)越高的進(jìn)程就會越先運(yùn)行。在上機(jī)操作中,我深刻認(rèn)識到了,進(jìn)程的管理是操作系統(tǒng)中是很重要的一部分。通過結(jié)構(gòu),數(shù)組來進(jìn)行進(jìn)程的操作,整個程序利用if,for來聯(lián)系起來。涉
16、及到進(jìn)程的優(yōu)先級,運(yùn)行時間片,等待時間等屬性以及時間片的操作。在進(jìn)程中實(shí)現(xiàn)了十條指令。</p><p> 關(guān)鍵詞:最高優(yōu)先數(shù);進(jìn)程調(diào)度;進(jìn)程控制塊;內(nèi)核;系統(tǒng)調(diào)用</p><p><b> 目錄</b></p><p> 1設(shè)計(jì)內(nèi)容與要求1</p><p><b> 2 設(shè)計(jì)說明2</b>
17、;</p><p> 2.1 問題描述與功能設(shè)計(jì)2</p><p> 2.2. 設(shè)計(jì)思想2</p><p><b> 2.3方案設(shè)計(jì)2</b></p><p><b> 2.4 編碼3</b></p><p><b> 2.5 測試6</b
18、></p><p><b> 3 總結(jié)7</b></p><p><b> 參考文獻(xiàn)8</b></p><p> 附錄A 程序源代碼9</p><p><b> 1設(shè)計(jì)內(nèi)容與要求</b></p><p> 設(shè)計(jì)內(nèi)容:設(shè)計(jì)一個虛擬內(nèi)核
19、,該內(nèi)核能支持多任務(wù)管理。提供創(chuàng)建進(jìn)程、終止進(jìn)程、進(jìn)程狀態(tài)轉(zhuǎn)換,進(jìn)程調(diào)度,上下文切換等功能。</p><p> 功能設(shè)計(jì):(1)能接收用戶提交的命令并執(zhí)行該命令。</p><p> (2)執(zhí)行用戶程序:創(chuàng)建進(jìn)程、終止進(jìn)程、調(diào)度進(jìn)程、管理進(jìn)程狀態(tài)轉(zhuǎn)換</p><p> 技術(shù)要求:采用時間輪轉(zhuǎn)和優(yōu)先級調(diào)度混合算法。優(yōu)先級以優(yōu)先數(shù)表示,優(yōu)先數(shù)越大則優(yōu)先級越高。調(diào)度時
20、,就緒隊(duì)列中優(yōu)先數(shù)最大的進(jìn)程優(yōu)先運(yùn)行,相同優(yōu)先數(shù)進(jìn)程按FIFO方式調(diào)度。進(jìn)程運(yùn)行一個時間片以后,其優(yōu)先數(shù)數(shù)減1(即降低一級);進(jìn)程在就緒隊(duì)列中等待3個時間片以后,其優(yōu)先數(shù)加1。優(yōu)先數(shù)范圍0~31</p><p> 界面要求:用戶界面設(shè)計(jì)不做統(tǒng)一規(guī)定,但應(yīng)做到界面友好,易于操作。</p><p><b> 2 設(shè)計(jì)說明</b></p><p>
21、; 2.1 問題描述與功能設(shè)計(jì)</p><p> 設(shè)計(jì)一個進(jìn)程管理程序是一個綜合性很強(qiáng)的問題,能支持多任務(wù)管理,提供創(chuàng)建進(jìn)程、終止進(jìn)程、進(jìn)程狀態(tài)轉(zhuǎn)換,進(jìn)程調(diào)度,上下文切換等功能。</p><p> 整個設(shè)計(jì)包含了三個部分:一是偽指令的解釋執(zhí)行,二是偽調(diào)度算法,三是進(jìn)程的創(chuàng)建及main()函數(shù)的總體實(shí)現(xiàn)。</p><p><b> 2.2. 設(shè)計(jì)思想
22、</b></p><p> 實(shí)現(xiàn)進(jìn)程調(diào)度的模擬實(shí)驗(yàn),用動態(tài)優(yōu)先權(quán)調(diào)度算法來編譯,首先應(yīng)該確定選擇優(yōu)先數(shù)的方法,在實(shí)際編程時,進(jìn)程優(yōu)先數(shù)的確定原則大體如下:在就緒隊(duì)列中呆一個時間片,優(yōu)先數(shù)增加1。進(jìn)程每運(yùn)行一個時間片,優(yōu)先數(shù)減3。在運(yùn)行時要求輸入進(jìn)程數(shù)還有進(jìn)程的運(yùn)行時間,CPU使用情況等。</p><p><b> 基本編程思想:</b></p&g
23、t;<p> 創(chuàng)建PCB表 創(chuàng)建就緒隊(duì)列 對頭指針演示 進(jìn)程調(diào)度 創(chuàng)建各個進(jìn)程 優(yōu)先級算法調(diào)度 主函數(shù)模塊</p><p><b> 2.3方案設(shè)計(jì)</b></p><p> 2.3.1 設(shè)計(jì)思路</p><p> 在開始的時候?qū)崿F(xiàn)十條指令,十條指令的解釋程序:<
24、;/p><p> #define NOP 00//空指令: 消耗一個機(jī)器周期</p><p> #define MOV 01 //傳送指令:立即數(shù)賦值給寄存器A</p><p> #define ADD 02 //加法指令:寄存器A加立即數(shù)</p><p> #define OUT 80 //輸出指令: 寄存器A的值輸出到端口(端
25、口號01--表示顯示器)</p><p> #define SUB 03 //減法指令</p><p> #define MUL 04 //乘法指令</p><p> #define EXT 05</p><p> #define MOD 06 //求余指令</p><p> #define JMP 0
26、7 //跳轉(zhuǎn)指令</p><p> #define SFT 11 //左移位指令</p><p> 以滿足用戶設(shè)計(jì)的內(nèi)核測試指令的實(shí)現(xiàn)。當(dāng)然該內(nèi)核系統(tǒng)得能為系統(tǒng)創(chuàng)建進(jìn)行,獨(dú)立設(shè)計(jì)設(shè)計(jì)一能滿足用戶自定義優(yōu)先級調(diào)度算法和時間片輪轉(zhuǎn),并可以實(shí)現(xiàn)用戶多進(jìn)程的并行。</p><p> 本設(shè)計(jì)在調(diào)用cpl將用戶的測試指令翻譯成二進(jìn)制BIN文件,然后由FF去將其進(jìn)一步在
27、內(nèi)核里實(shí)現(xiàn)。該過程都是在do.dat測試平臺進(jìn)行。</p><p> 2.3.2 功能設(shè)計(jì)</p><p> 1 .虛擬內(nèi)核設(shè)計(jì) </p><p> (1)定義PCB結(jié)構(gòu)類,保存進(jìn)程相關(guān)信息。如:程序大小、進(jìn)程號、時間片大小、優(yōu)先數(shù)等。</p><p><b> ?。?)加載用戶程序</b></p>
28、<p> 打開字節(jié)碼文件,獲取字節(jié)碼文件的相關(guān)信息,將其保存到PCB中,然后為此進(jìn)程加載內(nèi)存,將字節(jié)碼文件pcb->addr中,然后初始化pcb結(jié)構(gòu)中的屬性。</p><p><b> ?。?)執(zhí)行指令</b></p><p> 首先要獲取當(dāng)前進(jìn)程的pcb,在pcb->addr+pcb->PC所指向的內(nèi)存單元中取指令,然后再執(zhí)行,執(zhí)行完
29、一條指令就修改程序計(jì)數(shù)器的值。</p><p><b> 2 編譯器的設(shè)計(jì)</b></p><p> 編譯器的功能是從用戶程序中讀文件,將程序中的指令翻譯成字節(jié)碼。定義相關(guān)的指令,將所讀的文件保存在文件流結(jié)構(gòu)fin中,調(diào)用系統(tǒng)函數(shù)將用戶程序的指令的操作碼變成二進(jìn)制文件流,同時將操作數(shù)的ASCII轉(zhuǎn)換成10進(jìn)制數(shù)。</p><p> 3 基
30、于時間片輪轉(zhuǎn)的調(diào)度算法</p><p> 給每個程序分時間片,當(dāng)運(yùn)行完成后,就自動轉(zhuǎn)入下一條。</p><p><b> 2.4 編碼</b></p><p><b> 程序流程圖:</b></p><p> A:編譯器功能:用戶命令解釋,驗(yàn)證用戶命令。如下圖所示</p>&
31、lt;p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p> B:int loadProgram(char *name)函數(shù):打開用戶程序
32、,創(chuàng)建用戶程序進(jìn)程并初始化。</p><p> 功能:打開系統(tǒng)內(nèi)存在的用戶程序,創(chuàng)建該用戶程序的進(jìn)程。如下圖所示</p><p><b> 否</b></p><p><b> 是</b></p><p><b> 、</b></p><p>
33、 C:運(yùn)行進(jìn)程int main(int argc, char *argv[])函數(shù)</p><p> 功能:執(zhí)行用戶程序指令.如下圖所示</p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p>
34、<p> 否 是 </p><p><b> 否 </b></p><p><b> 2.5 測試</b></p><p> 測試的結(jié)果如下圖顯示:</p><p><b> 3 總結(jié)&l
35、t;/b></p><p> 在這次的“進(jìn)程調(diào)度算法模擬”課程設(shè)計(jì)中,我獨(dú)立設(shè)計(jì)并最終完成了一個通過C語言程序來模擬的進(jìn)程的“最高優(yōu)先權(quán)”調(diào)度的算法實(shí)現(xiàn)。在親自的調(diào)試實(shí)踐過程中,讓我對于操作系統(tǒng)的進(jìn)程以及作業(yè)的調(diào)度方式有了一個更為真切生動的理解。通過將原本抽象的描述語言轉(zhuǎn)化為實(shí)際的可執(zhí)行程序,在實(shí)例的對比中讓我更明白各個調(diào)度算法的性能差異,執(zhí)行原理的不同以及應(yīng)用的領(lǐng)域。通過將操作系統(tǒng)的理論知識與編程方式結(jié)
36、合來鞏固所學(xué)的方式也讓我受益匪淺,多學(xué)科知識的融合和綜合運(yùn)用,在實(shí)際操作中鍛煉了我將所學(xué)知識運(yùn)用于解決實(shí)際問題的能力。激發(fā)了我自主學(xué)習(xí)的熱情,和對學(xué)好操作系統(tǒng)這門課的興趣。</p><p> 在程序的編譯和調(diào)試過程中遇到了很大的困難,對于基于“鏈表結(jié)構(gòu)的帶頭結(jié)點(diǎn)的隊(duì)列”這種數(shù)據(jù)結(jié)構(gòu)的程序?qū)崿F(xiàn)較以前做過的程序來說還是很有難度的,程序中用到了C語言中的結(jié)構(gòu)體、指針等細(xì)節(jié)性較強(qiáng)的版塊,所以調(diào)試真的是對耐心的細(xì)心的極大
37、考驗(yàn)。</p><p> 另外由于對模擬程序的核心數(shù)據(jù)結(jié)構(gòu)---基于“鏈表結(jié)構(gòu)的帶頭結(jié)點(diǎn)的隊(duì)列”的一些其本運(yùn)算法在初期考慮時欠妥,導(dǎo)致后期耗費(fèi)大量時間在調(diào)試上,這是非常不值得的。應(yīng)繼續(xù)加強(qiáng)在動手寫程序前把難點(diǎn)及核心算法想清,想準(zhǔn)的能力。</p><p> 通過這次課程設(shè)計(jì),使我對操作系統(tǒng)有了更進(jìn)一步的認(rèn)識和了解,要想學(xué)好它要重在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它,還有不斷請教老
38、師和同學(xué)才能完成。 </p><p> 通過這次課程設(shè)計(jì),使我對操作系統(tǒng)有了更進(jìn)一步的認(rèn)識和了解,要想學(xué)好它要重在實(shí)踐,要通過不斷的上機(jī)操作才能更好地學(xué)習(xí)它,還有不斷請教老師和同學(xué)才能完成。 </p><p> 通過本次課程設(shè)計(jì),我對數(shù)據(jù)結(jié)構(gòu)有了進(jìn)一步的了解,并為之而更努力!</p><p><b> 參考文獻(xiàn)</b></p>
39、<p> [1] Abraham Silberschatz. 操作系統(tǒng)概念(第8版 影印版). 北京:高等教育出版社,2010.</p><p> [2] Gary Nutt(著),潘登(譯).Linux操作系統(tǒng)內(nèi)核實(shí)習(xí).北京:機(jī)械工業(yè)出版社,2004.</p><p> [3] 湯子瀛、哲鳳屏.《計(jì)算機(jī)操作系統(tǒng)》,西安電子科技大學(xué)學(xué)出版社.</p>&l
40、t;p> [4]王清、李光明.《計(jì)算機(jī)操作系統(tǒng)》,冶金工業(yè)出版社.</p><p> [5]孫鐘秀等,《操作系統(tǒng)教程》, 高等教育出版社.</p><p> [6]曾明,《Linux操作系統(tǒng)應(yīng)用教程》, 陜西科學(xué)技術(shù)出版社. </p><p> [7]張麗芬、劉利雄,《操作系統(tǒng)實(shí)驗(yàn)教程》, 清華大學(xué)出版社.</p><p>
41、[8]孟靜, 《操作系統(tǒng)教程——原理和實(shí)例分析》, 高等教育出版社.</p><p> [9]周長林,《計(jì)算機(jī)操作系統(tǒng)教程》, 高等教育出版社.</p><p> [10]張堯?qū)W,《計(jì)算機(jī)操作系統(tǒng)教程》,清華大學(xué)出版社.</p><p> [11]任滿杰,《操作系統(tǒng)原理實(shí)用教程》,電子工業(yè)出版社.</p><p><b&
42、gt; 附錄A 程序源代碼</b></p><p> //vknl.h--Head File for virtual kernel</p><p> //version 1.0, 2012-06, by clp</p><p> #ifndef __VIRTUAL_KERNEL__</p><p> #define __
43、VIRTUAL_KERNEL__</p><p> #include "iostream.h"</p><p> #include "string.h"</p><p> #include "stdio.h"</p><p> #include "malloc.h&
44、quot;</p><p> #define NOP 00//空指令: 消耗一個機(jī)器周期</p><p> #define MOV 01 //傳送指令:立即數(shù)賦值給寄存器A</p><p> #define ADD 02 //加法指令:寄存器A加立即數(shù)</p><p> #define SUB 03</p><
45、;p> #define JEQ 07</p><p> #define OUT 0x08//輸出指令: 寄存器A的值輸出到端口(端口號01--表示顯示器)</p><p> #define MAX_PID 10//系統(tǒng)并發(fā)運(yùn)行的進(jìn)程數(shù)的最大值</p><p><b> //定義虛擬CPU</b></p><
46、;p> typedef struct {</p><p> int A; //累加器</p><p> int PC; //程序計(jì)數(shù)器</p><p> int B; //通用寄存器B</p><p> int F; //標(biāo)志寄存器F</p><p> int
47、*SP; //堆棧指針SP</p><p><b> }CPU;</b></p><p> CPU cpu;//定義CPU結(jié)夠變量</p><p> //定義PCB結(jié)構(gòu)類型</p><p> typedef struct {</p><p> int A;//寄存器
48、A</p><p> int PC;//程序計(jì)數(shù)器PC</p><p><b> int R0;</b></p><p><b> int R1;</b></p><p><b> int R2;</b></p><p><b&g
49、t; int R3;</b></p><p> int pid;//進(jìn)程號,值-1~MAX_PID,-1表示無進(jìn)程</p><p> int ppid;//父進(jìn)程號</p><p> int gpid;//進(jìn)程組號</p><p> char state;//進(jìn)程狀態(tài):01--新建,02--
50、就緒,03--運(yùn)行, 04--等待,</p><p> // 05--完成</p><p> int slice;//時間片大小。為了簡單,假設(shè)為“指令條數(shù)/時間片”</p><p> int B; //寄存器B</p><p> int F; //寄存器F</p><p
51、> char *addr;;//程序加載起始地址</p><p> char priority;//優(yōu)先數(shù), 值為0--31,其中31為最高級</p><p> char last; //上次運(yùn)行的時間,調(diào)度時要用此時間</p><p> int length;//程序大小</p><p><b>
52、 }PCB;</b></p><p> int cur_pid;</p><p> PCB pcbs[MAX_PID];//進(jìn)程控制塊數(shù)組</p><p> void initSystem(void); //初始化系統(tǒng)</p><p> int loadProgram(char *name);//加
53、載應(yīng)用程序</p><p> int exeInstruction(int pid);//執(zhí)行指令</p><p><b> #endif</b></p><p> //vknl.cpp--virtual kernal</p><p> //version 1.0, 2012-06, by clp</p&
54、gt;<p> //使用方法:vknl 字節(jié)碼文件名</p><p> #include "vknl.h"</p><p> #include "stdlib.h"</p><p> void initSystem(void)</p><p><b> {</b&
55、gt;</p><p> cur_pid=0;</p><p> for(int i=0;i<10;i++)</p><p> pcbs[i].pid=-1;</p><p><b> }</b></p><p> int loadProgram(char *name,int pr
56、iority,int slice,int p)</p><p><b> {</b></p><p> FILE *fin=fopen(name,"rb"); //打開源程序文件</p><p> if(fin==NULL) return -1;//若打開失敗,返回-1</p><p> f
57、seek(fin,0L,SEEK_END); //文件讀寫指針移到文件末尾</p><p> long fsize=ftell(fin); //求文件長度</p><p> fseek(fin,0L,SEEK_SET); //讀寫指針移到文件開頭</p><p> PCB *pcb=pcbs+p;//獲取當(dāng)前進(jìn)程PCB</p><p&g
58、t; pcb->addr=new char[fsize]; //為新進(jìn)程分配內(nèi)存</p><p> fread(pcb->addr, fsize, 1, fin); //程序讀入內(nèi)存</p><p> fclose(fin); //關(guān)閉文件</p><p> pcb->length=fsize;//進(jìn)程大小</p><
59、p> pcb->A=0; //初始化寄存器</p><p> pcb->PC=0;</p><p> pcb->R0=0;</p><p> pcb->R1=0;</p><p> pcb->R2=0;</p><p> pcb->R3=0;</p>
60、<p> pcb->pid=p;</p><p> pcb->priority=priority;//優(yōu)先權(quán)值</p><p> pcb->slice=slice; //時間片</p><p> pcb->last=0;</p><p> pcb->state=2;
61、//進(jìn)程狀態(tài)</p><p> return 0; //正常返回</p><p><b> }</b></p><p> int exeInstruction(int pid)</p><p><b> {</b></p><p> PCB *pcb=pcbs
62、+pid;//獲取當(dāng)前進(jìn)程PCB</p><p> short op_cmd=*((short*)(pcb->addr+pcb->PC)); //取操作碼</p><p> short op_dat=*((short*)(pcb->addr+pcb->PC+2)); //取操作數(shù)</p><p> //注意,我們約定操作數(shù)是16位整數(shù)
63、,所以要定義為short。</p><p> //(1)MOV指令執(zhí)行</p><p> //printf("%x\n", op_cmd);</p><p> if(op_cmd==MOV||op_cmd==0x11||op_cmd==0x21||op_cmd==0x31||op_cmd==0x41||op_cmd==0x51||op_cm
64、d==0x61||op_cmd==0x71||op_cmd==0x81||op_cmd==0x91||op_cmd==0xa1||op_cmd==0xb1||op_cmd==0xc1||op_cmd==0xd1||op_cmd==0xe1||op_cmd==0xf1)</p><p><b> {</b></p><p><b> //->R0&
65、lt;/b></p><p> if(op_cmd==MOV)</p><p> pcb->R0=op_dat;</p><p> else if(op_cmd==0x11)</p><p> pcb->R0=pcb->R1;</p><p> else if(op_cmd==0x21
66、)</p><p> pcb->R0=pcb->R2;</p><p> else if(op_cmd==0x31)</p><p> pcb->R0=pcb->R3;</p><p><b> //->R1</b></p><p> else if(op
67、_cmd==0x41)</p><p> pcb->R1=pcb->R0;</p><p> else if(op_cmd==0x51)</p><p> pcb->R1=op_dat;</p><p> else if(op_cmd==0x61)</p><p> pcb->R1=p
68、cb->R2;</p><p> else if(op_cmd==0x71)</p><p> pcb->R1=pcb->R3;</p><p><b> //->R2</b></p><p> else if(op_cmd==0x81)</p><p> pcb
69、->R2=pcb->R0;</p><p> else if(op_cmd==0x91)</p><p> pcb->R2=pcb->R1;</p><p> else if(op_cmd==0xa1)</p><p> pcb->R2=op_dat;</p><p> else
70、 if(op_cmd==0xb1)</p><p> pcb->R2=pcb->R3;</p><p><b> //->R3</b></p><p> else if(op_cmd==0xc1)</p><p> pcb->R3=pcb->R0;</p><p
71、> else if(op_cmd==0xd1)</p><p> pcb->R3=pcb->R1;</p><p> else if(op_cmd==0xe1)</p><p> pcb->R3=pcb->R2;</p><p> else if(op_cmd==0xf1)</p>&l
72、t;p> pcb->R3=op_dat;</p><p><b> }</b></p><p> //(2)ADD指令執(zhí)行</p><p> else if(op_cmd==ADD||op_cmd==0x12||op_cmd==0x22||op_cmd==0x32||op_cmd==0x42||op_cmd==0x52||o
73、p_cmd==0x62||op_cmd==0x72||op_cmd==0x82||op_cmd==0x92||op_cmd==0xa2||op_cmd==0xb2||op_cmd==0xc2||op_cmd==0xd2||op_cmd==0xe2||op_cmd==0xf2)</p><p><b> {</b></p><p><b> //R0+&
74、lt;/b></p><p> if(op_cmd==ADD)</p><p> pcb->R0+=op_dat;</p><p> else if(op_cmd==0x12)</p><p> pcb->R0+=pcb->R1;</p><p> else if(op_cmd==0x
75、22)</p><p> pcb->R0+=pcb->R2;</p><p> else if(op_cmd==0x32)</p><p> pcb->R0+=pcb->R3;</p><p><b> //R1+</b></p><p> else if(op_
76、cmd==0x42)</p><p> pcb->R1+=pcb->R0;</p><p> else if(op_cmd==0x52)</p><p> pcb->R1+=op_dat;</p><p> else if(op_cmd==0x62)</p><p> pcb->R1+
77、=pcb->R2;</p><p> else if(op_cmd==0x72)</p><p> pcb->R1+=pcb->R3;</p><p><b> //R2+</b></p><p> else if(op_cmd==0x82)</p><p> pcb
78、->R2+=pcb->R0;</p><p> else if(op_cmd==0x92)</p><p> pcb->R2+=pcb->R1;</p><p> else if(op_cmd==0xa2)</p><p> pcb->R2+=op_dat;</p><p> e
79、lse if(op_cmd==0xb2)</p><p> pcb->R2+=pcb->R3;</p><p><b> //R3+</b></p><p> else if(op_cmd==0xc2)</p><p> pcb->R3+=pcb->R0;</p><
80、p> else if(op_cmd==0xd2)</p><p> pcb->R3+=pcb->R1;</p><p> else if(op_cmd==0xe2)</p><p> pcb->R3+=pcb->R2;</p><p> else if(op_cmd==0xf2)</p>
81、<p> pcb->R3+=op_dat;</p><p><b> }</b></p><p> //(3)SUB指令執(zhí)行</p><p> else if(op_cmd==SUB||op_cmd==0x13||op_cmd==0x23||op_cmd==0x33||op_cmd==0x43||op_cmd==0x5
82、3||op_cmd==0x63||op_cmd==0x73||op_cmd==0x83||op_cmd==0x93||op_cmd==0xa3||op_cmd==0xb3||op_cmd==0xc3||op_cmd==0xd3||op_cmd==0xe3||op_cmd==0xf3)</p><p><b> {</b></p><p><b> //
83、R0-</b></p><p> if(op_cmd==SUB)</p><p> pcb->R0-=op_dat;</p><p> else if(op_cmd==0x13)</p><p> pcb->R0-=pcb->R1;</p><p> else if(op_cmd
84、==0x23)</p><p> pcb->R0-=pcb->R2;</p><p> else if(op_cmd==0x33)</p><p> pcb->R0-=pcb->R3;</p><p><b> //R1-</b></p><p> else i
85、f(op_cmd==0x43)</p><p> pcb->R1-=pcb->R0;</p><p> else if(op_cmd==0x53)</p><p> pcb->R1-=op_dat;</p><p> else if(op_cmd==0x63)</p><p> pcb-&g
86、t;R1-=pcb->R2;</p><p> else if(op_cmd==0x73)</p><p> pcb->R1-=pcb->R3;</p><p><b> //R2-</b></p><p> else if(op_cmd==0x83)</p><p>
87、 pcb->R2-=pcb->R0;</p><p> else if(op_cmd==0x93)</p><p> pcb->R2-=pcb->R1;</p><p> else if(op_cmd==0xa3)</p><p> pcb->R2-=op_dat;</p><p>
88、; else if(op_cmd==0xb3)</p><p> pcb->R2-=pcb->R3;</p><p><b> //R3-</b></p><p> else if(op_cmd==0xc3)</p><p> pcb->R3-=pcb->R0;</p>
89、<p> else if(op_cmd==0xd3)</p><p> pcb->R3-=pcb->R1;</p><p> else if(op_cmd==0xe3)</p><p> pcb->R3-=pcb->R2;</p><p> else if(op_cmd==0xf3)</p&
90、gt;<p> pcb->R3-=op_dat;</p><p><b> }</b></p><p> //(8)OUT指令執(zhí)行</p><p> else if(op_cmd==OUT||op_cmd==0x18||op_cmd==0x28||op_cmd==0x38)//輸出指令</p><
91、;p><b> {</b></p><p> if(op_cmd==OUT)</p><p> printf("%d", pcb->R0);</p><p> else if(op_cmd==0x18)</p><p> printf("%d", pcb-&g
92、t;R1);</p><p> else if(op_cmd==0x28)</p><p> printf("%d", pcb->R2);</p><p> else if(op_cmd==0x38)</p><p> printf("%d", pcb->R3);</p>
93、<p><b> }</b></p><p> //(11)JEQ指令執(zhí)行</p><p> else if(op_cmd==JEQ)</p><p><b> {</b></p><p> if(pcb->R0!=0){</p><p> p
94、cb->PC-=op_dat*4;</p><p><b> }</b></p><p><b> }</b></p><p> pcb->PC+=4;//修改程序計(jì)數(shù)器</p><p> return 0;//正常返回</p><p><b&g
95、t; }</b></p><p> int findmax(PCB pcbs[],int q)//處理器調(diào)度</p><p><b> {</b></p><p> int max=-1;</p><p> int lmax=-1;</p><p> int pid=-
96、1;</p><p> for(int i=0;i<q;i++)</p><p><b> {</b></p><p> if(pcbs[i].state==2&&pcbs[i].pid>=0&&pcbs[i].priority>=max)</p><p>
97、; max=pcbs[i].priority; </p><p><b> }</b></p><p> for(int j=0;j<q;j++)</p><p><b> {</b></p><p> if(max==pcbs[j].priority&&
98、pcbs[j].last>=lmax)</p><p><b> {</b></p><p> lmax=pcbs[j].last;</p><p><b> }</b></p><p><b> }</b></p><p&
99、gt; for(int k=0;k<q;k++)</p><p><b> {</b></p><p> if(pcbs[k].priority==max&&pcbs[k].last==lmax)</p><p><b> {</b></p><p> pid
100、=pcbs[k].pid;</p><p> pcbs[k].state=3;</p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p> return p
101、id;</p><p><b> }</b></p><p> int main(int argc, char *argv[])</p><p><b> {</b></p><p> if(argc==1) </p><p> argv[1]="app
102、1.bin"; //默認(rèn)應(yīng)用程序</p><p> if(argc>11)</p><p><b> {</b></p><p> printf("最多只能并發(fā)10個進(jìn)程,請重新操作\n");</p><p> return -1;</p><p>&l
103、t;b> }</b></p><p> initSystem();//初始化系統(tǒng)</p><p> for(int i=1;i<argc;i++)</p><p><b> {</b></p><p> int p,time;</p><p>
104、printf("請輸入第%d個進(jìn)程的優(yōu)先權(quán)值:\n",i-1);</p><p> scanf("%d",&p); </p><p> if(p<0||p>31)</p><p><b> {</b></p><p> printf("請輸入0
105、-31之間的數(shù)\n");</p><p> scanf("%d",&p);</p><p><b> }</b></p><p> printf("請輸入第%d個進(jìn)程的時間片:\n",i-1);</p><p> scanf("%d",
106、&time);</p><p> if(time<1||time>10)</p><p><b> {</b></p><p> printf("請輸入1-10之間的數(shù)\n");</p><p> scanf("%d",&time);</p
107、><p><b> }</b></p><p> loadProgram(argv[i],p,time,i-1);//加載應(yīng)用程序</p><p><b> }</b></p><p><b> while(1)</b></p><p><b&
108、gt; {</b></p><p> cur_pid=findmax(pcbs,argc-1);//執(zhí)行調(diào)度</p><p> if(cur_pid==-1)</p><p><b> {</b></p><p> printf("任務(wù)完成!\n");</p>
109、<p><b> break;</b></p><p><b> }</b></p><p> else if(pcbs[cur_pid].state==3)</p><p><b> {</b></p><p> printf("選中P%
110、d",cur_pid);</p><p><b> //運(yùn)行時間片</b></p><p> printf("任務(wù)%d至本次已等待%d時間片",pcbs[cur_pid].pid,pcbs[cur_pid].last);</p><p> for(int m=0;m<pcbs[cur_pid].
111、slice;m++)</p><p><b> {</b></p><p> exeInstruction(cur_pid);</p><p> if(pcbs[cur_pid].PC>=pcbs[cur_pid].length)</p><p><b> {</b><
112、;/p><p> printf("任務(wù)%d運(yùn)行完!\n",pcbs[cur_pid].pid);</p><p> pcbs[cur_pid].pid=-1;</p><p> pcbs[cur_pid].state=5;</p><p> pcbs[cur_pid].priority=-1;</p>&
113、lt;p> delete [] pcbs[cur_pid].addr;//回收內(nèi)存</p><p><b> break;</b></p><p><b> }</b></p><p> pcbs[cur_pid].last=0;</p><p> pcbs[cur_pid].s
114、tate=2;</p><p><b> }</b></p><p> if(pcbs[cur_pid].pid>=0&&pcbs[cur_pid].priority>0)</p><p><b> {</b></p><p> pcbs[cur_
115、pid].priority-=1;</p><p><b> }</b></p><p> for(int i=0;i<argc-1;i++)</p><p><b> {</b></p><p> if(i!=cur_pid&&pcbs[i].pid>=0)&
116、lt;/p><p><b> {</b></p><p> if(pcbs[i].last==3) </p><p><b> {</b></p><p> pcbs[i].priority+=1;</p><p> pcbs[i].last=1;</p
117、><p> printf("p=%dy=%dt=%d,",pcbs[i].pid,pcbs[i].priority,pcbs[i].last);</p><p><b> }</b></p><p> else if(pcbs[i].last<3){</p><p> pcbs[i].
118、last++;</p><p> printf("p=%dy=%dt=%d,",pcbs[i].pid,pcbs[i].priority,pcbs[i].last);</p><p><b> }</b></p><p><b> }</b></p><p><
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 進(jìn)程調(diào)度算法 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)-進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度算法
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--進(jìn)程調(diào)度算法
- 操作系統(tǒng)程序設(shè)計(jì)課程設(shè)計(jì)報(bào)告-操作系統(tǒng)模擬實(shí)現(xiàn)
- 進(jìn)程調(diào)度算法操作系統(tǒng)課程設(shè)計(jì) (2)
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度模擬設(shè)計(jì)
- 操作系統(tǒng)程序調(diào)度課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)_進(jìn)程調(diào)度算法課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)——進(jìn)程調(diào)度模擬算法
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 《高級語言程序設(shè)計(jì)》課程設(shè)計(jì)--進(jìn)程調(diào)度模擬
- 操作系統(tǒng)課程設(shè)計(jì)---多級反饋隊(duì)列進(jìn)程調(diào)度算法
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---進(jìn)程調(diào)度的模擬實(shí)現(xiàn)
評論
0/150
提交評論