Evitar problemas de deadlock - algoritmo do banqueiro
A estrutura de dados do algoritmo do banqueiro
- Vetor de recursos disponíveis Disponível
- Matriz de demanda máxima Max
- Matriz de alocação
- Ainda preciso da matriz Necessidade
Algoritmo de banqueiro
Seja Requesti a quantidade de solicitação do processo Pi, se Requesti [j] = k, significa que o processo Pi precisa de K recursos do tipo Rj. Quando Pi envia uma solicitação de recurso, o sistema verifica de acordo com as etapas a seguir.
a) Se Requesti [j] <= Precisa [I, j], então vá para a etapa (b), caso contrário, é considerado um erro, pois o número de recursos de que necessita ultrapassou o máximo declarado por ele.
b) Se Requesi [j] <= Disponível [j], vá para a etapa (c); caso contrário, significa que não há recursos suficientes e Pi deve esperar.
c) O sistema tenta alocar recursos para o processo Pi e modifica os valores na seguinte estrutura de dados:
Disponível [j]: = Disponível [j] - Solicitação i [j];
Alocação [i, j]: = Alocação [i, j] + Solicitação i [j];
Necessidade [i, j]: = Necessidade [i, j] - Solicitação i [j];
d) O sistema executa o algoritmo de segurança para verificar se o sistema está em um estado seguro após esta alocação de recursos. Se for seguro, os recursos são oficialmente alocados para o processo Pi e a alocação de recursos foi concluída; caso contrário, a alocação de teste é invalidada, o estado de alocação de recursos original é restaurado e o processo Pi espera.
Algoritmo de segurança
(1) Configure dois vetores:
① Vetor de trabalho Trabalho, que representa a quantidade de vários recursos que o sistema pode fornecer para que o processo continue em execução. Contém m elementos. No início da execução do algoritmo de segurança, Trabalho: = Disponível.
② Concluir, ele disse se o sistema tem recursos suficientes alocados para o processo para fazê-lo funcionar até a conclusão. No início, faça Finish: = false; quando houver recursos suficientes alocados para o processo, deixe Finish [i]: = true.
(2) Encontre um processo que atenda às seguintes condições do conjunto de processos:
① Terminar [i]: = falso;
② Precisa [i, j] <= Trabalho [j]; Se encontrado, vá para a etapa (3), caso contrário, vá para a etapa (4).
(3) Quando o processo Pi obtém recursos, ele pode executar sem problemas até que seja concluído e liberar os recursos alocados para ele. Portanto, ele deve executar:
Trabalho [j]: = Trabalho [j] + Alocação [i, j];
Concluir [i]: = verdadeiro;
Vá para a etapa 2;
(4) Se o Término [i] = verdadeiro de todos os processos for satisfeito, significa que o sistema está em um estado seguro; caso contrário, o sistema está em um estado inseguro.
#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<<"安全";
}