華信學(xué)院操作系統(tǒng)實習(xí)銀行家_第1頁
華信學(xué)院操作系統(tǒng)實習(xí)銀行家_第2頁
華信學(xué)院操作系統(tǒng)實習(xí)銀行家_第3頁
華信學(xué)院操作系統(tǒng)實習(xí)銀行家_第4頁
華信學(xué)院操作系統(tǒng)實習(xí)銀行家_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、石家莊經(jīng)濟(jì)學(xué)院華信學(xué)院計算機(jī)操作系統(tǒng)實習(xí)報告(學(xué) 院)系: 電子信息系 專 業(yè): 計算機(jī)科學(xué)與技術(shù)姓 名: 班 級: 學(xué) 號: 指導(dǎo)教師: x 年 x 月 x日目錄一、實驗內(nèi)容1二、實驗?zāi)康?1.數(shù)據(jù)結(jié)構(gòu)設(shè)計22.算法設(shè)計23.程序?qū)崿F(xiàn)及運行結(jié)果8四、實驗總結(jié)13一、實驗內(nèi)容用銀行家算法實現(xiàn)資源分配要求:(1) 設(shè)計一個3個并發(fā)進(jìn)程共享10個同類資源的系統(tǒng),進(jìn)程可動態(tài)地申請資源和釋放資源,系統(tǒng)按各進(jìn)程的申請動態(tài)地分配資源。(2) 設(shè)計用銀行家算法和隨機(jī)分配算法,實現(xiàn)資源分配的兩個資源分配程序,應(yīng)具有顯示或打印各進(jìn)程依次要求申請的資源數(shù)以及依次分配資源的情況。(3) 確定一組各進(jìn)程依次申請資源數(shù)

