デッドロック問題の回避-バンカーアルゴリズム
バンカーアルゴリズムのデータ構造
- 利用可能なリソースベクトル
- 最大需要マトリックス最大
- 割り当てマトリックス
- まだマトリックスが必要必要
バンカーアルゴリズム
RequestiをプロセスPiの要求量とします。Requesti[j] = kの場合、プロセスPiにはタイプRjのK個のリソースが必要であることを意味します。Piがリソース要求を送信すると、システムは次の手順に従ってチェックします。
a)Requesti [j] <= Need [I、j]の場合は、手順(b)に進みます。それ以外の場合は、必要なリソースの数が宣言されている最大数を超えているため、エラーと見なされます。
b)Requesi [j] <= Available [j]の場合は、ステップ(c)に進みます。それ以外の場合は、十分なリソースがなく、Piが待機する必要があることを意味します。
c)システムはプロセスPiにリソースを割り当てようとし、次のデータ構造の値を変更します:
Available [j]:= Available [j] –リクエストi [j];
Allocation [i、j]:= Allocation [i、j] +リクエストi [j];
Need [i、j]:= Need [i、j] –リクエストi [j];
d)システムはセキュリティアルゴリズムを実行して、このリソース割り当て後にシステムが安全な状態にあるかどうかを確認します。安全であれば、リソースはプロセスPiに正式に割り当てられ、リソースの割り当ては完了します。そうでない場合、試行割り当ては無効になり、元のリソース割り当て状態が復元され、プロセスPiは待機します。
セキュリティアルゴリズム
(1)2つのベクトルを設定します。
①作業ベクトル作業。プロセスが実行を継続するためにシステムが提供できるさまざまなリソースの数を表します。m個の要素が含まれます。セキュリティアルゴリズムの実行の開始時に、Work:= Available。
②終了、彼は、システムが完了するまで実行するのに十分なリソースがプロセスに割り当てられているかどうかを述べました。最初に、Finish:= falseを実行します。プロセスに十分なリソースが割り当てられたら、Finish [i]:= trueにします。
(2)プロセスセットから次の条件を満たすプロセスを見つけます。
①Finish[i]:= false;
②Need[i、j] <= Work [j];見つかった場合は手順(3)に進み、見つからない場合は手順(4)に進みます。
(3)プロセスPiがリソースを取得すると、完了するまでスムーズに実行され、割り当てられたリソースを解放できるため、次のように実行する必要があります。
Work [j]:= Work [j] + Allocation [i、j];
Finish [i]:= true;
手順2に進みます。
(4)すべてのプロセスのFinish [i] = trueが満たされている場合は、システムが安全な状態にあることを意味します。それ以外の場合、システムは安全でない状態にあります。
#include<bits/stdc++.h>
using namespace std;
#define maxsize 10
char Res[maxsize]={
0}; //资源名
int Available[maxsize]={
0}; //可利用资源
int Max[maxsize][maxsize]={
0}; //最大需求矩阵
int Allocation[maxsize][maxsize]={
0}; //已分配矩阵
int Need[maxsize][maxsize]={
0}; //需求矩阵
int Work; //资源数
bool Finish[maxsize]={
false};
int main(){
cout<<"请按顺序输入:资源种类,数目(q to quit)(max<=10)"<<endl;
char ch;
int Resnum=0;
while(cin>>ch&&ch!='q'){
Res[Resnum]=ch;
cin>>Available[Resnum++];
}
cout<<"当前资源目录:"<<endl;
cout<<"资源类型 资源数目"<<endl;
for(int i=0;i<Resnum;++i){
cout<<" "<<Res[i]<<" "<<Available[i]<<endl;
Work+=Available[i];
}
int n;
cout<<"请输入进程个数(max<=10)"<<endl;
cin>>n;
for(int i=0;i<n;++i){
cout<<"请按顺序输入第"<<i+1<<"个进程所需的资源类型、资源数目";
int ch1;
int num;
cin>>ch1>>num;
Need[i][ch1]=num;
if(Need[i][ch1]<=Available[ch1-1]){
//Need[i][ch1]表示第i个进程所需ch1资源的个数
Available[ch1-1]-=Need[i][ch1];
Finish[i]=true;
}
}
int flag=0;
for(int i=0;i<n;++i){
if(!Finish[i])
flag=1;
}
if(flag)
cout<<"不安全";
else
cout<<"安全";
}