2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  計算機科學(xué)與工程學(xué)院</p><p><b>  綜合設(shè)計報告</b></p><p>  設(shè)計名稱: 操作系統(tǒng)綜合設(shè)計 </p><p>  設(shè)計題目: 進程死鎖 </p><p>  學(xué)生學(xué)號:

2、 </p><p>  專業(yè)班級: </p><p>  學(xué)生姓名: </p><p>  學(xué)生成績: </p><p>  指導(dǎo)教師(職稱): 張立(講師)

3、 </p><p>  完成時間: 15年6月8日 至 15年6 月12日 </p><p><b>  答辯記錄表</b></p><p>  成績評定 </p><p><b>  目錄</b></p><p>  摘 要……………………

4、………………………………………………………………… I</p><p>  第一章 課題概述…………………………………………………………………………1</p><p>  1.1 課題背景………………………………………………………………………………1</p><p>  1.2 課題意義………………………………………………………………………………1</p

5、><p>  第二章 設(shè)計簡介及設(shè)計方案論述 ………………………………………………………2</p><p>  2.1 設(shè)計描述………………………………………………………………………………2</p><p>  2.2 設(shè)計思想………………………………………………………………………………2</p><p>  2.3 設(shè)計要求……………

6、…………………………………………………………………2</p><p>  2.4 設(shè)計流程圖 …………………………………………………………………………3</p><p>  第三章 詳細設(shè)計…………………………………………………………………………4</p><p>  3.1 銀行家算法的算法思想…………………………………………………………………4<

7、/p><p>  3.2 安全性檢查算法 ……………………………………………………………………4</p><p>  3.3算法整體設(shè)計與調(diào)用 …………………………………………………………………5</p><p>  第四章 設(shè)計結(jié)果及分析 …………………………………………………………………6</p><p>  4.1 程序輸入部

8、分 …………………………………………………………………………6</p><p>  4.3 資源分配成功結(jié)果輸出…………………………………………………………………7</p><p>  4.4 資源分配失敗結(jié)果輸出…………………………………………………………………8</p><p>  總 結(jié)……………………………………………………………………………………

9、8</p><p>  致 謝……………………………………………………………………………………9</p><p>  參考文獻…………………………………………………………………………………10</p><p>  附錄:………………………………………………………………………………………11</p><p><b>  摘

10、 要</b></p><p>  銀行家算法是一個避免死鎖的著名算法,是由艾茲格·迪杰斯特拉在1965年為T.H.E系統(tǒng)設(shè)計的一種避免死鎖產(chǎn)生的算法。它以銀行借貸系統(tǒng)的分配策略為基礎(chǔ),判斷并保證系統(tǒng)的安全運行。在銀行家算法執(zhí)行過程中,首先判斷申請資源的進程所申請的資源數(shù)目是否合法,若是合法的,則可以為其進行試分配,再利用安全性算法求出安全序列,如果存在安全序列,則說明可以給申請資源的進程分配

11、資源,分配成功,繼續(xù)為其它進程服務(wù)。如果找不到安全序列,則說明為該進程分配資源后系統(tǒng)會進入不安全狀態(tài),所以不能為該進程分配資源,使該進程進入阻塞狀態(tài)。若申請資源的進程申請的資源數(shù)目不合法,則不需要進行試分配,直接使其進入阻塞狀態(tài),處理其他申請資源的進程。</p><p>  關(guān)鍵詞:計算機操作系統(tǒng);安全性算法;銀行家算法 </p><p><b>  Abstract</b

12、></p><p>  Banker algorithm is a famous algorithm to avoid deadlock, by Ezra pound, dijkstra in 1965 to T.H.E system design of a kind of avoid deadlock algorithm. It is based on bank lending system alloca

13、tion strategy, determine and ensure the safe operation of the system. In the execution of a banker algorithm, first determine the number to apply for the application of the process of resources is legal, if it is legal,

14、you can try to carry out distribution, recycling security algorithm and security sequen</p><p>  Keywords:Banker algorithm;OS;Security algorithm</p><p><b>  課題概述</b></p><p