2、的序列,在相同的情況下分別運行上述兩種資源分配程序,觀察運行結(jié)果。二、實驗?zāi)康木帉懞驼{(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序,觀察死鎖產(chǎn)生的條件,并采用適當(dāng)?shù)乃惴?有效地防止和避免死鎖的發(fā)生.多個進(jìn)程動態(tài)地共享系統(tǒng)的資源可能會產(chǎn)生死鎖現(xiàn)象。死鎖的產(chǎn)生,必須同時滿足四個條件,第一個是互斥條件,即一個資源每次只能由一個進(jìn)程占用;第二個為等待條件,即一個進(jìn)程請求資源不能滿足時,它必須等待,但它仍繼續(xù)保持已得到的所有其它資源;第三個是非出讓條件,任何一個進(jìn)程不能搶占另一個進(jìn)程已經(jīng)獲得且未釋放的資源;第四個為循環(huán)等待條件,系統(tǒng)中存在若干個循環(huán)等待的進(jìn)程,即其中每一個進(jìn)程分別等待它前一個進(jìn)程所持有的資源。防

3、止死鎖的機(jī)構(gòu)只須確保上述四個條件之一不出現(xiàn),則系統(tǒng)就不會發(fā)生死鎖。在實習(xí)中假定系統(tǒng)中任一資源在每一時刻只能則由一個進(jìn)程使用,任何進(jìn)程不能搶占它進(jìn)程正在使用的資源,當(dāng)進(jìn)程得不到資源時必須等待。因此只要資源分配策略能保證進(jìn)程不出現(xiàn)循環(huán)等待,則系統(tǒng)就不會發(fā)生死鎖。本實習(xí)要求學(xué)生編寫和調(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序,觀察死鎖產(chǎn)生的條件,并采用適當(dāng)?shù)乃惴?,有效地防止和避免死鎖的發(fā)生。三、實驗過程1.數(shù)據(jù)結(jié)構(gòu)設(shè)計隨機(jī)算法和銀行家算法中的進(jìn)程的pcbstruct pcbchar name; /進(jìn)程號char state; /狀態(tài) r就緒 f完成int applyall; /資源需求總量int all

4、ocation; /已占用資源量struct pcb * next; 按序分配中的進(jìn)程的pcbstruct pcbchar name; /進(jìn)程號char state; /狀態(tài) r就緒 f完成 d表示申請資源不合法int applynow; /當(dāng)前申請的資源號int applylast; /上次申請的資源號int apply10; /進(jìn)程總共需要申請的資源struct pcb * next;2.算法設(shè)計 算法思想:這個實驗按照要求需要實現(xiàn)三種資源分配的算法,銀行家算法、隨機(jī)分配算法和按序分配算法。銀行家算法要求先判斷申請的資源是否滿足條件(小于進(jìn)程所需求的資源個數(shù)同時還要小于系統(tǒng)可以利用的資源個

5、數(shù)),如果滿足條件就進(jìn)行試分配,然后尋找安全序列;如果存在安全序列則證明試分配可以采用,否則請求不合理。隨機(jī)分配的算法和銀行家大體上差不多,也是想要判斷申請的資源時候滿足條件,如果滿足的話就直接給進(jìn)程分配資源。隨機(jī)分配與銀行家算法的區(qū)別在于隨機(jī)分配會出現(xiàn)死鎖的情況。最后是按序分配,按序分配采取的是摒棄環(huán)路等待的思想來避免死鎖。系統(tǒng)對資源進(jìn)行編號,各個進(jìn)程只能按照順序從小到大的申請資源,如果某一個進(jìn)程為按需申請資源,則它就不能得到申請的資源。同時進(jìn)程每次只能申請一個資源,申請到了新的資源就把上一次申請的資源釋放;如果進(jìn)程申請的資源被占用,則不能申請該資源。在銀行家算法的程序中我一共編寫了四個函數(shù)

6、,pcb * create(struct pcb * a,int n)是初始化進(jìn)程鏈表,即創(chuàng)建n個進(jìn)程,每次創(chuàng)建的進(jìn)程都插到鏈表的末尾,傳入的參數(shù)是結(jié)構(gòu)體鏈表。void show(struct pcb * a)是打印進(jìn)程的情況,傳入的參數(shù)是結(jié)構(gòu)體鏈表。void bank(struct pcb * a, int n)是執(zhí)行銀行家算法,傳入的參數(shù)是結(jié)構(gòu)體鏈表,首先獲取輸入的要申請資源的進(jìn)程名和申請量。然后搜索鏈表查找到對應(yīng)的進(jìn)程并判斷申請是否合理,合理的話進(jìn)行試分配,更改鏈表中對應(yīng)進(jìn)程的參數(shù)。然后進(jìn)行安全型算法。如果存在安全序列則保存試分配后的結(jié)果,否則恢復(fù)試分配之前的狀態(tài)。void random

7、(struct pcb * a)是隨機(jī)分配的函數(shù),傳入的參數(shù)是結(jié)構(gòu)體鏈表。也是先獲取輸入的要申請資源的進(jìn)程名和申請量,然后搜索鏈表查找到對應(yīng)的進(jìn)程并判斷申請是否合理,合理的話就給進(jìn)程分配資源,否則不進(jìn)行分配。在按序分配算法的程序中我一共編寫了四個函數(shù),void init()是初始化系統(tǒng)的資源,系統(tǒng)的10類資源沒有被占用,所以全部付0。pcb * create(struct pcb * a,int n)初始化進(jìn)程鏈表同時進(jìn)行第一次資源分配,傳入的參數(shù)是結(jié)構(gòu)體鏈表。也是依次創(chuàng)建n個進(jìn)程,每次插入到鏈表的末尾。在申請資源時,如果當(dāng)前申請的資源被占用則設(shè)進(jìn)程當(dāng)前申請的資源的值為11,否則設(shè)成申請的資源

8、的序號。void radom(struct pcb * a,int w)是實現(xiàn)按需分配的函數(shù),傳入的參數(shù)是結(jié)構(gòu)體鏈表和進(jìn)程的個數(shù)。我設(shè)置了一個標(biāo)志位來控制分配的過程,先判斷標(biāo)志位,然后在判斷進(jìn)程的狀態(tài),接著查找進(jìn)程申請資源的數(shù)組,如果即將申請的資源未被占用則可以申請,并釋放上次申請的資源,同時還要改變系統(tǒng)資源的狀態(tài)和進(jìn)程自己資源的狀態(tài);否則不能申請,換下一進(jìn)程在申請資源。之后重復(fù)上面的操作。具體的流程圖如下: 開始輸入進(jìn)程號資源需求總量已占資源量判斷資源總量、已占資源量是否都小于10否是創(chuàng)建成功結(jié)束圖3-2-1 創(chuàng)建流程圖1.創(chuàng)建流程圖2.顯示流程圖開始顯示判斷進(jìn)程隊列要顯示的是否為空否是指向

9、下一個結(jié)束圖3-2-2 顯示流程圖是所需資源是否小于當(dāng)前系統(tǒng)可用的否否是否否分配,執(zhí)行改狀態(tài),釋放所占資源結(jié)束該進(jìn)程是否還需要再分配資源執(zhí)行,改狀態(tài)釋放所需資源是該進(jìn)程的狀態(tài)是否為完成狀態(tài)開始判斷當(dāng)前是否有要申請資源的進(jìn)程指向下一個進(jìn)程進(jìn)行掃描圖3-2-4 安全算法是3.安全算法是否是否是是返回判斷所有進(jìn)程處于完成狀態(tài)是否得到全部資源判斷進(jìn)程置進(jìn)程為完成態(tài),回還該進(jìn)程已占用的資源量,更改系統(tǒng)現(xiàn)在可以用的資源量判斷能否找到安全序列找到請求申請資源的進(jìn)程,并給進(jìn)程分配資源,之后修改現(xiàn)在系統(tǒng)已占用的資源當(dāng)前請求的資源不大于系統(tǒng)擁有的資源開始用戶輸入要請求的資源和請求的進(jìn)程否 圖3-2-5 銀行家算法

10、是4.銀行家算法27圖3-2-5 隨機(jī)分配算法3.程序?qū)崿F(xiàn)及運行結(jié)果圖3-3-1 初始化根據(jù)提示首先選擇1初始化進(jìn)程鏈表,輸入創(chuàng)建進(jìn)程的個數(shù)3個。分別按照提示輸入 a 5 2 、b 6 3、c 7 2 。圖3-3-2 a進(jìn)程申請資源程序會顯示一下資源占用的情況。選擇2,用銀行家算法實現(xiàn)資源分配。輸入申請資源的進(jìn)程名為a,申請資源個數(shù)3個。圖3-3-3 b進(jìn)程申請資源程序會先判斷輸入的數(shù)據(jù)是否正確,此時系統(tǒng)剩余資源為3個,a總共需要資源5個,已經(jīng)有2個,剩余需要資源3個。剩余需要資源小于等于系統(tǒng)剩余資源,輸入正確,進(jìn)行試分配。試分配完畢,進(jìn)行安全性算法,并輸出安全序列。a已達(dá)到資源需求總量,狀態(tài)

