操作系統(tǒng)課程設計文檔281112535_第1頁
操作系統(tǒng)課程設計文檔281112535_第2頁
操作系統(tǒng)課程設計文檔281112535_第3頁
操作系統(tǒng)課程設計文檔281112535_第4頁
操作系統(tǒng)課程設計文檔281112535_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目錄目錄 1.課程設計目的及要求-1 1.1 課程設計的目的 -1 1.2 設計內容與要求 -1 1.2.1 設計內容 -1 1.2.2 設計要求 -1 2.設計說明 -2 2.1 需求分析 -2 2.2 方案設計 -2 2.3 編碼 -3 2.3.1 CPU 虛擬指令設計 -3 2.3.2 PCB 棧設計 -3 2.3.3 輸出設計 -4 2.3.4cpu 執(zhí)行-5 2.4 測試 -5 3.總結-7 參考文獻-8 附錄 A 程序源代碼-9 1 1.1.課程設計目的及要求課程設計目的及要求 1.11.1 課程設計的目的課程設計的目的 通過對操作系統(tǒng)課程的學習,利用所學的知識原理,通過本次的課程

2、設計使學生能更進 一步地理解操作系統(tǒng)的設計和實現思路,掌握操作系統(tǒng)主要原理和算法,培養(yǎng)學生的動手 能力,實現理論知識與實踐的結合。 1.21.2 設計內容與要求設計內容與要求 1.2.11.2.1 設計內容設計內容 設計一個虛擬內核,該內核能支持多任務管理。提供創(chuàng)建進程、終止進程、進程狀態(tài)轉換, 進程調度,上下文切換等功能。 1.2.21.2.2 設計要求設計要求 功能要求: 應實現的功能有:(1)能接收用戶提交的命令并執(zhí)行該命令。(2)執(zhí)行用戶程序:創(chuàng)建進 程、終止進程、調度進程、管理進程狀態(tài)轉換 技術要求: 采用時間輪轉和優(yōu)先級調度混合算法。優(yōu)先級以優(yōu)先數表示,優(yōu)先數越大則優(yōu)先級越 高。調

3、度時,就緒隊列中優(yōu)先數最大的進程優(yōu)先運行,相同優(yōu)先數進程按 FIFO 方式調度。 進程運行一個時間片以后,其優(yōu)先數數減 1(即降低一級) ;進程在就緒隊列中等待 3 個時間 片以后,其優(yōu)先數加 1。優(yōu)先數范圍 031。 界面要求: 用戶界面設計不做統(tǒng)一規(guī)定,但應做到界面友好,易于操作。 其他要求: 在設計中須使用 make 工具建立工程。 2 2.設計說明設計說明 2.12.1 需求分析需求分析 根據所有的設計要求和內容分析把整個設計分為三個部分,一個是偽指令的解釋執(zhí)行 程序,二是偽調度算法、系統(tǒng)調用和文件輸入,三是進程的創(chuàng)建及 mian()函數的總體實現。 系統(tǒng)由虛擬內核(VKernel)、

4、命令解釋程序(Commander)、用戶程序(Application) 、編譯 器(Compiler)四部分組成。VKernel 首先運行,并常駐內存。Kernel 啟動后,創(chuàng)建 Commander 進程。根據用戶請求創(chuàng)建多個 Application 進程。Kernel 負責維護 6 個數據結 構,包括時間 (Time), 處理器狀態(tài)(CPUstate),進程表 (PCBTable), 就緒隊列 (ReadyState),等待隊列(BlockedState),運行進程(RunningState) 。Time 是系統(tǒng)時間片。 CPUstate 應包括程序計數器 PC,累加器 A、B,狀態(tài)寄存器

5、F 的值。PCBTable 的每一項是一 個進程的進程控制塊(PCB)。Commander 程序、Application 程序是用 CPU 虛擬指令書寫的 程序。命令解釋程序從標準輸入重復讀入用戶命令,然后以消息形式發(fā)送給內核。命令解釋 程序處理的命令由設計者定義并實現。編譯器把虛擬指令和虛擬系統(tǒng)調用編譯為可執(zhí)行字 節(jié)碼??蓤?zhí)行字節(jié)碼由內核解釋執(zhí)行。 2.22.2 方案設計方案設計 設計分兩步走,先實現一個簡單的虛擬內核,簡單虛擬內核運行無誤后,再在上面擴 展,增加 10 條指令,存放在 cpl 文件夾中。在編寫一個.cpp 程序,具有虛擬內核能并發(fā)執(zhí) 行兩個以上程序,基于優(yōu)先數搶占調度(不含

6、等待態(tài)),指令 10 條以上(含跳轉指令、系統(tǒng)調 用)的功能。在 typedef struct PCB PCB 中,short A 寄存器 A ,int PC 程序計數器 PC,char *addr 程序加載起始地址,int length 程序大小,char name24進程名字,int priority;優(yōu)先級數, 值為 0-31,其中 31 為最高級,int cputime cpu 運行時間,int needtime 還需運行的時間 state process 為 ready,execute,finish 三種狀態(tài) PCB * next。PCB * get_process()用來加載用戶程