15、><b>  1.1 課題背景</b></p><p>  在預(yù)防死鎖的各種算法中,總的來說,都是施加了較強的限制條件,從而使實現(xiàn)簡單,但卻嚴重地損害了系統(tǒng)的性能。在避免死鎖的算法中,施加的條件較較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)處于安全狀態(tài),便可避免死鎖的發(fā)生。</p><p>  最具有代表性的避

16、免死鎖的算法是Dijkstra的銀行家算法。這是因為該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名,在這一次的課程設(shè)計中就要對銀行家算法從分析到實現(xiàn),整體做一個詳細的描述。</p><p><b>  1.2 課題意義</b></p><p>  從課程設(shè)計上講,該課程設(shè)計可以提高自己的分析問題,解決問題和動手能力,并對銀行家算法有更深刻的理解。</p>&l

17、t;p>  從銀行家算法上本身講,通過算法可以判斷系統(tǒng)的安全性,對申請資源的進程進行限制,從而避免系統(tǒng)進入死鎖狀態(tài)。</p><p>  第二章 設(shè)計簡介及設(shè)計方案論述</p><p><b>  2.1 設(shè)計描述</b></p><p>  當(dāng)系統(tǒng)在進行資源管理時,如果對進城申請的資源分配不當(dāng),可能會使系統(tǒng)進入死鎖狀態(tài),因而后面到來的

18、進程也無法順利執(zhí)行。銀行家算法中,要對當(dāng)前申請資源的進程申請資源的數(shù)目進行判斷,如果可以試分配,則試求出一個安全序列,如果可以求出,則說明給這個進程分配資源后系統(tǒng)不會進入不安全狀態(tài),將該進程申請的資源分配給他,若求不出安全序列,則說明將資源分配給該進程后系統(tǒng)會進入不安全狀態(tài),所以就使該進程進入阻塞狀態(tài),等待以后可以分配資源時再執(zhí)行該進程,然后系統(tǒng)繼續(xù)服務(wù)其它進程。通過這樣一個過程,可以有效避免系統(tǒng)進入死鎖狀態(tài)。</p>&

19、lt;p><b>  2.2 設(shè)計思想</b></p><p>  在避免死鎖的算法中,允許進程動態(tài)地申請資源,系統(tǒng)在進行資源分配之前,先計算資源分配的安全性。若此次分配不會使系統(tǒng)進入不安全狀態(tài),便將資源分配給該進程否則進程等待。所謂安全狀態(tài)是指系統(tǒng)能按某種順序如<p1,p2,……,pn>,就這樣來為每個進程分配資源,直至最大需求。使每個進程都可以順序地執(zhí)行完畢。若系統(tǒng)不存

20、在這樣一個安全序列,那么系統(tǒng)此時會進入不安全狀態(tài)。雖然并非所有的不安全狀態(tài)都會產(chǎn)生死鎖狀態(tài),但當(dāng)系統(tǒng)進入不安全狀態(tài)后,便可能進而進入死鎖狀態(tài);反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可避免進入死鎖狀態(tài)。因此,避免死鎖的實質(zhì)在于,如何使系統(tǒng)不進入不安全狀態(tài),銀行家算法就是用來判斷某種情況會不會進入不安全狀態(tài)。</p><p><b>  2.3 設(shè)計要求</b></p><p&g

21、t; ?。?)對各個進程的進程名,最大需求資源,已分配資源,系統(tǒng)可用資源等進行的輸入。</p><p>  (2)對申請資源的進程要有合法性判斷(如進程名,申請資源數(shù)等)。</p><p> ?。?)若有進程申請資源,首先要對它申請的資源數(shù)進行判斷。</p><p> ?。?)在上面判斷合法的前提下進行試分配,利用銀行家算法求出安全序列。如果可以求出安全序列,則為該

22、進程分配資源,否則使它進入阻塞狀態(tài)。</p><p><b>  2.4 設(shè)計流程圖</b></p><p><b>  不安全</b></p><p><b>  安全</b></p><p><b>  不</b></p><p&g

23、t;<b>  安</b></p><p><b>  全</b></p><p><b>  否</b></p><p><b>  安全</b></p><p><b>  是</b></p><p>  