11、改為完成。圖3-3-4 全部完成狀態(tài)依次輸入b 3、 c 5后,a、b、c全部為完成狀態(tài)。圖3-3-5 c進(jìn)程申請資源按照剛才重新初始化鏈表,輸入c 2。此時系統(tǒng)剩余資源3個,c剩余需要資源5個,剩余需要資源大于系統(tǒng)剩余資源,取消分配。圖3-3-6 安全序列檢測初始化鏈表,a先申請一個資源,成功。b再申請一個資源,此時不成功,取消分配。四、實驗總結(jié) 此次實驗由自己動手編寫,實習(xí)針對于資源分配,通過對申請的響應(yīng),完成對資源分配。每個進(jìn)程所擁有的狀態(tài)有、就緒、等待和完成,對于其進(jìn)程的選擇主要是判斷其狀態(tài)是否允許響應(yīng)申請。 編寫過程中,最初很簡單,憑借對上課時對知識的掌握,很容易編寫出了框架。但知識

12、的漏洞,使得程序的編寫過程中出現(xiàn)了嚴(yán)重的錯誤。 比如,銀行家算法編寫過程中,最初認(rèn)為進(jìn)程尚需資源量即為其所申請的資源,其實不然。此錯誤使得編寫的函數(shù)實現(xiàn)功能僅為一次性完成,無法達(dá)到動態(tài)性。在其基礎(chǔ)上又無法簡單更改,只好重新擬定流程,浪費了寶貴的實習(xí)時間。再者,銀行家算法中的安全性檢查模塊,當(dāng)只有一個進(jìn)程就緒,而且申請資源量使得系統(tǒng)不安全,此時,進(jìn)程的安全標(biāo)志位皆為0,因此無法跳出循環(huán)。為此單獨設(shè)置了一種情況,于是得以正確運行。對于此次實習(xí),對于操作系統(tǒng)的資源分配方面,有了進(jìn)一步的認(rèn)識。對于語言的運用更加明細(xì)與熟練。近兩周的實習(xí),在對調(diào)程序的耐心及對課本知識的運用能力,得以提升。附代碼:#inc