7、序;界面采用 void display()函數,讓用戶根據自己的需要輸 入進程名和運行所需的時間;所需時間為 0 的時候進程結束使用函數 int process_finish()判 斷;void cpuexerun() 函數用來執(zhí)行指令其中包含新增加的 10 條指令;void cpuexe()調用 void cpuexerun(),并尋找優(yōu)先級最高的執(zhí)行;在 main()中調用 void priority_cal()將程序運行; 最后將無誤的.cpp 文件和 cpl 文件夾放在同一目錄下,執(zhí)行程序是只需運行.cpp 程序。 3 2.32.3 編碼編碼 2.3.12.3.1 CPUCPU 虛擬指

8、令設計虛擬指令設計 常用的 CPU 虛擬指令 MOV n /把整數 n 賦給累加器 A SAV m /把累加器 A 的值存入地址 M BLK n /累加器 A 為地址的 M 個數傳送到累加器 B 為地址的單元。 ADD n /從累加器 A 的值減去整數 n,結果送到累加器 A。 SUB n /從累加器 A 的值減去整數 n,結果送到累加器 A。 MUL n /從累加器 A 的值乘以整數 n,結果送到累加器 A。 DIV n /從累加器 A 的值除以整數 n,結果送到累加器 A。 JEQ m /F 為 0 跳轉到 m JLG m /F 大于 0 跳轉到 m JLE m /F 大于等于 0 跳轉到

9、 m JMP m /無條件跳轉到 m OUT port /累加器的內容輸出到端口 port。port 為 0,指顯示器;為 1,指揚聲器。 2.3.22.3.2 PCBPCB 棧設計棧設計 PCB 棧的每一項是一個進程的進程控制塊(PCB),它需要定義寄存器、程序計數器、程序加 載起始地址、程序大小以及與進程有關的定義,如:進程名、運行所需要的時間、運行狀 況等等。 PCB 具體設計如下: enum state/四種狀態(tài) ready, execute, finish; typedef struct PCB short A; /寄存器 A int PC; /程序計數器 PC char *addr

10、; /程序加載起始地址 4 int length; /程序大小 char name24;/進程名字 int priority;/優(yōu)先級數, 值為 0-31,其中 31 為最高級 int cputime; /cpu 運行時間 int needtime;/還需運行的時間 state process; PCB * next; PCB; 2.3.32.3.3 輸出設計輸出設計 在程序運行時輸出 cputime,進程名,所需運行時間,優(yōu)先級,累加器結果,運行狀態(tài)。 通過 while()語句將各個值輸出,運行狀態(tài)通過一個 switch()語句輸出 void display(PCB *p) coutname

11、 cputime needtime priority lejia state endl; while(p) coutname; cout ; coutcputime; cout ; coutneedtime; cout ; coutpriority; cout ; coutA; coutprocess)/三種狀態(tài):ready,execute, finish case ready:coutreadyendl;break; case execute:coutexecuteendl;break; case finish:coutfinishnext; 2.3.4cpu2.3.4cpu 執(zhí)行執(zhí)行 首先

12、調用執(zhí)行指令程序 cpuexerun(t),然后判斷進程是否結束,若進程所需時間 為 0 則結束,若所需時間不為 0,尋找優(yōu)先級別高的進程,則將該進程優(yōu)先級減 1,所需時 間減 1,該進程變?yōu)閳?zhí)行狀態(tài),cpu 時間自增 while(q) if (q-process!=finish) q-process=ready; if(q-needtime=0) q-process=finish; if(tppriority t=q; q=q-next; if(t-needtime!=0) t-priority-=1; t-needtime-; t-process=execute; t-cputime+;

13、2.42.4 測試測試 1.歡迎界面 2.創(chuàng)建 3 個進程 6 3.按 enter 后進入 cpu 執(zhí)行界面,優(yōu)先級高的先執(zhí)行,執(zhí)行狀態(tài)為 execute,等待狀態(tài)為 ready 4.每運行一個 cpu 時間比較一次優(yōu)先級,執(zhí)行優(yōu)先級大的進程,若優(yōu)先級相等,則執(zhí)行先 進入的進程 5.needtime 為 0 時則進程狀態(tài)變?yōu)?finish,且優(yōu)先級以后不變,但不參與剩下進程優(yōu)先級 的比較過程 6.所有進程結束后的界面 7 3.3.總結總結 這次的程序設計讓我受益匪淺的。在看到老師給的題目時,第一感覺就是題目都看不 懂,不知道如何下手,但當我慢慢的靜下心來分析,研究老師的程序,并且對照書本上的