24、圖2.4 程序總體流程圖</p><p><b>  第三章 詳細設(shè)計</b></p><p>  3.1 銀行家算法的算法思想</p><p>  先對用戶提出的請求進行合法性檢查,即檢查請求的是不大于需要的,是否不大于可利用的。若請求合法,則進行試分配。最后對試分配后的狀態(tài)調(diào)用安全性檢查算法進行安全性檢查。若安全,則分配,否則,不分配,恢

25、復(fù)原來狀態(tài),拒絕申請。</p><p>  當(dāng)進程i發(fā)出申請資源請求: </p><p>  (1)調(diào)用分配檢查函數(shù)檢查申請量是否不大于需求量再檢查檢查申請量是否小于系統(tǒng)中的可利用資源數(shù)量:若條件不符重新輸入,不允許申請大于需求量。</p><p>  (2)若以上條件都滿足,則系統(tǒng)試探著將資源分配給申請的進程,并修改Available,Allocation和Nee

26、d中的數(shù)值。</p><p>  3.2 安全性檢查算法</p><p>  首先設(shè)置變量:工作數(shù)組Work,它表示系統(tǒng)可提供給進程繼續(xù)運行所需的各類資源數(shù)目,在執(zhí)行安全性算法開始時,Work[]= Available[]。Finish[],它表示系統(tǒng)是否有足夠的資源分配給每個進程,使之運行完成。開始時先做Finish[i]=0;當(dāng)有足夠的資源分配給進程時,再令Finish[i]=1。&l

27、t;/p><p>  然后再在進程中查找符合以下條件的進程:</p><p>  條件1:Finish[i]=0;</p><p>  條件2:Need[i][j]<=Work[j]</p><p>  若找到,則執(zhí)行步驟(3)否則,執(zhí)行步驟(4)。</p><p>  當(dāng)進程獲得資源后,可順利執(zhí)行,直至完成,并釋放

28、出分配給它的資源,故應(yīng)執(zhí)行:</p><p>  Work[j]= Work[j]+ Allocation[i][j];</p><p>  Finish[i]=1;</p><p>  最后循環(huán)檢查是否所有的Finish[i]=1都滿足,如果是,則返回1表示系統(tǒng)處于安全狀態(tài),否則,返回0表示系統(tǒng)處于不安全狀態(tài)。</p><p>  3.3算

29、法整體設(shè)計與調(diào)用</p><p>  主函數(shù)void main(),首先輸入每個進程信息,然后判斷是否有進程申請資源,若有,則調(diào)用int check_distribution(int* p,int k)函數(shù)判斷是否可以進行試分配,如果滿足試分配條件,調(diào)用int check_safe()函數(shù)求安全序列,如果可以求出安全序列,則說明分配后系統(tǒng)不會進入不安全狀態(tài),正式將資源分配給申請資源的進程,最后用void pri

30、nt()函數(shù)輸出分配資源后每個進程的信息。如果求不出安全序列,說明分配后系統(tǒng)會處于不安全狀態(tài),則不能將資源分配給該進程,讓其等待,系統(tǒng)恢復(fù)原始狀態(tài)。如果申請資源的數(shù)量不滿足條件,則讓該進程等待。繼續(xù)判斷其他申請資源的進程。</p><p><b>  其他函數(shù):</b></p><p>  (1)int check_distribution(int* p,int k)

31、:這個函數(shù)用來判斷是否可以進行試分配,如果函數(shù)結(jié)果返回1,說明可以進行試分配,如果函數(shù)返回0,說明申請資源的進程申請的資源數(shù)目不滿足Request []<=need[]或Request []<=available[]條件,不能為該進程進行試分配。</p><p>  (2)int check_safe():這個函數(shù)用來求安全序列,首先初始化Work[0][i]= Available[i],然后循環(huán)找滿

32、足條件 Finish[i]==0 && Need[i][0] <= Work[k][0]的進程,k表示最近執(zhí)行的進程的進程號,找到后將進程i 加入sequence[]數(shù)組,再將Finish[i]=1,表示進程可以順利執(zhí)行則Work[k][j]=Work[k-1][j]+Allocation[i][j],k表示同上。再繼續(xù)找下一個滿足條件的進程。如果單循環(huán)結(jié)束時每個進程的Finish[i]都等于1,則說明可以找到安全

