版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 操作系統(tǒng)課程設(shè)計(jì)</b></p><p><b> 說 明 書</b></p><p> 2013 年 11月 6 日</p><p><b> 1 需求分析</b></p><p> 基于Linux的進(jìn)程同步與通信的模擬實(shí)現(xiàn)需要完成以下功
2、能:</p><p> (1)創(chuàng)建進(jìn)程:手動(dòng)創(chuàng)建幾個(gè)進(jìn)程,或者隨即創(chuàng)建幾個(gè)進(jìn)程,都在界面上完成;要求包括進(jìn)程的名稱(不能重復(fù))、執(zhí)行時(shí)間和申請(qǐng)資源的等待時(shí)間等。在同一時(shí)刻可能有多個(gè)進(jìn)行在內(nèi)存申請(qǐng)某資源,即可以輸入多個(gè)進(jìn)程的資源申請(qǐng)。</p><p> ?。?)3類臨界資源的管理,包括申請(qǐng)以及分配等。分別通過信號(hào)量實(shí)現(xiàn)或者管程實(shí)現(xiàn)。 </p><p> ?。?
3、)銀行家算法,判斷是否可以進(jìn)行資源的分配。</p><p> 基于以上的功能,可以使用戶選擇操作,模擬臨界資源的管理和銀行家算法。</p><p> 目的:實(shí)現(xiàn)臨界資源的管理及死鎖的避免。</p><p><b> 總體設(shè)計(jì)</b></p><p> 進(jìn)程同步與模擬實(shí)現(xiàn)系統(tǒng)分為4個(gè)模塊:輸入輸出,進(jìn)程對(duì)資源的隨機(jī)
4、申請(qǐng)及分配,臨界資源管理,銀行家算法避免死鎖。</p><p> 輸入輸出:包括系統(tǒng)運(yùn)行所需要的進(jìn)程的名稱,執(zhí)行時(shí)間,申請(qǐng)資源的等待時(shí)間,進(jìn)程對(duì)資源的需要量等信息以及系統(tǒng)所要顯示出的進(jìn)程的創(chuàng)建信息,資源的分配信息,進(jìn)行執(zhí)行信息,進(jìn)行動(dòng)態(tài)申請(qǐng)資源信息等。</p><p> 進(jìn)程對(duì)資源的隨機(jī)申請(qǐng)及分配:根據(jù)所輸入的進(jìn)程、資源、以及進(jìn)程對(duì)資源的最大申請(qǐng)情況,隨機(jī)產(chǎn)生進(jìn)程當(dāng)前對(duì)資源的申請(qǐng),輸出
5、相應(yīng)的分配信息與進(jìn)程執(zhí)行信息并調(diào)用銀行家算法對(duì)進(jìn)程的資源申請(qǐng)進(jìn)行判斷。</p><p> 臨界資源的管理:創(chuàng)建相應(yīng)個(gè)數(shù)的進(jìn)程,完成進(jìn)程的并發(fā)執(zhí)行,使用互斥信號(hào)量使各進(jìn)程互斥的進(jìn)入各自的臨界區(qū)對(duì)資源進(jìn)行申請(qǐng),進(jìn)程執(zhí)行完畢后,互斥的對(duì)資源進(jìn)行恢復(fù)。</p><p> 銀行家算法避免死鎖:對(duì)當(dāng)前進(jìn)程對(duì)資源的申請(qǐng)利用銀行家算法進(jìn)行判斷,看系統(tǒng)分配后是否處于安全狀態(tài),若處于安全狀態(tài),則將資源分配
6、給進(jìn)程,并輸出分配信息,否則對(duì)不予以分配。</p><p><b> 3.詳細(xì)設(shè)計(jì)</b></p><p> 在該系統(tǒng)中我主要實(shí)現(xiàn)了銀行家算法中隨機(jī)分配的模塊,該模塊中主要使用了數(shù)組的數(shù)據(jù)結(jié)構(gòu).</p><p> 3.1隨機(jī)分配算法:</p><p> 3.1.1首先:定義了一個(gè)結(jié)構(gòu)體y其中放置了Max數(shù)組中申請(qǐng)
7、資源量大于0的資源。(包括進(jìn)程下標(biāo),資源下標(biāo),進(jìn)程是否對(duì)資源申請(qǐng)過的信號(hào)量,該資源是否已經(jīng)被申請(qǐng)完的信號(hào)量)。再定義一個(gè)數(shù)組col[]。用來存放第m個(gè)進(jìn)程中過濾(去除申請(qǐng)資源量為0)的資源數(shù)。</p><p> 3.1.2 (1)遍歷Max數(shù)組對(duì)二維Y數(shù)組和一維col數(shù)組進(jìn)行初始化:生成一個(gè)去除了申請(qǐng)量為0的新的二維結(jié)構(gòu)體數(shù)組(記錄有進(jìn)程下標(biāo)和資源下標(biāo))。col中放置新的Y數(shù)組對(duì)應(yīng)的信息(每個(gè)進(jìn)程申請(qǐng)資源數(shù))。
8、</p><p> 還可以進(jìn)行遍歷,篩選并記錄各進(jìn)程對(duì)所有資源的最大申請(qǐng)量大于0的元素信息3.2數(shù)據(jù)結(jié)構(gòu)</p><p> struct zy {</p><p> char type; //資源的名稱</p><p> int n; //資源的數(shù)量</p><p><b> };</b>
9、;</p><p> struct jc {</p><p> char name; //名稱</p><p> int runtime; //執(zhí)行時(shí)間</p><p> int waittime; //等待時(shí)間</p><p> int typenum; //進(jìn)程所申請(qǐng)的資源數(shù)</p><
10、;p> struct zy r[5]; //所申請(qǐng)資源的信息</p><p><b> };</b></p><p> struct y {</p><p> int flag; //標(biāo)志,0:未出現(xiàn)過的資源,(進(jìn)程a申請(qǐng)資源B 1個(gè)資源B 1個(gè))1:該資源已申請(qǐng)</p><p> int index;
11、//資源下標(biāo)</p><p> int tr; //進(jìn)程的下標(biāo)</p><p> int flag1; //1:該資源不能再申請(qǐng);0:該資源還可以申請(qǐng)</p><p> } Y[10][NUM];</p><p> struct jc JC[5];</p><p> struct zy ZY[NUM]; //
12、每種資源的名稱及數(shù)量</p><p><b> 3.3核心代碼</b></p><p> //對(duì)整個(gè)二維數(shù)組Y進(jìn)行遍歷</p><p> int judge_pro(int m, int p[10]) {</p><p><b> int i, j;</b></p><p
13、> for (i = 0; i < m; i++) {</p><p> for (j = 0; j < p[i]; j++) {</p><p> if (!(Y[i][j].flag1)) {</p><p><b> return 1;</b></p><p> } //只要有1個(gè)進(jìn)程的
14、1種資源未申請(qǐng)完,則返回1</p><p><b> }</b></p><p><b> }</b></p><p> return 0; //僅當(dāng)所有進(jìn)程對(duì)資源的申請(qǐng)都達(dá)到所需量時(shí)才返回0</p><p><b> }</b></p><p>
15、; //對(duì)二維數(shù)組中的某一行(對(duì)應(yīng)某種進(jìn)程)進(jìn)行遍歷</p><p> int panduan1(int tr, int p[10]) {</p><p><b> int i;</b></p><p> for (i = 0; i < p[tr]; i++) {</p><p> if (!(Y[tr]
16、[i].flag1))</p><p> return 0; //該進(jìn)程只要有1個(gè)資源未申請(qǐng)完,則返回0</p><p><b> }</b></p><p> return 1; //僅當(dāng)該進(jìn)程所有資源都申請(qǐng)完時(shí)返回1</p><p><b> }</b></p><p
17、> //產(chǎn)生隨機(jī)進(jìn)程和進(jìn)程所申請(qǐng)的資源,并調(diào)用銀行家算法</p><p> int ra() {</p><p> int col[10];</p><p> int i, j, k = 0, w = 0, m = 0, n = 0, q = 0; //k記錄最大需求矩陣中數(shù)目不為0的元素個(gè)數(shù)</p><p> printf(
18、"\n");</p><p> if (u == 0 || a == 0) {</p><p> printf("請(qǐng)先輸入信息!\n");</p><p><b> return 0;</b></p><p><b> }</b></p>
19、<p> //對(duì)Max數(shù)組進(jìn)行遍歷,篩選并記錄各進(jìn)程對(duì)所有資源的最大申請(qǐng)量大于0的元素信息</p><p> for (i = 0; i < u; i++) {</p><p> for (j = 0; j < a; j++) {</p><p> if (Max[i][j]) {</p><p> Y[m]
20、[n].index = j; //index記錄資源下標(biāo)</p><p> Y[m][n].tr = i; //tr記錄進(jìn)程下標(biāo)</p><p> Y[m][n].flag = 0; //flag=1:所記錄的資源已申請(qǐng)過,flag=0:所記錄的資源尚未申請(qǐng)</p><p> Y[m][n].flag1 = 0; //flag1=1:進(jìn)程對(duì)該資源的申請(qǐng)已達(dá)到所
21、需量,flag=0:還未達(dá)到所需量</p><p><b> n++;</b></p><p><b> }</b></p><p><b> }</b></p><p> col[m] = n; //數(shù)組col記錄二維數(shù)組Y的每一行的列數(shù)</p><
22、;p> n = 0; //對(duì)n進(jìn)行恢復(fù),以便下次循環(huán)</p><p><b> m++;</b></p><p><b> }</b></p><p> //只要有資源未申請(qǐng)完就執(zhí)行循環(huán)</p><p> while (judge_pro(m, col)) {</p>
23、<p> int _one = 0;</p><p><b> int tr;</b></p><p> //若該進(jìn)程所有資源都申請(qǐng)完,則執(zhí)行循環(huán)</p><p><b> do {</b></p><p> tr = rand() % m;</p><p&g
24、t; } while (panduan1(tr, col)); //</p><p> printf("%c進(jìn)程申請(qǐng)\n", JC[Y[tr][0].tr].name);</p><p> int x = col[tr];</p><p> //若有資源申請(qǐng)完,則使x減1</p><p> for (i = 0;
25、 i < col[tr]; i++) { //處理函數(shù).</p><p> if (Y[tr][i].flag1)</p><p><b> x--;</b></p><p><b> }</b></p><p> //用x保證循環(huán)次數(shù),使該進(jìn)程隨機(jī)產(chǎn)生對(duì)各資源的申請(qǐng)量</p&g
26、t;<p> for (i = 0; i < x; i++) {</p><p> //該進(jìn)程對(duì)當(dāng)前資源</p><p><b> do {</b></p><p> j = rand() % (col[tr]); //j表示Y[][]的第tr行的資源下標(biāo)</p><p> while (_
27、one == j) {</p><p> j = rand() % (col[tr]); //j表示Y[][]的第tr行的資源下標(biāo)</p><p><b> }</b></p><p><b> _one = j;</b></p><p> } while (Y[tr][j].flag &a
28、mp;& Y[tr][j].flag1);</p><p><b> /*</b></p><p> flag=0;flag1=0代表當(dāng)前資源既沒申請(qǐng)過也沒申請(qǐng)完</p><p> flag=1;flag1=0代表當(dāng)前資源已申請(qǐng)過,但沒申請(qǐng)完</p><p> flag=0;flag1=1代表當(dāng)前資源沒申
29、請(qǐng)過,但申請(qǐng)完(不存在這種可能)</p><p> flag=1;flag1=1代表當(dāng)前資源已申請(qǐng)過,同時(shí)申請(qǐng)完</p><p><b> */</b></p><p> Y[tr][j].flag = 1; //改進(jìn)程的當(dāng)前資源標(biāo)志為已申請(qǐng)過</p><p> printf("%c資源",
30、ZY[Y[tr][j].index].type);</p><p><b> w = 1</b></p><p><b> + rand()</b></p><p> % (Max[tr][Y[tr][j].index]</p><p> - Allocation[tr][Y[tr][j].
31、index]);</p><p> printf("%d個(gè)", w);</p><p> Request[Y[tr][0].tr][Y[tr][j].index] = w; //將申請(qǐng)的資源信息賦給Request數(shù)組</p><p><b> }</b></p><p> printf(&qu
32、ot;\n");</p><p> request(Y[tr][0].tr, col[tr], tr); //調(diào)用銀行家算法</p><p> if (panduan1(tr, col)) {</p><p> printf("進(jìn)程%c已執(zhí)行完畢!", JC[Y[tr][0].tr].name);</p><p
33、><b> }</b></p><p><b> }</b></p><p> //所有進(jìn)程執(zhí)行完成后,對(duì)資源數(shù)目進(jìn)行恢復(fù)</p><p> if (!(judge_pro(m, col))) {</p><p> for (i = 0; i < a; i++) {</p
34、><p> Allocation[j][i] = 0;</p><p> Need[j][i] = Max[j][i] - Allocation[j][i];</p><p><b> }</b></p><p><b> }</b></p><p><b>
35、 return 0;</b></p><p><b> }</b></p><p><b> 3.4運(yùn)行結(jié)果</b></p><p><b> 圖3.4.1</b></p><p><b> 圖3.4.2</b></p>
36、<p><b> 圖3.4.3</b></p><p><b> 圖3.4.4</b></p><p><b> 圖3.4.5</b></p><p><b> 圖3.4.6</b></p><p><b> 圖3.4.7&l
37、t;/b></p><p><b> 圖3.4.8</b></p><p><b> 圖3.4.9</b></p><p><b> 圖3.4.10</b></p><p><b> 圖3.4.11</b></p><p&
38、gt;<b> 4.心得體會(huì)</b></p><p> 經(jīng)過這次的操作系統(tǒng)課程設(shè)計(jì),讓我經(jīng)歷了一次有意義的項(xiàng)目開發(fā)過程,讓我了解了團(tuán)隊(duì)合作的重要性,起初我們只是在不停的各干各的,發(fā)現(xiàn)根本不可能完成預(yù)期的任務(wù),后來我們坐下來討論了系統(tǒng)的功能,然后各司其職,發(fā)現(xiàn)效果真的不一樣,雖然在這兩周的時(shí)間里我們做了很多,中間也遇到了一些問題,比如說臨界資源管理模塊和銀行家模塊怎樣結(jié)合起來,起初是將兩個(gè)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)1
- 基于linux的實(shí)現(xiàn)進(jìn)程的信號(hào)量互斥申請(qǐng)操作系統(tǒng)課程設(shè)計(jì)說明書2
- 操作系統(tǒng)課程設(shè)計(jì)---信號(hào)量的操作
- 《操作系統(tǒng)》課程設(shè)計(jì)--基于信號(hào)量與pv操作同步機(jī)制的讀者寫者問題的設(shè)計(jì)與實(shí)現(xiàn)
- linux操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程的創(chuàng)建
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---進(jìn)程調(diào)度的模擬實(shí)現(xiàn)
- linux課程設(shè)計(jì)報(bào)告--linux操作系統(tǒng)應(yīng)用
- 操作系統(tǒng)課程設(shè)計(jì)linux系統(tǒng)管理實(shí)踐與進(jìn)程通信實(shí)現(xiàn)
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)說明書--基于linux的進(jìn)程之間通信
- 操作系統(tǒng)進(jìn)程調(diào)度課程設(shè)計(jì)
- 操作系統(tǒng)模擬進(jìn)程課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬操作系統(tǒng)的實(shí)現(xiàn)
- 進(jìn)程之間的同步互斥與通信理發(fā)師問題操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程調(diào)度子系統(tǒng)模擬實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--基于linux的模擬文件系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論