14、理論知識,當我把這些只是融合起來的時候,我對于自己的程序還是比較滿意的! 對于這次的課程設計我覺得最重要的便是他的構思,要想編寫一個程序,就要首先是 到這個程序是做什么的,都要有什么樣的功能,各個功能之間又要有什么樣的聯系。一開 始的時候我對于這些沒有頭緒,所以很難下手,后來一遍遍的執(zhí)行老師的程序,再將程序 一點點的改動,觀察改變后程序的變化,這個過程耗費了我大部分的時間。在理解的基礎 之上,我嘗試自己編寫程序,完成了老師的基本功能要求和優(yōu)先級調用,然后再將這些功 能整合起來,通過一個界面來運行程序,最終實現整個程序。 在編程的時候,我虛心請教同學,同學很有耐心為我一一解答疑惑,非常感謝同學的

15、 熱心幫助。在這次課程設計當中,我學到很多,不僅更形象地理解了操作系統(tǒng)這門課程的 理論知識,而且提高了自己的編程能力。希望自己在以后的學習當中,要更加注重培養(yǎng)自 己的動手能力,讓自己不成為理論的奴隸,也為以后走上這個行業(yè)奠定基礎。 8 參考文獻參考文獻 1 Abraham Silberchatz Peter Baer Galvin Greg Gagne(編著).操作系統(tǒng)概念(第 七版 影印版).北京:高等教育出版社.2007.12. 2 孫鐘秀、費翔林、駱斌操作系統(tǒng)(第四版) .高等教育出版社.2008 附錄附錄 A A 程序源代碼程序源代碼 #include 9 #include #incl

16、ude #include #include/控制臺函數,consle 口 #include/文件流 #include #define P_NUM 3 #define P_TIME 31 #define NOP 00/空指令: 消耗一個機器周期 #define MOV 01 /傳送指令:立即數賦值給寄存器 A #define ADD 02 /加法指令:寄存器 A 加立即數 #define SUB 03 /減法指令:寄存器 A 減立即數 #define MUL 04 /乘法指令:寄存器 A 乘以立即數 #define DIV 05 /除法指令 #define JMP 06 /跳轉指令 #defin

17、e OUT 80/輸出指令: 寄存器 A 的值輸出到端口(端口號 01-表示顯示器) #define INC 07 /自增 1 指令 #define AND 11 /與指令: 操作數與寄存器 A 相與 結果放到 A 中 #define ORD 12 / 或指令: 操作數 與寄存器 A 相或 結果放到 A 中 enum state /四種狀態(tài) ready, execute, finish ; typedef struct PCB short A; /寄存器 A int PC; /程序計數器 PC char *addr; /程序加載起始地址 int length; /程序大小 char name2

18、4;/進程名字 int priority;/優(yōu)先級數, 值為 0-31,其中 31 為最高級 int cputime; /cpu 運行時間 int needtime;/還需運行的時間 state process; PCB * next; PCB; PCB * get_process()/加載用戶程序 PCB *pcbTemp; PCB *pcbLast; PCB *pcbFst; int i=0; ifstream fin; fin.open( app1.bin); /打開文件 if(!fin.good() 10 coutopen error!endl; return NULL; fin.se

19、ekg(0, ios:end); int nLen=fin.tellg(); fin.seekg(0, ios:beg); cout輸入要創(chuàng)建進程的名稱和運行所需時間endl; while (ipcbTemp-name; cinpcbTemp-needtime; pcbTemp-cputime=0; pcbTemp-priority=P_TIME-pcbTemp-needtime; pcbTemp-process=ready; pcbTemp-next=NULL; pcbTemp-addr=(char *)malloc(nLen); pcbTemp-A=0;/登記加載信息 pcbTemp-PC

20、=0; pcbTemp-length=nLen;/pcb-length=字節(jié)碼文件長度; fin.seekg(0, ios:beg); fin.read( pcbTemp-addr,nLen); if (i=0) pcbFst=pcbTemp; pcbLast=pcbTemp; else pcbLast-next=pcbTemp; pcbLast=pcbTemp; i+; /while fin.close(); return pcbFst; void display(PCB *p) /輸出 coutname cputime needtime priority state endl; while

21、(p) coutname; cout ; coutcputime; cout ; coutneedtime; cout ; coutpriority; 11 coutprocess)/三種狀態(tài):ready,execute,finish case ready:coutreadyendl;break; case execute:coutexecuteendl;break; case finish:coutfinishnext; int process_finish(PCB *q)/所需時間為 0 的時候進程結束 int bl=1; while(bl q=q-next; return bl; voi

22、d cpuexerun(PCB *q)/執(zhí)行指令 short op_dat; /注意,操作數為 16 位整數,所以要定義為 short char cmd; int i; for(i=0;iaddr+q-PC); /取指令 if(cmd=0 x04) coutillegal instruction.STOP!; coutA=op_dat;/操作數賦給累加器 A else if(cmd=ADD)/加法指令 q-A+=op_dat;/加計算 else if(cmd=SUB) /減法指令 q-A-=op_dat; /減計算 else if(cmd=MUL) /乘法指令 q-A*=op_dat; else if(cmd=DIV) /除法指令 q-A/=op_dat; else if(cmd=JMP) /跳轉指令 if(q-PC+op_dat*3 length else if(cm

溫馨提示

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

評論

0/150

提交評論