33、序列,返回1,如果不是每個Finish[i]都等于1,則說明找不到一個安全序列,返回0</p><p>  ( 3 ) void print():這個函數(shù)用來輸出進程信息,按表格形式輸出,并且輸出順序和安全序列相同,便于查看進程執(zhí)行的執(zhí)行過程,并且在執(zhí)行過程中各矩陣信息變化也很容易跟蹤查看。</p><p>  第四章 設(shè)計結(jié)果及分析</p><p>  4.1

34、程序輸入部分</p><p>  圖4.1 程序輸入部分</p><p>  如圖4.1所示,輸入進程名向量processnema[N],輸入系統(tǒng)現(xiàn)有各類資源數(shù)量Available[M]向量,輸入每個進程對各類資源的最大需求數(shù)Max[N][M]矩陣,輸入系統(tǒng)給每個進程已分配的各類資源數(shù)Allocation[N][M]矩陣。</p><p>  4.2 輸出資源分配矩

35、陣</p><p>  圖4.2 輸出資源分配矩陣</p><p>  進程信息輸入完成后,初始狀態(tài)各進程信息輸出如圖4.2所示。</p><p>  4.3 資源分配成功結(jié)果輸出</p><p>  圖4.3 資源分配成功結(jié)果</p><p>  如果申請資源的進程申請的資源數(shù)目滿足試分配條件,則再用check_sa

36、fe()函數(shù)來求試分配后的安全序列,如果可以求出安全序列,則說明這次分配不會使系統(tǒng)進入不安全狀態(tài),正式將資源分配給該進程,修改系統(tǒng)資源信息。如果求不出安全序列,說明這次分配后系統(tǒng)會進入不安全狀態(tài),不能給該進程分配資源,系統(tǒng)恢復(fù)初始狀態(tài),打印出提示信息,執(zhí)行結(jié)果如圖4.3所示。</p><p>  4.4 資源分配失敗結(jié)果輸出</p><p>  圖4.4 資源分配失敗結(jié)果</p>

37、;<p>  由圖4.1、圖4.2、圖4.3、圖4.4運行結(jié)果舉例可以看出本系統(tǒng)界面簡潔明了大方,而且在人機交互上化繁為簡。結(jié)果輸出準確無誤,自然得體,讓用戶一目了然。</p><p><b>  總 結(jié)</b></p><p>  課程設(shè)計是每一個大學(xué)生在大學(xué)生涯中都不可或缺的,它使我們在實踐中了鞏固了所學(xué)的知識、在實踐中鍛煉自己的動手能力;實習(xí)又

38、是對每一位大學(xué)生所學(xué)專業(yè)知識的一種拓展手段,它讓我們學(xué)到了很多在課堂上根本就學(xué)不到的知識,不僅開闊了自己的視野,增長了自己的見識,也為我們以后進一步走向社會打下了堅實的基礎(chǔ),是我們走向以后走向工作崗位的奠基石。 </p><p>  在這一個星期的課程設(shè)計的時間中,我得到了很多收獲,這是一次難得的經(jīng)歷。我的編程技巧和能力在這一次的設(shè)計中進步了很多。</p><p><b&g

39、t;  致 謝</b></p><p>  在課程設(shè)計中,要特別感謝張老師給予我這次設(shè)計的機會,并且在他的悉心的監(jiān)督和指導(dǎo)下,本次課程設(shè)計才能圓滿完成。同時也要感謝各位同學(xué)們的指導(dǎo),和同學(xué)們的討論和交流是完成我這次課程設(shè)計不可忽視的一部分。還要感謝給我提供良好實驗環(huán)境的學(xué)校。如果沒有老師們和同學(xué)們還有學(xué)校的支持與幫助,本次課程設(shè)計不能這么順利的完成。再次感謝老師和同學(xué)的幫助,使我能夠圓滿完成這次課