13、lude "stdio.h"#include "stdlib.h"#include "iostream.h"int e; /系統(tǒng)總共可以利用的資源int w; int z;/顯示系統(tǒng)資源剩余總量/隨機(jī)算法和銀行家算法中的進(jìn)程的pcbstruct pcbchar name; /進(jìn)程號char state;/狀態(tài) r就緒 f完成int applyall;/資源需求總量int allocation;/已占用資源量int panduan;struct pcb * next;/創(chuàng)建pcb * create(struct pcb * a,int

14、n) /a表示隊列 n表示進(jìn)程個數(shù) struct pcb *q,*s;s=q=NULL;s=a;for(int i=0;i<n;i+)q=(struct pcb*)malloc(sizeof(struct pcb);printf("請前輸入進(jìn)程號 資源總需求量 已占資源量:n");while(1)cin>>q->name>>q->applyall>>q->allocation;if(q->applyall)<=10)&&(q->allocation)<=10) break;e

15、lseprintf("輸入的有誤,請重新輸入:n");q->state='r'q->panduan=0;e=e-(q->allocation);z=e;q->next=NULL;if(a=NULL)a=s=q;elses->next=q;s=s->next;return a;/顯示void show(struct pcb * a) struct pcb * p;p=a;printf("資源占用情況為:n");printf("進(jìn)程名 資源需求總量 已占用資源量 狀態(tài) n");while

16、(p!=NULL) printf(" %c t %d t%d t %ctn",p->name,p->applyall,p->allocation,p->state);p=p->next;printf("系統(tǒng)資源剩余量為:%dnn",z);/*銀行家算法*/void bank(struct pcb * a, int n) /a 進(jìn)程隊列 n進(jìn)程的個數(shù)int w,lastw,y,l,flag; /l是輸出安全序列的下標(biāo) y是進(jìn)程申請的資源個數(shù) r記錄試分配之前的系統(tǒng)資源個數(shù)flag=0; w=e; /指代當(dāng)前系統(tǒng)可以利用的資源l

