版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 操作系統(tǒng)程序設計</b></p><p> 院 系: 計算機科學技術學院軟件工程系 </p><p> 班 級: 軟件 08 – 1 班 </p><p> 姓 名: X X </p><p
2、> 學 號: X 號 </p><p> 指導教師: X X X </p><p> 2010 年6月 26日</p><p> 操作系統(tǒng)程序設計任務書</p><p> 一、題目:操作系統(tǒng)模擬實現(xiàn)</p><
3、p><b> 二、設計要求</b></p><p><b> (1)獨立完成</b></p><p> (2)良好的交流、溝通能力</p><p> (3)充分運用前序課所學的軟件工程、程序設計等相關知識</p><p> (4)充分運用調試和排錯技術</p><
4、p> (5)簡單測試驅動模塊和樁模塊的編寫 </p><p> (6)查閱相關資料,自學具體課題中涉及到的新知識。</p><p> ?。?)按要求寫出課程設計報告,并于設計結束后1周內(nèi)提交。其主要內(nèi)容包括:封皮、課程設計任務書,指導教師評語與成績、目錄、概述、軟件需求分析、總體設計、詳細設計、程序的調試與測試、總結與體會、結束語、程序清單(帶中文注釋)、參考文獻等。</p
5、><p><b> 三、設計內(nèi)容及步驟</b></p><p> 1.根據(jù)設計題目的要求,充分地分析和理解問題,明確問題要求做什么。具體要求至少實現(xiàn)進程管理模擬、存儲器管理模擬、文件管理模擬,并將幾個模塊較好地集成一個整體,給出一個較好的用戶界面。</p><p> 2.根據(jù)實現(xiàn)的功能,劃分出合理的模塊,明確模塊間的關系。</p>
6、<p> 3.編程實現(xiàn)所設計的模塊。</p><p> 4.程序調試與測試。</p><p> 5.結果分析。程序運行結果包括正確的輸入及其輸出結果和含有錯誤的輸入及其輸出結果。</p><p> 6.編寫課程設計報告;</p><p> 四、課程設計工作計劃</p><p> 2010年6月
7、12日前,指導教師講課,學生根據(jù)題目準備資料,需求分析;</p><p> 2010年6月13日,提交軟件總體模塊結構圖和分工方案;</p><p> 2010年6月13日~2009年6月16日,完成程序模塊并通過獨立編譯;</p><p> 2010年6月17日~2010年6月20日,將各模塊集成為一個完整的系統(tǒng),并錄入足夠的數(shù)據(jù)進行調試運行,數(shù)據(jù)必須存儲到
8、磁盤文件中,已備驗收;</p><p> 2010年6月22日,驗收、開始撰寫課程設計報告;</p><p> 2010年6月24日前,提交課程設計報告,并將軟件的源文件及報告的word文檔打印交到老師辦公室里。 </p><p> 指導教師簽章: </p><p> 教研室主任簽章
9、 </p><p> 操作系統(tǒng)導教師評語與成績</p><p><b> 目 錄</b></p><p><b> 目 錄I</b></p><p><b> 一、需求分析1</b></p><p> 1.1 功能需求1&l
10、t;/p><p> 1.2 背景描述1</p><p> 1.3 具體設計內(nèi)容分析1</p><p> 二、總體概要設計3</p><p> 2.1 系統(tǒng)的特點3</p><p> 2.2抽象數(shù)據(jù)整合3</p><p> 2.3系統(tǒng)模塊圖5</p><p&
11、gt;<b> 三、詳細設計6</b></p><p><b> 3.1基本操作6</b></p><p> 3.2進程調度之時間片輪轉詳細設計7</p><p> 3.3 模擬文件--改變目錄流程10</p><p> 四、程序的調試與測試13</p><p
12、> 4.1調試分析13</p><p> 4.2 測試結果14</p><p> 五、用戶使用說明19</p><p> 六、總結與體會20</p><p><b> 參考文獻21</b></p><p> 附錄:程序清單22</p><p>
13、<b> 一、需求分析</b></p><p><b> 1.1 功能需求</b></p><p> 《操作系統(tǒng)原理》課程設計是軟件工程專業(yè)實踐性環(huán)節(jié)之一,是學習完《操作系統(tǒng)原理》課程后進行的一次較全面的綜合練習。其目的在于加深對操作系統(tǒng)的理論、方法和基礎知識的理解,掌握操作系統(tǒng)結構、實現(xiàn)機理和各種典型算法,進程調度、內(nèi)存管理、文件管理、等
14、各種調度管理算法模擬,系統(tǒng)地了解操作系統(tǒng)的設計和實現(xiàn)思路,培養(yǎng)學生的系統(tǒng)設計能力,并了解操作系統(tǒng)的發(fā)展動向和趨勢。</p><p><b> 1.2 背景描述</b></p><p> 經(jīng)過一個學期的《操作系統(tǒng)原理》、《操作系統(tǒng)實驗教程》課程的學習,我們學到了很多理論上的知識,對操作系統(tǒng)及其各方面的功能有了深刻的認識,但這是遠遠不夠的,我們要講理論編程實踐,雖然我
15、們學習期間做過很多的實驗,但是都是針對操作系統(tǒng)的某一塊具體的功能的,我們對了解了每塊具體的功能的實現(xiàn),但是,整體說來還是模糊,所以,很有必要將各個模塊整合起來,也就是模擬一個操作系統(tǒng),這樣,不僅跟深入學習了各個模塊,更認識了一個完整的OS,對我們來說受益匪。</p><p> 1.3 具體設計內(nèi)容分析</p><p> 本次課程設計所用環(huán)境:VC++6.0,采用控制臺界面至少實現(xiàn)進程管
16、理模擬、存儲器管理模擬、文件管理模擬,并將幾個模塊較好地集成一個整體,實現(xiàn)各個管理調度算法的功能,并給出一個較好的用戶界面。</p><p> 進程管理模擬:在多道程序運行環(huán)境下,進程數(shù)目一般多于處理機數(shù)目,是的進程要通過競爭來使用處理機。這就要求系統(tǒng)能按某種屬案發(fā),動態(tài)的把處理機分配給就緒隊列中的一個進程,使之運行。進程調度包括常用的:先來先服務、時間片輪轉、優(yōu)先權等因為以前已經(jīng)實現(xiàn),所以這次 模擬整合到一起
17、不算很難。</p><p> 存儲器管理模擬:主存是中央處理器直接存取指令和數(shù)據(jù)的存儲器,能否合理的利用主存,在很大程度上將影響到整個計算機系統(tǒng)的性能。在多道作業(yè)和多進程環(huán)境下,共享主存空間。當作業(yè)執(zhí)行完畢或進程運行結束后將主存空間歸還系統(tǒng)。這次模擬包括:貯存分配與回收、基于分頁的內(nèi)存調度算法。有于模擬的比較簡單,僅實現(xiàn)了最先適應算法、和先來先服務、最近你最久未使用的調度算法,實現(xiàn)比較簡單。</p>
18、<p> 文件管理模擬:用于用戶界面和操作命令在操作系統(tǒng)中的作用,實現(xiàn)操作系統(tǒng)中對文件的管理。文件中建立一個雙向鏈表,每個聊表節(jié)點又是單鏈表的頭結點,對目錄、文件操作比較簡單。</p><p><b> 二、總體概要設計</b></p><p><b> 2.1 系統(tǒng)的特點</b></p><p>
19、本次可設主要是簡單的模擬一個操作系統(tǒng),包括一個主界面,實現(xiàn)了銀行家算法、模擬文件管理、主存空間的分配與回收、進程調度等功能。模擬了操作系統(tǒng)的進程管理、文件管理、存儲器管理。銀行家算法,包括了新加作業(yè)、申請資源、撤銷作業(yè)、查看資源情況四個模塊。如果申請資源后系統(tǒng)進入不安全狀態(tài),則申請失敗。進程調度實現(xiàn)了調度進程的三個主要算法——優(yōu)先數(shù)、先來先服務、時間片輪轉法。其中,優(yōu)先數(shù)算法中優(yōu)先數(shù)的確定為(50-進程的服務時間),每輪一次優(yōu)先數(shù)-3。
20、時間片輪轉法的時間片由用戶自己輸入。存儲器管理實現(xiàn)了申請空間、撤銷作業(yè)、顯示空閑表等功能。如果空閑空間不足則申請失敗。模擬文件管理很全面,包含了創(chuàng)建目錄、刪除目錄、改變目錄、創(chuàng)建文件、刪除文件、顯示目錄的功能。另外,我還加了回到根目錄的功能。</p><p><b> 2.2抽象數(shù)據(jù)整合</b></p><p><b> 銀行家算法:</b>
21、</p><p> const int MAX_P=20; // 進程的最大容量</p><p> const int MAXA=10; // A類資源的最大數(shù)量</p><p> const int MAXB=5; //B類資源的最大數(shù)量</p><p> const int MAXC=7; //C類資源的最大數(shù)量<
22、;/p><p> typedef struct anode</p><p><b> {</b></p><p> int a,b,c,/*三種資源總數(shù)*/remain_a,remain_b,remain_c/*三種資源剩余數(shù)*/; </p><p><b> }bank;</b>
23、</p><p> typedef struct node1</p><p><b> {</b></p><p> char name[20];</p><p> int a,b,c,need_a,need_b,need_c; </p><p> }process;
24、// 進程的結構體結點</p><p><b> 模擬文件管:</b></p><p> typedef struct bnode</p><p><b> {</b></p><p> char name[50];</p><p> int type;/*0代表
25、目錄,1代表普通文件*/</p><p> struct bnode *next,/* 兄弟節(jié)點*/*sub,/*第一個子節(jié)點*/*father/*父節(jié)點*/;</p><p> int size; /*文件的大小*/</p><p><b> }dirnode;</b></p><p> dirn
26、ode *workdir;//當前工作目錄 </p><p> dirnode root;//根目錄 </p><p> char path[100];//定義路徑信息 </p><p> const int MAXJOB = 100;//定義最大記錄數(shù)</p><p><b> 存儲器管理:</b></p
27、><p> 首先需要建立空閑區(qū)數(shù)據(jù)文件,空閑區(qū)數(shù)據(jù)文件包括若干行,每行有兩個字段:起始地址,內(nèi)存塊大?。ň鶠檎麛?shù)),各自段一逗號隔開。空閑區(qū)數(shù)據(jù)文件:</p><p><b> 0,10</b></p><p><b> 10,08</b></p><p><b> 18,10<
28、/b></p><p><b> 28,06</b></p><p><b> 34,10</b></p><p><b> 44,09</b></p><p><b> 空閑表的結構:</b></p><p> t
29、ypedef struct cnode{</p><p> int start;</p><p> int length;</p><p> char tag[20];</p><p><b> }job; </b></p><p> job frees[MAXJOB];//定義空閑區(qū)表
30、 </p><p> int free_quantity;</p><p> job occupys[MAXJOB];</p><p> int occupy_quantity;</p><p><b> 進程調度:</b></p><p> 進程存在的標識是進程控制塊(PCB),進程控
31、制塊結構如下:</p><p> typedef struct dnode{</p><p> char name[10];</p><p><b> int prio;</b></p><p> int round;</p><p> int cputime;</p>&
32、lt;p> int needtime;</p><p> int count;</p><p> char state;</p><p> struct dnode *next;</p><p> }PCB; // 進程的PCB</p><p> PCB *finish,*ready,*run,*
33、r;</p><p><b> 2.3系統(tǒng)模塊圖</b></p><p><b> 圖 1 系統(tǒng)模塊圖</b></p><p><b> 三、詳細設計</b></p><p><b> 3.1基本操作</b></p><p>
34、; 1)銀行家算法:銀行家算法主要由5個函數(shù)實現(xiàn)了四大功能,即新加作業(yè)、為作業(yè)申請資源、撤銷作業(yè)、查看資源情況。</p><p> void yinitial(){} //初始化函數(shù)</p><p> void add(){} // 新加作業(yè)函數(shù)</p><p> void bid(){} //為作業(yè)申請資源</p><p> v
35、oid yfinished(){}//撤銷作業(yè)</p><p> void yview(){}//查看資源情況</p><p> 2)模擬文件管理:模擬文件管理實現(xiàn)了很多功能,當然也有很多函數(shù),每一個文件和目錄都是用一個節(jié)點來描述的,用type來控制,有兩個值,0和1,0代表目錄,1代表普通文件</p><p> void minitial(){} //初始
36、化目錄函數(shù)</p><p> dirnode * init(){} //初始化新節(jié)點的函數(shù)</p><p> void CD(char dirname[]){} //改變目錄</p><p> void CREATE(char filename[],int filesize){} //創(chuàng)建文件</p><p> void DEL(
37、char filename[]){}//刪除文件</p><p> void dir(dirnode *p){} //現(xiàn)實所有目錄,本目錄下所有兄弟目錄和文件</p><p> void dirs(dirnode *p,char str[]){}//顯示由目錄下子目錄中的文件和目錄</p><p> void LSALL(){}//顯示所有目錄</p&g
38、t;<p> void MD(char dirname[]){}//創(chuàng)建目錄</p><p> void RD(char dirname[]){}//刪除目錄</p><p><b> 3)存儲器管理:</b></p><p> void initial(){}//初始化函數(shù)</p><p> i
39、nt readData(){}//讀數(shù)據(jù)函數(shù)</p><p> void sort(){}//將空閑塊按照從小到大的順序排序</p><p> void zview(){}//顯示函數(shù)</p><p> void earlist(){}//最先適應分配算法</p><p> void zfinished(){}//撤銷作業(yè)</p
40、><p><b> 4)進程調度:</b></p><p> void firstin(){}//調度進程使之運行</p><p> void prt1(char a){}/*</p><p> void prt2(char a ,PCB *q){}</p><p> void prt(ch
41、ar algo){}*/</p><p> 上面的三本分主要是顯示出來進程的調度情況</p><p> void insert1(PCB *q){}//插入新的進程</p><p> void creat1(char alg){}/*</p><p> void creat2(char alg){}*/</p><
42、p> 以上兩個實現(xiàn)進程的創(chuàng)建</p><p> void priority(char alg){}//優(yōu)先數(shù)算法的實現(xiàn)</p><p> void roundrun(char alg){}//時間片輪轉法的實現(xiàn)</p><p> void FCFSrun(char alg){}//先來先服務算法的實現(xiàn)</p><p> voi
43、d xianshi()/{}/顯示主界面的函數(shù)</p><p> void yinhangjia(){}//主函數(shù)掉該函數(shù)實現(xiàn)銀行家算法</p><p> void wenjianguanli(){}//主函數(shù)調度該函數(shù)實現(xiàn)文件管理</p><p> void zhucunkongjian(){}//主函數(shù)調度該函數(shù)實現(xiàn)存儲器管理</p><
44、;p> void jinchengdiaodu(){}//主函數(shù)調度該函數(shù)實現(xiàn)進程調度</p><p> 3.2進程調度之時間片輪轉詳細設計</p><p> 進程調度中對于先來先服務調度原理簡單、實現(xiàn)也很簡單、對于優(yōu)先數(shù)調度來講,每次調度的就是優(yōu)先權最高的,所以每次只要找到優(yōu)先權最高的就能實現(xiàn),用到2個單鏈表:一個等待服務、一個連接完成。在這里就不多說了。</p>
45、<p> 對于時間片輪轉,可以設定時間片大小、中途不能改變,我就建立一個循環(huán)鏈表來存放等待進程,一個單鏈表來連接完成的進程。這個實現(xiàn)的時候,費了不少勁兒,但最終能沒有bug的顯示出來。這個調度有一個缺陷:要求進程必須是同時到達,由于時間倉促,我就沒設計這個內(nèi)容。如果涉及的話,我感覺能整出來無非是多加個標記,標簽來判斷進程的到達及服務。</p><p> 忘了說了,對于時間片算法,進程我是按順序進
46、行插入的。</p><p><b> 主要核心代碼:</b></p><p> void creat2(char alg)</p><p><b> {</b></p><p><b> PCB *p;</b></p><p> int i,t
47、ime,round;</p><p> char na[10];</p><p> ready = NULL;</p><p> finish = NULL;</p><p> run = NULL;</p><p> printf("請輸入時間片:");</p><p
48、> scanf("%d",&round);</p><p> printf("輸入進程號和運行時間:\n");</p><p> for(i = 1; i <= N; i++)</p><p><b> {</b></p><p> p = (PCB
49、*)malloc(sizeof(PCB));</p><p> scanf("%s",na);</p><p> scanf("%d",&time);</p><p> strcpy(p->name,na);</p><p> p->cputime = 0;</p>
50、;<p> p->needtime = time;</p><p> p->state = 'W';</p><p> p->count = 0;</p><p> p->round = round;</p><p> p->next = NULL;</p>
51、<p> if(i == 1)/*按順序插入到ready鏈表中*/</p><p> r = ready = p;</p><p><b> else</b></p><p> r->next = p;</p><p><b> r = p; </b></p&g
52、t;<p><b> }</b></p><p> //clrscr();</p><p> printf(" 時間片輪轉算法輸出信息:\n");</p><p> printf("*****************************************\n");&
53、lt;/p><p><b> prt(alg);</b></p><p><b> }</b></p><p> void roundrun(char alg)</p><p><b> {</b></p><p> bool flag;//當re
54、ady列里只有一個時做標記 </p><p><b> while(N){</b></p><p> flag = 1;//初始化為1 </p><p> run = ready;//run每次運行ready的隊頭 </p><p> run->count++;//沒運行一次計數(shù)器加1 </p>
55、<p> if(run->needtime < run->round)//當剩余時間小于時間片輪轉時間時的情況 </p><p><b> {</b></p><p> run->cputime += run->needtime;</p><p> run->needtime = 0;&
56、lt;/p><p><b> }</b></p><p><b> else{</b></p><p> run->cputime += run->round;</p><p> run->needtime -= run->round; </p><
57、p><b> }</b></p><p> run->state = 'W';//變?yōu)榈却?</p><p> if(ready->next != NULL)</p><p> ready = ready->next;</p><p> else flag = 0;//
58、當ready剩一個時做標記 </p><p> if(run->needtime == 0){//當run結束時放入finish隊列里 </p><p> run->next = finish;</p><p> finish = run;</p><p> run->state = 'F';<
59、/p><p> N--;//進程數(shù)少1 </p><p><b> }</b></p><p><b> else{</b></p><p> if(flag){//執(zhí)行完如果不是剩一個的話,就把run放到隊尾 </p><p> r->next = run;&l
60、t;/p><p><b> r = run;</b></p><p> r->next = NULL; </p><p><b> }</b></p><p><b> }</b></p><p> if(N)ready->state
61、= 'R';//結束時不應該有'R" </p><p><b> else</b></p><p> ready = NULL;//結束時應該為空 </p><p> prt(alg);//輸出 </p><p><b> }</b></p>
62、<p><b> }</b></p><p> 截圖顯示:圖 A、B、C。</p><p> 圖A 時間片輪轉算法界面</p><p> 圖B 時間片輪轉算法開始</p><p> 圖C 時間片輪轉運行結束</p><p> 3.3 模擬文件--改變目錄流程</p>
63、;<p> 由于模擬文件管理采用雙向鏈表,可以來回搜索。進入子目錄后還可以回到根目錄,所以就在程序加了返回到上一級目錄的功能,就是在CD()函數(shù)里加個條件,控制回到子目錄還是上級目錄。</p><p><b> 主要代碼:</b></p><p> void CD(char dirname[])</p><p><b&
64、gt; {</b></p><p> dirnode *p;</p><p> int flag=0;</p><p> if(strcmp(dirname,"..")){</p><p> p=workdir->sub;</p><p> if(p==NULL)<
65、;/p><p> cout<<"錯誤,\""<<dirname<<"\"子目錄不存在"<<endl;</p><p><b> else</b></p><p><b> {</b></p><
66、p><b> while(p)</b></p><p><b> {</b></p><p> if(p->type==0)</p><p><b> {</b></p><p> if(!strcmp(p->name ,dirname))</
67、p><p><b> {</b></p><p><b> flag=1;</b></p><p> break; </p><p><b> } </b></p><p><b> }
68、</b></p><p> p=p->next;</p><p><b> }</b></p><p> if(flag==1)</p><p><b> {</b></p><p> workdir=p;</p><p>
69、 strcat(path,"\\");</p><p> strcat(path,p->name);</p><p> cout<<"工作目錄已進入\""<<dirname<<"\""<<endl; </p><
70、p><b> }</b></p><p><b> else</b></p><p> cout<<"錯誤,\""<<dirname<<"\"子目錄不存在"<<endl; </p><p><b&g
71、t; } </b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(strcmp(workdir->name,"root"))&l
72、t;/p><p><b> {</b></p><p> workdir = workdir->father;</p><p> for(int i = strlen(path)-1; i >= 0; i--)</p><p><b> {</b></p><p&
73、gt; if(path[i] =='\\')</p><p> {path[i] = '\0';break;}</p><p><b> }</b></p><p> cout<<"工作目錄已進入\""<<path<<"\&quo
74、t;"<<endl; </p><p><b> }</b></p><p><b> else</b></p><p> cout<<"錯誤,"<<"當前已是根目錄"<<endl; </p><p&
75、gt;<b> }</b></p><p><b> }</b></p><p> 模塊流程圖:如圖所示</p><p> 四、程序的調試與測試</p><p><b> 4.1調試分析</b></p><p> ?。?)在試驗過程中遇到了很多
76、錯誤,最開始的時候,在將各個模塊連接起來的時候幾個函數(shù)的名字一樣,出現(xiàn)了錯誤,如圖:</p><p><b> 圖 3錯誤顯示</b></p><p> 后來將函數(shù)的名字都改變了一下。</p><p> ?。?)在主函數(shù)中將各個模塊的主函數(shù)連起來的時候,退出來的時候整個程序就結束了,而我是想推出來的時候是退回到主界面,后來又給改了一下,加了
77、一個while循環(huán),還有變量flag,有flag來控制,當flag=0的時候就跳出while循環(huán),然后清屏,掉一個編好的顯示函數(shù),顯示主界面,這樣就退回了主界面,后來又發(fā)現(xiàn)主函數(shù)有很多東西,很亂,我又將每個模塊的主函數(shù)部分又分出去一個函數(shù),這樣主函數(shù)掉每個模塊的原來的主函數(shù)部分就好了。</p><p> ?。?)在內(nèi)存調度算法中由于windows里面沒有getpid()函數(shù)不了解rand()就用結果造成卻也計算率
78、也來小。如圖:</p><p> 圖 4 內(nèi)存調度算法FIFO中無getpid()錯誤</p><p><b> 4.2 測試結果</b></p><p><b> 可設主界面:如圖</b></p><p><b> 圖 5 設計主界面</b></p>&
79、lt;p><b> 銀行家算法:</b></p><p> 圖 6 銀行界算法主界面</p><p><b> 新加作業(yè):</b></p><p><b> 圖7 添加作業(yè)</b></p><p><b> 查看資源情況:</b></
80、p><p> 圖 8 資源使用情況</p><p><b> 為作業(yè)申請資源:</b></p><p><b> 圖9 申請資源</b></p><p><b> 撤銷作業(yè):</b></p><p><b> 圖10 撤銷作業(yè)</b
81、></p><p><b> 模擬文件管理:如圖</b></p><p><b> 創(chuàng)建目錄:</b></p><p> 圖 11 模擬文件管理界面</p><p><b> 改變目錄:</b></p><p><b> 圖12
82、 改變目錄</b></p><p><b> 回到上一級目錄:</b></p><p> 圖13 返回上一級目錄</p><p><b> 顯示目錄:</b></p><p> 圖14 顯示所有目錄</p><p> 存儲器管理模擬:如圖</p&g
83、t;<p><b> 顯示空閑表:</b></p><p> 圖15 顯示空閑區(qū)分配表</p><p><b> 申請空間:</b></p><p><b> 圖 16 申請空間</b></p><p><b> 進程調度模擬:</b&g
84、t;</p><p><b> 優(yōu)先數(shù)算法:</b></p><p><b> 圖17 優(yōu)先數(shù)算法</b></p><p><b> 時間片輪轉法:</b></p><p> 圖18 時間片輪轉法</p><p><b> 先來先服務
85、算法:</b></p><p> 圖19 先來先服務算法</p><p><b> 五、用戶使用說明</b></p><p> 這次的課程設計實驗主要是模擬一個操作系統(tǒng)的各個功能算法,重點在于算法的描述,應用。當運行的時候會出現(xiàn)一個主界面,上面列出了該系統(tǒng)主要實現(xiàn)的功能,可以根據(jù)提示選擇1.、進程調度2、貯存空間分配與回收3、
86、模擬文件管理4、內(nèi)存調度算法 5、銀行家算法 6、 退出系統(tǒng)。選擇完后就進入該模塊,如果選擇的是1即銀行家算法,進去后界面也會有提示,1、新加作業(yè),2,、為作業(yè)申請資源3、撤銷作業(yè)4、查看資源情況、0退出系統(tǒng),選擇你想要操作的。會提示你相應的操作。如果選擇的是2即模擬文件管理,進入后也有界面給予提示,但是這個模塊有先后順序,即應該先創(chuàng)建目錄,之后在進行其他操作,我還加入了一個額外的功能,如果輸入cd .. 就會回到上一級目錄里。如果選擇
87、的是3,即存儲器管理,這個模塊首先要在改程序在同一目錄下建立一個空閑表,進入該模塊后首先要輸入改空閑表,例如,input.txt,如果該空閑表存在的話就會繼續(xù)往下進行,根據(jù)提示做想要實現(xiàn)的操作。如果選擇的是4,即進程調度,進入后可以選擇P、優(yōu)先數(shù)算法,R、時間片輪轉法 F、先來先服務算法、E退出時間片輪轉法的時間片由用戶來定。這些模塊中的退出都是退到主界面的</p><p><b> 六、總結與體會&
88、lt;/b></p><p> 這次課程設計對我來說獲益很大、體會很深,通過這次課程設計將所學的操作系統(tǒng)課程的知識用于實踐,對所學的知識有了系統(tǒng)的了解、更深刻。在將各個模塊連起來過正中首先要對各個模塊都深入了解,不僅復習了所學的,以前不明白的現(xiàn)在明白了好多,而且對“操作系統(tǒng)”不再陌生,但是“操作系統(tǒng)“所要做的絕不是這么少的,所學的這些是遠遠不夠的,希望還能有更深的了解。</p><p&
89、gt; 這次課程設計讓我我熟練的練習了VC++6.0環(huán)境,更讓那個我了解和運用 了linux操作系統(tǒng),了解了OS內(nèi)核結構,核心操作,以及最基本的OS管理。對以后學習有很大幫助。</p><p> 這次課程設計給我了很大的啟示:無論學什么都要一步一個腳印,不能前面開始學很有勁頭,后面就松懈了,要持之以恒。感謝老師耐心的教導,您認真的態(tài)度對我們很有幫助、很親切,但對我來說是提升自身,我想我的IT之路還沒走完,會有
90、更深入的學習。再次感謝老師!</p><p><b> 參考文獻</b></p><p> [1] 李登實,徐宏云,計算機操作系統(tǒng)實驗,北京,清華大學出版社,2000年9月。</p><p> [2]湯小丹,梁紅兵,計算機操作系統(tǒng),西安,西安電子科技大學出版社,2007年5月。</p><p><b>
91、 附錄:程序清單</b></p><p><b> 源碼附錄:</b></p><p> #include<stdio.h></p><p> #include<string.h></p><p> #include<iostream></p><
92、;p> using namespace std;</p><p> #include<stdlib.h></p><p> #include<conio.h></p><p> #include<math.h></p><p> const int MAX_P=20;</p>
93、<p> const int MAXA=10;</p><p> const int MAXB=5;</p><p> const int MAXC=7;</p><p> typedef struct anode</p><p><b> {</b></p><p> in
94、t a,b,c,/*三種資源總數(shù)*/remain_a,remain_b,remain_c/*三種資源剩余數(shù)*/; </p><p><b> }bank;</b></p><p> typedef struct node1</p><p><b> {</b></p><p>
95、 char name[20];</p><p> int a,b,c,need_a,need_b,need_c; </p><p><b> }process;</b></p><p> bank banker;</p><p> process processes[MAX_P];</p>
96、;<p> int quantity;//作業(yè)的數(shù)量 </p><p> typedef struct bnode</p><p><b> {</b></p><p> char name[50];</p><p> int type;/*0代表目錄,1代表普通文件*/</p>&
97、lt;p> struct bnode *next,/* 兄弟節(jié)點*/*sub,/*第一個子節(jié)點*/*father/*父節(jié)點*/;</p><p> int size; /*文件的大小*/</p><p><b> }dirnode;</b></p><p> dirnode *workdir;//當前工作目錄 <
98、;/p><p> dirnode root;//根目錄 </p><p> char path[100];//定義路徑信息 </p><p> const int MAXJOB = 100;//定義最大記錄數(shù)</p><p> typedef struct cnode{</p><p> int start;&l
99、t;/p><p> int length;</p><p> char tag[20];</p><p><b> }job; </b></p><p> job frees[MAXJOB];//定義空閑區(qū)表 </p><p> int free_quantity;</p>&
100、lt;p> job occupys[MAXJOB];</p><p> int occupy_quantity;</p><p> typedef struct dnode{</p><p> char name[10];</p><p><b> int prio;</b></p><
101、;p> int round;</p><p> int cputime;</p><p> int needtime;</p><p> int count;</p><p> char state;</p><p> struct dnode *next;</p><p>&
102、lt;b> }PCB;</b></p><p> PCB *finish,*ready,*run,*r;</p><p><b> int N;</b></p><p><b> //銀行家算法 </b></p><p><b> //初始化函數(shù)</b&g
103、t;</p><p> void yinitial()</p><p><b> {</b></p><p><b> int i;</b></p><p> banker.a=MAXA;</p><p> banker.b=MAXB;</p><
104、;p> banker.c=MAXC;</p><p> banker.remain_a=MAXA;</p><p> banker.remain_b=MAXB;</p><p> banker.remain_c=MAXC; </p><p> for(i=0;i<MAX_P;i++)</p><
105、;p><b> {</b></p><p> strcpy(processes[i].name,"");</p><p> processes[i].a=0;</p><p> processes[i].b=0; </p><p> processes[i].c=0; </p&g
106、t;<p> processes[i].need_a=0; </p><p> processes[i].need_b=0; </p><p> processes[i].need_c=0; </p><p><b> }</b></p><p><
107、b> } </b></p><p><b> //新加作業(yè)</b></p><p> void add()</p><p><b> {</b></p><p> char name[20];</p><p> int flag=0,t,need
108、_a,need_b,need_c,i;</p><p> cout<<endl;</p><p> cout<<"新加作業(yè)" <<endl;</p><p> cout<<"----------------------------------"<<endl;&l
109、t;/p><p> cout<<"請輸入新加作業(yè)名:";</p><p> cin>>name;</p><p> for(i=0;i<quantity;i++)</p><p><b> {</b></p><p> if(!strcmp(
110、processes[i].name,name))</p><p><b> {</b></p><p> flag=1;break; </p><p> } </p><p><b> }
111、 </b></p><p><b> if(flag)</b></p><p><b> {</b></p><p> cout<<"錯誤,作業(yè)以存在"<<endl; </p><p><b> }</b
112、></p><p><b> else</b></p><p><b> {</b></p><p> cout<<"本作業(yè)所需A類資源:";</p><p> cin>>need_a;</p><p> cout&
113、lt;<"本作業(yè)所需B類資源:";</p><p> cin>>need_b;</p><p> cout<<"本作業(yè)所需C類資源:" ;</p><p> cin>>need_c; </p><p><b> t=1;</b>&l
114、t;/p><p> if(need_a>banker.remain_a )</p><p><b> {</b></p><p> cout<<"錯誤,所需A類資源大于銀行家所剩A類資源"<<endl;</p><p> t=0;
115、 </p><p><b> } </b></p><p> if(need_b>banker.remain_b )</p><p><b> {</b></p><p> cout<<"錯誤,所需B類資源大于銀行家所剩B類資源"<&
116、lt;endl;</p><p> t=0; </p><p><b> } </b></p><p> if(need_c>banker.remain_c )</p><p><b> {</b></p><p&
117、gt; cout<<"錯誤,所需C類資源大于銀行家所剩C類資源"<<endl;</p><p> t=0; </p><p><b> } </b></p><p><b> if(t)</b></p>&
118、lt;p><b> {</b></p><p> strcpy(processes[quantity].name,name);</p><p> processes[quantity].need_a=need_a; </p><p> processes[quantity].need_b=need_b;</p>&l
119、t;p> processes[quantity].need_c=need_c;</p><p> quantity++;</p><p> cout<<"新加作業(yè)成功"<<endl;</p><p><b> }</b></p><p><b> el
120、se</b></p><p><b> {</b></p><p> cout<<"新加作業(yè)失敗"<<endl;</p><p><b> }</b></p><p><b> }</b></p>&
121、lt;p><b> } </b></p><p><b> //為作業(yè)申請資源</b></p><p> void bid()</p><p><b> {</b></p><p> char name[20];</p><p> in
122、t i,p,a,b,c,flag;</p><p> cout<<endl<<"為作業(yè)申請資源"<<endl;//輸出 </p><p> cout<<"----------------------------------" <<endl;</p><p> c
123、out<<"要申請資源作業(yè)名:"; </p><p> cin>>name;//輸入</p><p><b> p=-1;</b></p><p> for(i=0;i<quantity;i++)</p><p><b> {</b><
124、/p><p> if(!strcmp(processes[i].name,name))</p><p> {p=i;break;} </p><p><b> } </b></p><p> if(p!= -1)</p><p><b&
125、gt; {</b></p><p> cout<<"該作業(yè)要申請A資源的數(shù)量:";</p><p> cin>>a; </p><p> cout<<"該作業(yè)要申請B資源的數(shù)量:";</p><p> cin>>b;
126、 </p><p> cout<<"該作業(yè)要申請C資源的數(shù)量:";</p><p><b> cin>>c; </b></p><p><b> flag=1;</b></p><p> if((a>banker.remain_
127、a)||(a>processes[p].need_a-processes[p].a))</p><p><b> {</b></p><p> cout<<"錯誤,所申請A類資源大于銀行家所剩A類資源或該進程還需數(shù)量"<<endl;</p><p> flag=0;
128、 </p><p><b> } </b></p><p> if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b))</p><p><b>
129、 {</b></p><p> cout<<"錯誤,所申請B類資源大于銀行家所剩A類資源或該進程還需數(shù)量"<<endl;</p><p> flag=0; </p><p><
130、;b> } </b></p><p> if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c))</p><p><b> {</b></p><p> cout<<"錯誤,所申請A類資源大于銀行家所剩
131、A類資源或該進程還需數(shù)量"<<endl;</p><p> flag=0; </p><p><b> } </b></p><p><b> if(flag)</b>&
132、lt;/p><p><b> {</b></p><p> banker.remain_a-=a; </p><p> banker.remain_b-=b; </p><p> banker.remain_c-=c; </p><p> processes[p].a+=a;</p
133、><p> processes[p].b+=b;</p><p> processes[p].c+=c; </p><p> cout<<"為作業(yè)申請資源成功"<<endl; </p><p> } </p><p><b> els
134、e</b></p><p> cout<<"為作業(yè)申請資源失敗"<<endl;</p><p><b> }</b></p><p><b> else</b></p><p> cout<<"改作業(yè)不存在&quo
135、t;<<endl;</p><p><b> }</b></p><p><b> //撤銷作業(yè)</b></p><p> void yfinished()</p><p><b> {</b></p><p> char name
136、[20];</p><p><b> int i,p;</b></p><p> cout<<endl<<"撤銷作業(yè)"<<endl;</p><p> cout<<"----------------------------------" <<
137、;endl;</p><p> cout<<"要撤銷作業(yè)名:";</p><p> cin>>name; </p><p><b> p=-1;</b></p><p> for(i=0;i<quantity;i++)</p><p>&
138、lt;b> {</b></p><p> if(!strcmp(processes[i].name,name))</p><p><b> {</b></p><p> p=i;break; </p><p> }
139、 </p><p><b> } </b></p><p><b> if(p!=-1)</b></p><p><b> {</b></p><p> banker.remain_a+=processes[p].a; </p&
140、gt;<p> banker.remain_b+=processes[p].b; </p><p> banker.remain_c+=processes[p].c;</p><p> for(i=p;i<quantity-1;i++)</p><p> processes[i]=processes[i+1];</p>&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)程序設計-操作系統(tǒng)模擬實現(xiàn)
- 操作系統(tǒng)課程設計——操作系統(tǒng)課程設計模擬操作系統(tǒng)
- 操作系統(tǒng)課程設計--模擬操作系統(tǒng)的實現(xiàn)
- 操作系統(tǒng)課程設計-- 操作系統(tǒng)
- 操作系統(tǒng)課程設計--進程調度程序設計
- 操作系統(tǒng)程序調度課程設計報告
- 模擬操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計報告--頁面置換算法模擬程序設計
- 操作系統(tǒng)課程設計報告--頁面置換算法模擬程序設計
- 操作系統(tǒng)課程設計報告
- 課程設計報告--操作系統(tǒng)
- 操作系統(tǒng)課程設計報告
- 《操作系統(tǒng)》課程設計報告
- 操作系統(tǒng)課程設計報告
- 操作系統(tǒng)課程設計報告
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設計
- 操作系統(tǒng)課程設計---geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)課程設計-- geekos操作系統(tǒng)的研究與實現(xiàn)
- 操作系統(tǒng)模擬進程課程設計
- 操作系統(tǒng)課程設計
評論
0/150
提交評論