algoritmo [Sistema operativo] banqueros

algoritmo del banquero

Dirección del blog: https://www.iamzlt.com/?p=87

(A) la finalidad y los requisitos

Banqueros evitar algoritmo de punto muerto es un algoritmo de Dijkstra diseño más representativo. En este estudio, el algoritmo de simulación pidió que preparara un banquero en un lenguaje de alto nivel. Podemos tener una comprensión más profunda de la prevención del estancamiento y los banqueros algoritmo mediante este experimento.

(B) contenido experimental

1 , en la estructura de datos

Vector que comprende recursos (disponible), matriz de demanda máxima (Max), la matriz de asignación (Asignación), matriz de la demanda (Necesidad)

2 , el diseño de algoritmos de seguridad

el trabajo conjunto indica que proporciona el sistema de proceso de vectores Se sigue trabajando para ejecutar el número de recursos disponibles, en Finalizar indicar si el sistema tiene suficientes recursos asignados al proceso

(C) el medio ambiente experimental

  1. ordenador personal
  2. VC ++
[Ejecutar] Código
#include<iostream>

#include<bits/stdc++.h>

#define MAXN 100

#define NAME_MAX

using namespace std;

const int PNumber=5;

const int SNumber=3;

char Source[PNumber];

int Request[SNumber];

int Available[SNumber]={3,3,2};

int MAX[PNumber][SNumber]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};

int Allocation[PNumber][SNumber]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};

int Need[PNumber][SNumber]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};

int OP[PNumber][SNumber];

//int Over[PNumber];




bool judgement(int n){

    int flag=0;

    for(int j=0; j<SNumber; j++)

        if(Need[n][j]==0) flag++;

    if(flag==SNumber)return false;

    return true;

}




void initialize(){

    int i;

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

        if(!judgement(i)){

            for(int j=0; j<SNumber; j++) Available[j]+=MAX[i][j];

            cout<<"进程P"<<i+1<<"所需的资源全部满足,此进程运行完毕!"<<endl;

        }

    cout<<"此刻进程中存在的进程:"<<endl;

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

        if(judgement(i))    cout<<"P"<<i+1<<'\t';







    cout<<endl<<"此刻系统可利用的资源(单位:个):"<<endl;

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

        printf("%c\t",'A'+i);

    cout<<endl;

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

        cout<<Available[i]<<'\t';

    cout<<endl<<"此刻各进程已占有资源如下(单位:个):"<<endl;

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

        printf("\t%c",'A'+i);

    cout<<endl;

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

        if(judgement(i)){

            cout<<"P"<<i+1<<'\t';

            for(int j=0; j<SNumber; j++)

                cout<<MAX[i][j]-Need[i][j]<<'\t';

            cout<<endl;

        }

    cout<<"各进程运行完毕还需各资源如下(单位:个):"<<endl;

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

        printf("\t%c",'A'+i);

    cout<<endl;

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

        if(judgement(i)){

            cout<<"P"<<i+1<<'\t';

            for(int j=0; j<SNumber; j++)

                cout<<Need[i][j]<<'\t';

            cout<<endl;

        }

}

void systemstatus(){




}

int security(int n){

    int Work[SNumber],i;

    bool Finish[PNumber];

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

        Finish[i]=false;

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

        Work[i]=Available[i];

    for(i=0; i<PNumber; i++){

        int flag=1;

        for(int j=0; j<SNumber; j++)

            if(!(Need[i][j]<=Work[j])) flag=0;

        if(!Finish[i]&&flag){

            for(int j=0; j<SNumber; j++)

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

            Finish[i]=true;

            //cout<<i<<endl;

            i=-1;

            continue;

        }

    }

    int flag=1;

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

        if(!Finish[i]) flag=0;

    if(flag==1){

            //

    }else{

        cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

        cout<<"若满足申请,系统将进入不安全状态,可能导致死锁!"<<endl;

        return 0;

    }

    return 1;

}




void banker(int n){

    for(int i=0; i<SNumber; i++)

        if(!(Request[i]<=Need[n][i])){

            cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

            cout<<"申请的资源中某种资源大于其声明的需求量!"<<endl;

            return;

        }

    for(int i=0; i<SNumber; i++)

        if(!(Request[i]<=Available[i])){

            cout<<"不能满足申请,此进程挂起,原因为:"<<endl;

            cout<<"申请的资源大于系统可提供的资源量,P"<<n+1<<"需等待"<<endl;

            return;

        }

    for(int i=0; i<SNumber; i++){

        Available[i]-=Request[i];

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

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

    }

    if(security(n)==1){

        cout<<"可以满足申请,";

        initialize();

    }else{

        for(int i=0; i<SNumber; i++){

            Available[i]+=Request[i];

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

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

        }

    }

}




int main(){

    initialize();

    int n,i;

    while(1){

        cout<<"输入发出请求的进程(输入‘0’退出系统):";

        cin>>n;

        if(n==0) break;

        cout<<"此进程申请个资源数目:"<<endl;

        for(i=0; i<SNumber; i++){

            printf("%c",'A'+i);

            cout<<"资源:";

            cin>>Request[i];

        }

        banker(n-1);

    }

}

[Resultados] plazo

Resultados Análisis]

Primero: solicitud de recursos P4, P4 solicitud vector (0,1,0), para inspeccionar el algoritmo del banquero

  1. Solicitud (0,1,0) <= Necesidad (0,1,1,)
  2. Request (0,1,0) <= Availabele (3,2,2)
  3. sistema P4 asumió por primera vez para asignar recursos y modificar los valores
  4. algoritmo comprueba el uso de seguridad si este sistema es seguro
 

Del mismo modo el segundo, el tercero se puede determinar.

En el pasado, la solicitud de recursos P2, P4 solicitud vector (1,2,2), para cumplir con la aplicación y los recursos necesarios para cumplir con todos P2, correr acabada dará a conocer su participación en los recursos, los recursos del sistema están disponibles en este momento {5,2,2}.

Publicado 24 artículos originales · ganado elogios 7 · vistas 1895

Supongo que te gusta

Origin blog.csdn.net/weixin_43426647/article/details/105328092
Recomendado
Clasificación