17、=0;struct pcb *q,*x; /x用來申請資源的進(jìn)程char t; /記錄要申請進(jìn)程的資源名字 char m 20;q=x=NULL;q=x=a;while(1)x=a;printf("請輸入要申請資源的進(jìn)程的進(jìn)程名和要申請的資源個數(shù):n");cin>>t>>y;for(int i=0;i<n;i+)if(x->name!=t)x=x->next;elsei=n;int a=(x->applyall)-(x->allocation);if(x->panduan=1)printf("此進(jìn)程已經(jīng)運

18、行完畢,請重新輸入:n");else if(y>a)printf("申請資源個數(shù)大于所需資源個數(shù),輸入有誤請重新輸入:n");else if(y>w)printf("申請資源個數(shù)大于系統(tǒng)剩余資源個數(shù),輸入有誤請重新輸入:n");else if(x->panduan=1)printf("此進(jìn)程已經(jīng)運行完畢,請重新輸入:n");elsebreak;/*試分配后的結(jié)果*/q=x=a;printf("試分配后的結(jié)果為:n");printf("進(jìn)程名 資源需求總量 已占用資源量 狀態(tài) 系

19、統(tǒng)可以利用的資源:n");/*把當(dāng)前申請量付給進(jìn)程*/ while(x!=NULL)if(x->name!=t)x=x->next;else (x->allocation)=(x->allocation)+y;w=w-y;e=w;z=e;lastw=w;while(q!=NULL) printf(" %c t %d t%d t %ct %dtn",q->name,q->applyall,q->allocation,q->state,w);q=q->next;printf("-n");brea

20、k;/*進(jìn)行安全性算法*/ printf("進(jìn)行安全性算法n");for(int i=0;i<n;i+)/一趟一趟地掃描q=a;while(q!=NULL)/把當(dāng)前能運行的進(jìn)程運行完,然后釋放資源 if(q->state)!='f') /*不用分配資源的進(jìn)程運行,運行后釋放資源*/if(q->allocation)=(q->applyall)w=w+(q->allocation);e=w;q->state='f'printf(" %c t %d t%d t %ct %dtn",q->

21、;name,q->applyall,q->allocation,q->state,w);ml=q->name;l=l+1;q=q->next;continue;/*"需要的資源數(shù)"小于"當(dāng)前系統(tǒng)可以利用的資源數(shù)"的進(jìn)程運行,運行后釋放資源*/if(q->applyall)-(q->allocation)<=w)q->state='f'ml=q->name;l=l+1;w=w+q->allocation;e=w;printf(" %c t %d t%d t %ct

22、%dtn",q->name,q->applyall,q->allocation,q->state,w);q=q->next;elseq=q->next;w=e;w=e=lastw;/*判斷狀態(tài)*/q=a;while(q!=NULL)if(q->state!='f')flag=1;printf("找不到安全序列,資源分配不合理,取消分配n");/*把當(dāng)前申請量付給進(jìn)程*/x=a;while(x!=NULL)if(x->name!=t)x=x->next;else(x->allocation)

23、=(x->allocation)-y;w=w+y;z=w;break;show(a);e=w;return ;elseq=q->next;printf("安全序列為:n"); /輸出安全序列for(i=0;i<l;i+)printf("%c ",mi);if(flag=0)/flag=0 代表還有未完成的進(jìn)程x=a;while(x!=NULL) /把當(dāng)前申請量付給進(jìn)程if(x->name!=t)x=x->next;elseif(x->allocation)=(x->applyall)w=x->allocat

24、ion;break;printf("n試分配成功!nn");x=a;while(x!=NULL)if(x->allocation)=(x->applyall)&&(x->panduan=0)z=z+x->allocation;x->panduan=1;if(x->allocation)!=(x->applyall)x->state='r'x=x->next;show(a);e=w=z;return ;cout<<endl;e=w;/*隨機(jī)分配算法*/void random(st

25、ruct pcb * a)int w,y,flag; /y是進(jìn)程申請的資源個數(shù) w暫存系統(tǒng)可以利用的資源的個數(shù)flag=1; w=e; /指代當(dāng)前系統(tǒng)可以利用的資源struct pcb *q,*x; /x用來申請資源的進(jìn)程char t; /記錄要申請進(jìn)程的資源名字q=x=NULL; q=x=a;while(1)printf("請輸入要申請資源的進(jìn)程的進(jìn)程名和要申請的資源個數(shù):n");cin>>t>>y;int a=(x->applyall)-(x->allocation);if(y>a)printf("申請資源個數(shù)大于所需

26、資源個數(shù),請重新輸入:n");else if(y>w)printf("申請資源個數(shù)大于系統(tǒng)剩余資源個數(shù),請重新輸入:n");elsebreak;/*把當(dāng)前申請量付給進(jìn)程并顯示*/while(x!=NULL)if(x->name!=t)x=x->next;else (x->allocation)=(x->allocation)+y;w=w-y;if(w=0)&&(x->allocation)!=(x->applyall)printf("出現(xiàn)死鎖,系統(tǒng)現(xiàn)在已無可以利用的資源n");show(a);break;if(x->allocation)=(x->applyall)

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論