<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦>學習電腦>操作系統>操作系統基礎知識>

        計算機操作系統的銀行家算法

        時間: 佳洲1085 分享

          計算機操作系統的銀行家算法相信很多小伙伴都一知半解,下面由學習啦小編為大家整理了計算機操作系統的銀行家算法的相關知識,希望對大家有幫助!

          計算機操作系統的銀行家算法

          一、需求分析

          1、進程的狀態有:就緒,等待和完成。當系統不能滿足進程的資源請求時,進程出于等待狀態。資源需求總量表示進程運行過程中對資源的總的需求量。已占資源量表示進程目前已經得到但還為歸還的資源量。因此,進程在以后還需要的剩余資源量等于資源需要總量減去已占資源量。陷入每個進程的資源需求總量不應超過系統擁有的資源總量。

          2、銀行家算法分配資源的原則是:當某個進程提出資源請求時,假定先分配資源給它,然后查找各進程的剩余請求,檢查系統的剩余資源量是否由于進程的分配而導致系統死鎖。若能,則讓進程等待,否則,讓進程的假分配變為真分配。

          (1)查找各進程的剩余請求,檢查系統的剩余資源量是否能滿足其中一進程,如果能,則轉B)。

          (2)將資源分配給所選的進程,這樣,該進程已獲得資源最大請求,最終能運行完成。標記這個進程為終止進程,并將其占有的全部資源歸還給系統。

          重復第(1)步(2)步,直到所有進程都標記為終止進程,或知道一個死鎖發生。若所有進程都標記為終止進程,則系統的初始狀態是安全的,否則為不安全的。若安全,則正式將資源分配給它,否則,假定的分配作廢,讓其等待。

          二、系統結構設計

          1、設計分析

          當某個進程對某類資源提出請求時,假定先分配資源給它,然后查找各進程的剩余請求,檢查系統的剩余資源量是否由于進程的分配而導致系統死鎖。若能,則讓進程等待,否則,讓進程的假分配變為真分配。

          2、數據結構

          (1)可利用資源向量Available。這是一個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可利用資源的數目,其中的每一個元素代表一類可利用的資源數目,其初始值是系統中所配置的該類全部可利用資源的數目,其數值隨該類資源的分配和回首而動態的改變,如果Available=K,則代表Rj類資源K個。

          (2)最大需求矩陣Max。這是一個n×m的矩陣,它定義了系統中n個進程中的每一個進程對m類資源的最大需求。

          (3)分配矩陣Allocation。這也是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每一進程的資源數。

          (4)需求矩陣Need。這也是一個n×m的矩陣,用以表示每一個進程還需要各類資源數。

          3、銀行家算法

          設Requesti是進程Pi的請求向量,如果Requesti[j]=K,表示進程Pi需要K個Rj類型的資源。當Pi發出資源請求后,系統按照以下步驟進行檢查:

          A:如果Requesti[j]<=Need[i,j],執行B,否則認為出錯,因為它需要的資源數已經超過它所宣布的最大值。

          B: 如果Requesti[j]<=Available[j],轉向步驟C,否則尚無足夠資源,Pi必須等待。

          C:系統試探著把資源分配給進程Pi,并修改下面數據結構中的數值:

          Available[j]:= Available[j]- Requesti[j];

          Allocation[i,j]:=Allocation[i,j]+ Requesti[j];

          Need[i,j]:= Need[i,j]- Requesti[j];

          D:系統執行安全性算法,檢查此次自奧運分配后系統是否處于安全狀態。若安全,才正式將資源分配給進程Pi,以完成本次分配,否則,將本次的試探分配作廢,恢復原來的資源分配狀態,讓進程Pi等待。

          設置WORK[R]是系統可提供給進程繼續運行所需的各類資源數目, 剛開始 系統可提供給進程繼續運行所需的j類資源數目,FINISH[i]檢查安全性是否通過。

          4、程序流程圖

          三、總結和體會

          通過在劉玉宏老師的幫助下,我成功的完成了這次課程設計,雖然其中存在很多的不足。在這個銀行家算法課程設計中,利用二維數組作為基本的數據結構用以存儲資源及進程信息,利用check()函數來判斷進程執行是否安全,通過二維數組和distribute ()和restore()函數很好的解決了進程的分配及撤銷問題。

          實驗中我使用當一個進程不滿足安全狀態時緊接著查找它的下一個進程,若下一個進程滿足則給予分配資源,然后又返回從頭開始才找滿足安全狀態的進程,經過劉老師的課堂講解我知道還可以按照進程的編號從小到大一次下循環查找,直到進程執行完畢。

          不同的算法可以實現相同的功能,這是我從本次實驗中深深體會到的,因而在今后的學習中遇到問題我會嘗試著用的不同的方法來解決,有時候換個角度可以很方便的解決問題。

          附:計算機操作系統的銀行家算法主要清單

          #include <string.h>

          #include <iostream.h>

          #define FALSE 0

          #define TRUE 1

          #define W 10

          #define R 10

          int M ; //總進程數

          int N ; //資源種類

          int All[W];//各種資源的數目總和

          int Max[W][R]; //M個進程對N類資源最大資源需求量

          int Available[R]; //系統可用資源數

          int Allocation[W][R]; //M個進程已經得到N類資源的資源量

          int Need[W][R]; //M個進程還需要N類資源的資源量

          int Request[R]; //請求資源個數

          void output() //輸出資源分配情況

          {

          int i,j;

          cout<<endl<<"*************************"<<endl;

          cout<<"各種資源的總數量:"<<endl;

          for (j=0;j<N;j++)

          cout<<" 資源"<<j<<": "<<All[j]<<endl;

          cout<<endl;

          cout<<"*************************"<<endl;

          cout<<"目前各種資源可利用的數量為:"<<endl;

          for (j=0;j<N;j++)

          cout<<" 資源"<<j<<": "<<Available[j]<<endl;

          cout<<endl<<endl;

          cout<<"*************************"<<endl;

          cout<<"各進程還需要的資源數量:"<<endl;

          for (j=0;j<N;j++)

          { cout<<" 資源"<<j<<" "; }

          cout<<endl;

          for (i=0;i<M;i++)

          {

          cout<<"進程"<<i<<": ";

          for (j=0;j<N;j++)

          cout<<Need[i][j]<<" ";;

          cout<<endl;

          }

          cout<<endl;

          cout<<"**************************"<<endl;

          cout<<"各進程已經分配得到的資源量: "<<endl<<endl;

          for (j=0;j<N;j++)

          { cout<<" 資源"<<j<<" "; }

          cout<<endl;

          for (i=0;i<M;i++)

          {

          cout<<"進程"<<i<<": ";

          for (j=0;j<N;j++)

          cout<<Allocation[i][j]<<" ";

          cout<<endl;

          }

          cout<<endl;

          }

          void distribute(int k) ///////////////////分配資源

          {

          int j;

          for (j=0;j<N;j++)

          {

          Available[j]=Available[j]-Request[j];

          Allocation[k][j]=Allocation[k][j]+Request[j];

          Need[k][j]=Need[k][j]-Request[j];//第k個進程對第j中資源還需要的資源量

          }

          }

          void restore(int k) //如果分配失敗,則恢復原來的資源分配狀態

          {

          int j;

          for (j=0;j<N;j++)

          {

          Available[j]=Available[j]+Request[j];

          Allocation[k][j]=Allocation[k][j]-Request[j];

          Need[k][j]=Need[k][j]+Request[j];

          }

          }

          int check() //檢查安全性

          {

          int WORK[R],FINISH[W];//WORK[R]是系統可提供給進程繼續運行所需的各類資源數目

          int i,j;

          for(j=0;j<N;j++) WORK[j]=Available[j];//剛開始 系統可提供給進程繼續運行所需的j類資源數目 等于j類可用資源數目

          for(i=0;i<M;i++) FINISH[i]=FALSE;

          for(i=0;i<M;i++)

          {

          for(j=0;j<N;j++)

          {

          if(FINISH[i]==FALSE&&Need[i][j]<=WORK[j])

          {

          WORK[j]=WORK[i]+Allocation[i][j];

          }

          }

          FINISH[i]=TRUE;

          }

          for(i=0;i<M;i++)

          {

          if(FINISH[i]==FALSE)

          {

          cout<<endl;

          cout<<" 系統不安全! 本次資源申請不成功!!!"<<endl;

          cout<<endl;

          return 1;

          }

          else

          {

          cout<<endl;

          cout<<" 經安全性檢查,系統安全,本次分配成功。"<<endl;

          cout<<endl;

          }

          }

          return 0;

          }

          void bank() //銀行家算法

          {

          int i=0,j=0;

          char flag='Y';

          while(flag=='Y'||flag=='y')

          {

          i=-1;

          while(i<0||i>=M)

          {

          cout<<"***********************************"<<endl;

          cout<<endl<<" 請輸入需申請資源的進程號:";

          cin>>i;

          if(i<0||i>=M) cout<<" 輸入的進程號不存在,重新輸入!"<<endl;

          }

          for (j=0;j<N;j++)

          {

          cout<<" 資源"<<j<<": ";

          cin>>Request[j];

          if(Request[j]>Need[i][j]) //若請求的資源數大于進程還需要i類資源的資源量j

          {

          cout<<endl<<" 進程"<<i<<"申請的資源數大于進程"<<i<<"還需要"<<j<<"類資源的數量!";

          cout<<" 若繼續執行系統將處于不安全狀態!"<<endl;

          flag='N';

          break;

          }

          else

          {

          if(Request[j]>Available[j]) //若請求的資源數大于可用資源數

          {

          cout<<endl<<" 進程"<<i<<"申請的資源數大于系統可用"<<j<<"類資源的數量!";

          cout<<" 若繼續執行系統將處于不安全狀態!"<<endl;

          flag='N';

          break;

          }

          }

          }

          if(flag=='Y'||flag=='y')

          {

          distribute(i); //調用change(i)函數,改變資源數

          if(check()) //若系統安全

          {

          restore(i); //調用restore(i)函數,恢復資源數

          output(); //輸出資源分配情況

          }

          else //若系統不安全

          output(); //輸出資源分配情況

          }

          else //若flag=N||flag=n

          cout<<endl;

          cout<<" 是否繼續銀行家算法演示,按'Y'或'y'鍵繼續,按'N'或'n'鍵退出演示: ";

          cin>>flag;

          }

          }

          void version()

          {

          cout<<endl;

          cout<<"\t*************************"<<endl;

          cout<<"\t* *"<<endl;

          cout<<"\t*  銀 行 家 算 法    *"<<endl;

          cout<<"\t* *"<<endl;

          cout<<"\t*************************"<<endl;

          }

          void main() //主函數

          {

          int i=0,j=0,p;

          version();

          cout<<endl<<"請輸入總進程數:";

          cin>>M;

          cout<<endl<<"***************************"<<endl;

          cout<<"請輸入總資源種類:";

          cin>>N;

          cout<<endl<<"***************************"<<endl;

          cout<<"請輸入各類資源總數:";

          for(i=0;i<N;i++)

          cin>>All[i];

          cout<<endl<<"***************************"<<endl;

          cout<<"輸入各進程所需要的各類資源的最大數量:"<<endl;

          for (i=0;i<M;i++)

          {

          for (j=0;j<N;j++)

          {

          do

          {

          cin>>Max[i][j];

          if (Max[i][j]>All[j])

          cout<<endl<<"占有資源超過了聲明的該資源總數,請重新輸入"<<endl;

          }while (Max[i][j]>All[j]);

          }

          }

          cout<<endl<<"********************************"<<endl;

          cout<<"輸入各進程已經分配的各類資源的數量:"<<endl;

          for (i=0;i<M;i++)

          {

          for (j=0;j<N;j++)

          {

          do

          {

          cin>>Allocation[i][j];

          if (Allocation[i][j]>Max[i][j])

          cout<<endl<<"占有資源超過了聲明的最大資源,請重新輸入"<<endl;

          }while (Allocation[i][j]>Max[i][j]);

          }

          }

          for (j=0;j<N;j++) //初始化資源數量

          {

          p=All[j];

          for (i=0;i<M;i++)

          {

          p=p-Allocation[i][j];//減去已經被占據的資源

          Available[j]=p;

          if(Available[j]<0)

          Available[j]=0;

          }

          }

          for (i=0;i<M;i++)

          for(j=0;j<N;j++)

          Need[i][j]=Max[i][j]-Allocation[i][j];

          output();

          bank();

          }

        3633757 主站蜘蛛池模板: 日本精品不卡一二三区| 亚洲午夜无码久久久久蜜臀av| 久久精品国产久精国产69| 99久久免费国产精品| 日本不卡的一区二区三区| 91嫩草尤物在线观看| 亚洲av肉欲一区二区| 欧洲无码一区二区三区在线观看| 午夜AAAAA级岛国福利在线 | 日韩av综合免费在线| 日韩乱码视频一区二区三区| 国产精品视频一品二区三| 精品久久久久久无码不卡| 中文字幕日韩一区二区不卡| 中文字幕有码无码AV| 色爱av综合网国产精品| 久久精品国产99久久六动漫| 国产精品亚洲mnbav网站| 欧美黑人XXXX性高清版| 国产免费人成网站在线播放| 国产成人不卡无码免费视频| 久久伊99综合婷婷久久伊| 国产精品午夜福利合集| а√天堂8在线官网| 婷婷久久香蕉五月综合加勒比| 精品久久久久久无码专区不卡 | 三年片在线观看免费观看高清动漫| 国产精品免费AⅤ片在线观看| 无码熟妇人妻AV影音先锋| 99国产欧美精品久久久蜜芽| 精品国产高清中文字幕| 免费无码又爽又刺激激情视频| 国产午夜福利视频合集| 久久久久无码国产精品不卡| 美女禁区a级全片免费观看| 最新国产麻豆aⅴ精品无| 亚洲国产成人自拍视频网| av免费一区二区三区不卡| 日韩精品久久不卡中文字幕| 真人免费一级毛片一区二区| 成人国产亚洲精品一区二区|