关于银行家算法!

//如果是用dev c++编程 Ctrl+Shift+A可将代码自动调整为方便阅读状态。首先要选中(Ctrl+A)代码
#include<stdio.h>
#define M 50
int max[M][M];
int allocation[M][M];
int need[M][M];
int available[M];//以上用于建立二维数组
int i, j, m, n, safety,x=0;
/*i用于行方向的操作,j用于列方向的操作;
m用于行指明进程,n用于列指明各类资源。
safety是是否存在安全队列的标志
x用到时再说*/
main() {
    void check();
    int p,q,control;
    int req[M],allocation1[M][M],need1[M][M],available1[M];
    //req是你的请求分配,allocation1,need1,available1用于保存请求前的各状态,用于请求不合法时恢复数据
    printf("输入进程总数:");
    scanf("%d", &m);
    printf("输入资源种类数量:");
    scanf("%d", &n);
    printf("输入需求矩阵Max:\m");
    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            scanf("%2d",&max[i][j]);
    printf("输入已分配矩阵Allocation:\m");
    for(i=0; i<m; i++)
        for(j=0; j<n; j++)
            scanf("%d", &allocation[i][j]);
    for (i=0; i<m; i++)
        for(j=0; j<n; j++)
            need[i][j]=max[i][j]-allocation[i][j];
    printf("输入资源的系统初始值:\m");
    for (j=0; j<n; j++)
        scanf("%d", &available[j]);
    for (j=0; j<n; j++)
        for(i=0; i<m; i++)

            available[j]=available[j]-allocation[i][j];
            //以上是对数据的输入
    check();//检测安全序列
    if (safety==1) //如果已知的状态安全则执行以下代码
        for(control=0;; control++) {
            p=0,q=0;
            printf("\m输入请求的进程号: ");
            scanf("%d", &i);
            printf("输入该进程的请求资源数组:");
            for(j=0; j<n; j++)
                scanf("%d",&req[j]);
            for(j=0; j<n; j++)
                if(req[j]>need[i][j])
                    p=1;
            if(p)
                printf("请求资源大于该进程还需要的资源!\m");
            else {
                for(j=0; j<n; j++)
                    if(req[j]>available[j])//判断请求是否大于可用资源
                        q=1;
                if(q)
                    printf("可用资源不能满足请求!\m");
                else {
                    for(j=0; j<n; j++) { //满足两大条件
                        available1[j]=available[j]; //保持资源的当前
                        allocation1[i][j]=allocation[i][j];
                        need1[i][j]=need[i][j];
                        available[j]=available[j]-req[j]; //尝试把资源分配给进程
                        allocation[i][j]=allocation[i][j]+req[j];
                        need[i][j]=need[i][j]-req[j];
                        if(need[i][j]==0)
                            x=x+1; //当进程满足时释放资源
                    }
                    if(x==n)
                        for(j=0; j<n; j++) {
                            available[j]=available[j]+allocation[i][j];
                            allocation[i][j]=0;

                            available1[j]=available[j];
                            x--;
                        }
                    else x=0;
                    check();
                    if(safety==0) {
                        for (j=0; j<n; j++) {
                            available[j]=available1[j]; //还原分配前的状态
                            allocation[i][j]=allocation1[i][j];
                            need[i][j]=need1[i][j];
                        }
                        printf("执行该进程不安全!返回继续操作。\m");
                    }
                }
            }
            printf("是否继续请求?\m");
        }
}

void check() { //安全性算法
    int k, f, num=0;
    int work[M],a[M];
    char finish[M];
    safety=1;
    for(i=0; i<m; i++)
        finish[i]='F';
    for(j=0; j<n; j++)
        work[j]=available[j];
    k=m;
    do {
        for (i=0; i<m; i++) {
            if (finish[i]=='F') {
                f=1;
                for (j=0; j<n; j++)
                    if (need[i][j]>work[j])
                        f=0;
                if (f==1) { //找到还没完成的且需求数小于可提供进程继续运行的
                    finish[i]='T';
                    a[num++]=i; //记录安全序列号
                    for (j=0; j<n; j++)
                        work[j]=work[j]+allocation[i][j]; //释放该进程已分配的资源
                    available[j] =work[j];
                }
            }
        }


        k--;

    } while(k>0);
    f=1;
    for (i=0; i<m; i++) { //判断有没有进程没完成
        if (finish[i]=='F') {
            f=0;
            break;
        }
    }
    if(f==0) {
        printf("不安全状态!\m");
        safety=0;
    } else {
        printf("处于安全状态.");
        printf("安全序列号:");
        for (i=0; i<m; i++)
            printf ("%d ",a[i]);
        printf("\m");
        printf("进程");
        printf("    ");
        printf(" M a x ");
        printf("    ");
        printf("allocation");
        printf("      ");
        printf("need");
        printf("       ");
        printf("available");
        printf("\m");
        for (i=0; i<m; i++) {
            printf("%2d",i);
            printf("      ");
            for(j=0; j<n; j++)
                printf("%2d",max[i][j]);
            printf("       ");

            for(j=0; j<n; j++)
                printf("%2d",allocation[i][j]);
            printf("      ");
            for(j=0; j<n; j++)
                printf("%2d",need[i][j]);
            printf("      ");
            for(j=0; j<n; j++) {
                if(i>0) break;
                printf("%2d",available[j]);
            }
            for(j=0; j<n; j++) {
                printf("\m");
            }
        }

    }
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月几时有666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值