40、程設(shè)計,為我以后的專業(yè)學(xué)習(xí)打下了良好的基礎(chǔ)。</p><p><b>  參考文獻</b></p><p>  [1] 湯子瀛,哲鳳屏,湯小丹.計算機操作系統(tǒng)[M].西安電子科技大學(xué)出版社,2007. </p><p>  [2] 譚浩強.C語言程序設(shè)計[M].清華大學(xué)出版社,2010.</p><p>  [3] 蘇仕

41、華.?dāng)?shù)據(jù)結(jié)構(gòu)課程設(shè)計[M].機械工業(yè)出版社,2005</p><p><b>  附錄:</b></p><p>  #include<stdio.h></p><p>  #include <stdlib.h></p><p>  #define N 5 //進程個數(shù)</p>&

42、lt;p>  #define M 3 //資源種類數(shù)</p><p>  void print();</p><p>  int check_safe();</p><p>  int check_distribution(int* p, int k);</p><p>  char Process_Name[N];

43、 //進程名</p><p>  int Request[M]; //請求數(shù)組</p><p>  int Finish[N]; //標記某一個進程是否可以執(zhí)行</p><p>  int Work[N][M]; //初始為Available[][],隨尋找安全序列而變化,防止安全序列未找到而丟了初始狀態(tài)的值

44、</p><p>  int Available[M]; //資源清單——系統(tǒng)中現(xiàn)有各資源空閑個數(shù)</p><p>  int Work_Allocation[N][M];</p><p>  int Max[N][M]; //最大需求矩陣——每個進程對各類資源的最大需求數(shù)</p><p&

45、gt;  int Allocation[N][M]; //分配矩陣——系統(tǒng)給每個進程已分配的各類資源數(shù)</p><p>  int Need[N][M]; //需求矩陣——每個進程還需要每種資源的個數(shù)</p><p>  int sequence[N] = { 0 }; //存放安全序列號</p><p>

46、  void main()</p><p><b>  {</b></p><p>  int i = 0, j = 0, k = 0; //記錄申請資源的進程的序列號</p><p>  int flag = 0; //標記輸入的進程名是否存在</p><p>  int safe = 0

47、; //標志系統(tǒng)是否出于安全狀態(tài),0表示不安全,1表示安全</p><p>  int distribution = 0; //標志是否可以進行試分配0表示可以,1表示不可以</p><p>  char flag1; //標記是否有進程申請資源 </p><p>  char name;

48、 //要請求資源的進程名</p><p>  printf("----------------------------------------\n");</p><p>  printf("*********** 銀行家算法 ***********\n");</p><p>  print

49、f("----------------------------------------\n\n");</p><p>  printf("->請輸入各進程的進程名:\n"); //進程名連續(xù)輸入</p><p>  for (i = 0; i<N; i++)</p><p><b>  {</b

50、></p><p>  scanf("%c", &Process_Name[i]);</p><p><b>  }</b></p><p>  printf("->請輸入現(xiàn)有各資源空閑個數(shù):\n");</p><p>  for (i = 0; i<M;

51、 i++)</p><p><b>  {</b></p><p>  scanf("%d", &Available[i]);</p><p><b>  }</b></p><p>  printf("->請分別輸入每個進程對各類資源的最大需求數(shù):\n&

52、quot;);</p><p>  for (i = 0; i<N; i++)</p><p><b>  {</b></p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  scanf(&quo

53、t;%d", &Max[i][j]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  printf("->請分別輸入系統(tǒng)給每個進程已分配的各類資源數(shù)\n");</p><p>  for (i = 0;

54、 i<N; i++)</p><p><b>  {</b></p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  scanf("%d", &Allocation[i][j]);</p

55、><p><b>  }</b></p><p><b>  }</b></p><p>  //計算每個進程還需要每種資源的數(shù)</p><p>  for (i = 0; i<N; i++)</p><p><b>  {</b></p>

56、<p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  Need[i][j] = Max[i][j] - Allocation[i][j];</p><p><b>  }</b></p><p><b>  

57、}</b></p><p>  printf("\n初始化終了。\n");</p><p>  printf("----------------------------------------\n\n\n");</p><p>  for (i = 0; i<N; i++)</p><p&

