作業系統實驗之銀行家演算法

  作業系統實驗中的銀行家演算法複雜難懂,那麼我們究竟要怎麼去理解呢?下面由小編為大家整理了作業系統實驗銀行家演算法的相關知識,希望大家喜歡!

  作業系統實驗——銀行家演算法

  一、實驗目的

  1、 理解銀行家演算法。

  2、 掌握程序安全性檢查的方法與資源分配的方法。

  二、實驗內容與基本要求

  編制模擬銀行家演算法的程式,並以下面給出的例子驗證所編寫的程式的正確性。

程序 已佔資源 最大需求數
資源種類 A B C D A B C D
P0 0 0 1 2 0 0 1 2
P1 1 0 0 0 1 7 5 0
P2 1 3 5 4 2 3 5 6
P3 0 6 3 2 0 6 5 2
P4 0 0 1 4 0 6 5 6

  現在系統中A、B、C、D 4類資源分別還剩1、5、2、0個,請按銀行家演算法回答:

  1、 現在系統是否處於安全狀態?

  2、 如果現在程序P1提出需要***0、4、2、0***個資源的請求,系統能否滿足它的請求?

  三、實驗報告內容

  1、 銀行家演算法和安全性檢查演算法原理

  銀行家演算法:

  銀行家演算法最初級原為銀行系統設計,以確保銀行在發放現金貸款時,不會發生不能滿足所有客戶需要的情況。在OS設計中,也可以用它來避免死鎖。

  為實現銀行家演算法,每個新程序在進入系統時它必須申明在執行過程中,可能需要的每種資源型別的最大單元數目,其數目不應超過系統所擁有的資源總量。當某一程序請求時,系統會自動判斷請求量是否小於程序最大所需,同時判斷請求量是否小於當前系統資源剩餘量。若兩項均滿足,則系統試分配資源並執行安全性檢查演算法。

  安全性檢查演算法 :

  安全性檢查演算法用於檢查系統進行資源分配後是否安全,若安全系統才可以執行此次分配;若不安全,則系統不執行此次分配。

  安全性檢查演算法原理為:在系統試分配資源後,演算法從現有程序列表尋找出一個可執行的程序進行執行,執行完成後回收程序佔用資源;進而尋找下一個可執行程序。當程序需求量大於系統可分配量時,程序無法執行。當所有程序均可執行,則產生一個安全執行序列,系統資源分配成功。若程序無法全部執行,即無法找到一條安全序列,則說明系統在分配資源後會不安全,所以此次分配失敗。

  2、 程式流程圖

  3、 程式及註釋

  #include

  //////////////////////////////////////////////////////////////////////////

  //全域性變數定義

  int Available[100]; //可利用資源陣列

  int Max[50][100]; //最大需求矩陣

  int Allocation[50][100]; //分配矩陣

  int Need[50][100]; //需求矩陣

  int Request[50][100]; //M個程序還需要N類資源的資源量

  int Finish[50];

  int p[50];

  int m,n; //M個程序,N類資源

  /////////////////////////////////////////////////////////////////////////

  //安全性演算法

  int Safe******

  {

  int i,j,l=0;

  int Work[100]; //可利用資源陣列

  for ***i=0;i

  Work[i]=Available[i];

  for ***i=0;i

  Finish[i]=0;

  for ***i=0;i

  {

  if ***Finish[i]==1***

  continue;

  else

  {

  for ***j=0;j

  {

  if ***Need[i][j]>Work[j]***

  break;

  }

  if ***j==n***

  {

  Finish[i]=1;

  for***int k=0;k

  Work[k]+=Allocation[i][k];

  p[l++]=i;

  i=-1;

  }

  else continue;

  }

  if ***l==m***

  {

  cout<<"系統是安全的"<<'\n';

  cout<<"系統安全序列是:\n";

  for ***i=0;i

  {

  cout<

  if ***i!=l-1***

  cout<<"-->";

  }

  cout<<'\n';

  return 1;

  }

  }

  }

  /////////////////////////////////////////////////////////////////////////////////

  //銀行家演算法

  int main******

  {

  int i,j,mi;

  cout<<"輸入程序的數目:\n";

  cin>>m;

  cout<<"輸入資源的種類:\n";

  cin>>n;

  cout<<"輸入每個程序最多所需的各類資源數,按照"<

  for ***i=0;i

  for***j=0;j

  cin>>Max[i][j];

  cout<<"輸入每個程序已經分配的各類資源數,按照"<

  for ***i=0;i

  {

  for***j=0;j

  {

  cin>>Allocation[i][j];

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

  if ***Need[i][j]<0***

  {

  cout<<"你輸入的第"<

  j--;

  continue;

  }

  }

  }

  cout<<"請輸入各個資源現有的數目:\n";

  for ***i=0;i

  cin>>Available[i];

  Safe******;

  while ***1***

  {

  cout<<"輸入要申請的資源的程序號:***第一個程序號為0,第二個程序號為1,依此類推***\n";

  cin>>mi;

  cout<<"輸入程序所請求的各個資源的數量\n";

  for ***i=0;i

  cin>>Request[mi][i];

  for ***i=0;i

  {

  if ***Request[mi][i]>Need[mi][i]***

  {

  cout<<"所請***數超過程序的需求量!\n";

  return 0;

  }

  if ***Request[mi][i]>Available[i]***

  {

  cout<<"所請***數超過系統所有的資源數!\n";

  return 0;

  }

  }

  for ***i=0;i

  {

  Available[i]-=Request[mi][i];

  Allocation[mi][i]+=Request[mi][i];

  Need[mi][i]-=Request[mi][i];

  }

  if ***Safe*********

  cout<<"同意分配請求\n";

  else

  {

  cout<<"SORRY╮***╯▽╰***╭……你的請求被拒絕…\n";

  for ***i=0;i

  {

  Available[i]+=Request[mi][i];

  Allocation[mi][i]-=Request[mi][i];

  Need[mi][i]+=Request[mi][i];

  }

  }

  for ***i=0;i

  Finish[i]=0;

  char Flag; //標誌位

  cout<<"是否再次請求分配?是請按Y/y,否請按N/n";

  while ***1***

  {

  cin>>Flag;

  if ***Flag=='Y'||Flag=='y'||Flag=='N'||Flag=='n'***

  break;

  else

  {

  cout<<"請按要求重新輸入:\n";

  continue;

  }

  }

  if ***Flag=='Y'||Flag=='y'***

  continue;

  else break;

  }

  }

  4、 執行結果以及結論

  圖示為題目所給定的條件下的程式執行結果。可看出在現有分配情況下,該系統安全。

  下圖為,P1提出請求後,程式的執行結果,可知,系統仍然安全,所以系統可以滿足請求。