操作系统之避免死锁——银行家算法

如有问题,望指正。
#include <stdio.h>
#include <cstring>
#include<iostream>
const int MAXN = 10005;
using namespace std;
int available[MAXN];                 /*可用资源数组*/
int claim[MAXN][MAXN];              /*最大需求矩阵*/
int allocation[MAXN][MAXN];      /*表示Pi已占有的Rj类资源数量*/
int need[MAXN][MAXN];               /*需求矩阵*/
int request[MAXN][MAXN];          /*进程还需要资源数*/
bool finish[MAXN];                          /*系统是否有足够的资源分配*/
int p[MAXN];                               /*记录完成*/
int m,n;                                      /*m个进程,n个资源*/
void inti(){
    memset(finish,false,sizeof(finish));

    printf("请输入进程数量:\n");
    scanf("%d",&m);

    printf("请输入资源数量:\n");
    scanf("%d",&n);

    printf("请输入进程最大需求矩阵:\n");
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&claim[i][j]);
        }
    }

    printf("请输入进程已经占有的资源数量:\n");
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&allocation[i][j]);
            need[i][j]=claim[i][j]-allocation[i][j];
            if(need[i][j]<0){
                printf("错误,请重新输入%d进程已经占有%d资源的数量\n",i,j);
                j--;
            }
        }
    }

    printf("请输入可用的资源组:\n");
    for(int j=1;j<=n;j++)
        scanf("%d",&available[j]);
}
bool solve(){
    bool flag;
    for(int i=1;i<=m;i++){ //遍历每个进程
        if(!finish[i]){
            flag=true;
            for(int j=1;j<=n;j++){
                if(need[i][j]>available[j])
                    flag=false;
            }
            if(flag){
                finish[i]=true;
                printf("-->P%d \n",i);
                printf("available: ");
                for(int j=1;j<=n;j++){
                    available[j]+=allocation[i][j];
                    printf(" %d",available[j]);
                }
                printf("\n");
                i=0;
            }
        }
    }
    flag=true;
    for(int i=1;i<=m;i++){
        if(!finish[i]){
            flag=false;
            break;
        }
    }
    if(flag){
        printf("系统安全\n");
        return true;
    }
    else{
        printf("系统危险\n");
        return false;
    }
}
void bank(){
    int process;
    while(1)
    {
        memset(finish,false,sizeof(finish));
        printf("请输入要申请资源的进程号:\n");
        scanf("%d",&process);
        if(process==-1) break;

        printf("请输入进程所请求的各资源的数量:\n");
        for(int i=1; i<=n; i++)
        {
            scanf("%d",request[i]);
            if(request[process][i]>need[process][i])
            {
                printf("您输入的%d资源请求数超过进程的需求量!请重新输入!\n",i);
                i--;
            }
            if(request[process][i]>available[i])
            {
                printf("您输入的%d资源请求数超过系统有的资源数!请重新输入!\n",i);
                i--;
            }
        }
        for(int i=1; i<=n; i++)
        {
            available[i]-=request[process][i];
            allocation[process][i]+=request[process][i];
            need[process][i]-=request[process][i];
        }
        if(solve())
        {
            printf("同意分配请求!\n");
        }
        else
        {
            printf("您的请求被拒绝!\n");
            for(int i=1; i<=n; i++)
            {
                available[i]+=request[process][i];
                allocation[process][i]-=request[process][i];
                need[process][i]+=request[process][i];
            }
        }
    }
}
int main(){
    inti();
    solve();
    bank();
}
/*
5
4
4 1 1 1
0 2 1 2
4 2 1 0
1 1 2 1
2 1 1 0

3 0 1 1
0 1 0 0
1 1 1 0
1 1 0 1
0 0 0 0

1 0 2 0
*/

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值