58、gt;<b>  {</b></p><p>  sequence[i] = i;</p><p><b>  }</b></p><p><b>  //輸出界面</b></p><p><b>  print();</b></p><

59、;p>  //檢查初始狀態(tài)是否安全</p><p>  safe = check_safe();</p><p>  if (0 == safe)</p><p><b>  {</b></p><p>  printf("系統(tǒng)現(xiàn)處于不安狀態(tài),不能為進程分配資源,進入死鎖狀態(tài)。。。\n");&l

60、t;/p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  else if (1 == safe)</p><p><b>  {</b></p><p>  printf("系統(tǒng)處于安全狀態(tài)

61、,可以為進程分配資源。\n");</p><p><b>  }</b></p><p><b>  while (1)</b></p><p><b>  {</b></p><p><b>  safe = 0;</b></p>

62、<p>  getchar();</p><p>  printf("是否有進程請求系統(tǒng)資源...? (Y/N) \n");</p><p>  flag1 = getchar();</p><p>  if ('Y' == flag1 || 'y' == flag1)</p><p

63、><b>  {</b></p><p>  printf("請輸入進程名:");</p><p>  getchar();</p><p><b>  while (1)</b></p><p><b>  {</b></p><

64、p>  scanf("%c", &name);</p><p>  for (i = 0; i<N; i++) //檢查進程名輸入是否正確</p><p><b>  {</b></p><p>  if (name == Process_Name[i])</p><p><

65、b>  {</b></p><p>  flag = 1; //輸入的進程名存在</p><p><b>  k = i;</b></p><p>  break;//找到申請資源的進程序列號跳出</p><p><b>  }</b></p><p>&l

66、t;b>  }</b></p><p>  getchar();//將在此之前的一個回車接收了,不然會影響輸入</p><p>  if (flag != 1)//進程名輸入不合法</p><p><b>  {</b></p><p>  printf("你輸入的進程不存在,請重新輸入:&q

67、uot;);</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  break;//

68、進程名輸入合法,則執(zhí)行下面操作</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else if ('N' == flag1 || 'n' == flag1

69、)</p><p><b>  {</b></p><p>  printf("進程執(zhí)行完畢,退出系統(tǒng)。\n");</p><p><b>  break;</b></p><p><b>  }</b></p><p>  else

70、 if ('N' != flag1 && 'Y' != flag1 && 'n' != flag1 && 'y' != flag1)</p><p><b>  {</b></p><p>  printf("你的輸入有誤,請重新輸入: "

71、;);</p><p><b>  continue;</b></p><p><b>  }</b></p><p>  printf("請輸入該進程請求各類資源的數(shù)量\n");</p><p>  for (i = 0; i<M; i++)</p><

72、;p><b>  {</b></p><p>  scanf("%d", &Request[i]);</p><p><b>  }</b></p><p>  distribution = check_distribution(Request, k); //檢查是否可以試分

73、配</p><p>  if (1 == distribution) </p><p><b>  {</b></p><p>  safe = check_safe(); //可以試分配,則求安全序列</p><p>  if (1 == safe)

74、 //試分配成功</p><p><b>  {</b></p><p>  printf("試分配成功,可以為該進程分配資源。\n"); //是否給申請資源的進程分配資源</p><p>  for (i = 0; i<M; i++)</p><p><b>  {</b

75、></p><p>  Allocation[k][i] = Allocation[k][i] + Request[i]; //為進程分配資源后修改該進程的有關(guān)資源數(shù)</p><p>  Need[k][i] = Need[k][i] - Request[i];</p><p><b>  }</b></p><p

76、>  printf("分配后各資源數(shù)量如下:\n");</p><p><b>  print();</b></p><p>  printf("分配成功!\n");</p><p>  printf("系統(tǒng)剩余資源數(shù)各為: ");</p><p>  f

77、or (i = 0; i<M; i++)</p><p><b>  {</b></p><p>  printf("%d ", Available[i]);</p><p><b>  }</b></p><p>  printf("\n");<

78、;/p><p><b>  continue;</b></p><p><b>  }</b></p><p>  else //試分配失敗</p><p><b>  {</b></p><p>  printf("試分配失敗,有可能進入死鎖狀

79、態(tài),請等待。。。\n");//未求出安全序列</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  else //試分配失敗</p>

80、<p><b>  {</b></p><p>  printf("該進程申請的資源太多,無法分配,請等待。。。\n");</p><p><b>  continue;</b></p><p><b>  }</b></p><p><b&

81、gt;  }</b></p><p><b>  }</b></p><p>  void print()</p><p><b>  {</b></p><p><b>  int i, j;</b></p><p>  printf(&q

82、uot; 資源 Work Need\tAllocation\tWork+Allocation\t Finish\n");</p><p>  printf(" 進程名 A B C A B C \t A B C \t A B C\n");</p><p>  printf("~~~~~~~~~~~~

83、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");</p><p>  for (i = 0; i<N; i++)</p><p><b>  {</b></p><p>  printf(" %c ", Proces

84、s_Name[sequence[i]]);</p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  printf("%d ", Work[sequence[i]][j]);</p><p><b>  }</b

85、></p><p>  printf(" ");</p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  printf("%d ", Need[sequence[i]][j]);</p>

86、<p><b>  }</b></p><p>  printf(" ");</p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  printf("%d ", A

87、llocation[sequence[i]][j]);</p><p><b>  }</b></p><p>  printf(" ");</p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p

