作業系統實驗之銀行家演算法
作業系統實驗中的銀行家演算法複雜難懂,那麼我們究竟要怎麼去理解呢?下面由小編為大家整理了作業系統實驗銀行家演算法的相關知識,希望大家喜歡!
作業系統實驗——銀行家演算法
一、實驗目的
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提出請求後,程式的執行結果,可知,系統仍然安全,所以系統可以滿足請求。