88、><p>  printf("%d ", Work_Allocation[sequence[i]][j]);</p><p><b>  }</b></p><p>  printf(" ");</p><p>  printf("%d", Finis

89、h[i]);</p><p>  printf("\n\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  int check_distribution(int* p, int k)</p><p>

90、;<b>  {</b></p><p>  int i = 0;</p><p>  int safe1 = 0, safe2 = 0;</p><p>  for (i = 0; i < M; i++)</p><p><b>  {</b></p><p>  i

91、f (p[i] <= Need[k][i])</p><p><b>  {</b></p><p>  safe1 = safe1 + 1;</p><p><b>  }</b></p><p>  if (p[i] <= Available[i])</p><p

92、><b>  {</b></p><p>  safe2 = safe2 + 1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if (M == safe1 && M == safe2)</p&

93、gt;<p><b>  {</b></p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b>&

94、lt;/p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int check_safe() //檢查是否安全,求安全序列</p><p><b

95、>  {</b></p><p>  int i = 0, j = 0, k = 0, m = 0;</p><p>  int finish = 0;</p><p>  for (i = 0; i<M; i++)</p><p><b>  {</b></p><p>

96、  Work[k][i] = Available[i];//-Request[i];//初始化WOrk[][]矩陣</p><p><b>  }</b></p><p>  for (m = 0; m<N; m++)//N個進程最多找N趟</p><p><b>  {</b></p><p&g

97、t;  if (1 != finish)</p><p><b>  {</b></p><p>  finish = 1;</p><p>  for (i = 0; i<N; i++) //找Need小于Work的進程</p><p><b>  {</b></p><

98、;p>  if (0 == Finish[i] && Need[i][0] <= Work[k][0] && Need[i][1] <= Work[k][1] && Need[i][2] <= Work[k][2])</p><p><b>  {</b></p><p>  sequence[k

99、] = i;//找到一個滿足條件的進程,記錄其序號</p><p><b>  k++;</b></p><p>  Finish[i] = 1; //執(zhí)行該進程</p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p>&l

100、t;p>  Work[k][j] = Work[k - 1][j] + Allocation[i][j]; //更新WOrk值</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  f

101、or (i = 0; i<N; i++)//檢查是否所有進程都執(zhí)行完了</p><p><b>  {</b></p><p>  finish = finish*Finish[i];</p><p><b>  }</b></p><p>  if (1 == finish)</p&g

102、t;<p><b>  {</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></

103、p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for (i = 0; i< N; i

104、++)</p><p><b>  {</b></p><p>  for (j = 0; j<M; j++)</p><p><b>  {</b></p><p>  Work_Allocation[i][j] = Work[i][j] + Allocation[i][j];</p&

105、gt;<p><b>  }</b></p><p><b>  }</b></p><p>  for (i = 0; i<M; i++)</p><p><b>  {</b></p><p>  Available[i] = Available[i]

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論