操作系统银行家算法(安全序列不唯一)

#include <stdio.h>
#include <string.h>
#define size 50
typedef struct bank
{
    int process;//进程数
    int resource;//资源数
    int Max[size][size];//最大需求量
    int Allcation[size][size];//已分配资源数
    int Need[size][size];//还需资源数
    int Available[size];
}Bank;
Bank bank;
int k = 0;
int vis[size]; //标记数组
int SafeSeq[size];
void ScanfResource()
{
    int i,j;
    for(i = 0;i < bank.process;i ++)
    {
        printf("----------第%d进程----------\n",i + 1);
        printf("最大资源量:",i + 1);
        for(j = 0;j < bank.resource;j ++)
        {
            scanf("%d",&bank.Max[i][j]);
        }
        printf("\n");
        printf("已分配资源量:",i + 1);
        for(j = 0;j < bank.resource;j ++)
        {
            scanf("%d",&bank.Allcation[i][j]);
        }
        for(j = 0;j < bank.resource;j ++)
        {
            bank.Need[i][j] = bank.Max[i][j] - bank.Allcation[i][j];
        }
        if(i == bank.process - 1 )
             printf("--------------------------------\n");
    }
}



void  PrintfInfo()
{
    int i,j;
    printf("进程\t最大资源量\t已分配资源量\t还需资源量\n");
   for(i = 0;i < bank.process;i ++)
   {
       printf("%d\t",i + 1);
       for(j = 0;j < bank.resource;j ++)
       {

           if(j == bank.resource - 1)
                printf("%d \t",bank.Max[i][j]);
		   else
			   printf("%d  ",bank.Max[i][j]);
       }
       for(j = 0;j < bank.resource;j ++)
       {

           if(j == bank.resource - 1)
                printf("%d \t",bank.Allcation[i][j]);
		   else
				printf("%d  ",bank.Allcation[i][j]);
       }
       for(j = 0;j < bank.resource;j ++)
       {

           if(j == bank.resource - 1)
                printf("%d",bank.Need[i][j]);
		   else
				printf("%d  ",bank.Need[i][j]);
       }
       printf("\n");
   }
}



void  InitResource()
{
    int i,j;
    int s;
    printf("请输入每种资源的数量:\n");
    for(i = 0;i < bank.resource;i ++)
    {
        printf("第%d种:",i + 1);
        scanf("%d",&bank.Available[i]);
        printf("\n");
    }
}

void InitRequest()
{
    int i,s,j;
    for(i = 0;i < bank.resource;i ++)
    {
        s = 0;
        for( j = 0;j < bank.process;j ++)
        {
            s += bank.Allcation[j][i];
        }
        bank.Available[i] = bank.Available[i] - s;
    }
}
int  SafeSequence()
{
    int i,j;
    int flag,flag1;
    i = k = 0;
    while(k <= bank.process - 1)
    {
        flag = flag1 = 0;
        if(i >= bank.process)
            i = 0;
        for(j = 0;j < bank.resource;j ++)
        {
            if(bank.Available[j] < bank.Need[i][j])
            {
                flag = 1;
                break;
            }
        }
        if(flag == 0 && vis[i] == 0)
        {
            vis[i] = 1;
            SafeSeq[k ++] = i;
           
            for(j = 0;j < bank.resource;j ++)
                bank.Available[j] += bank.Allcation[i][j];
         i = -1;
        }
        i ++;
    }
    return  k;
}
int main()
{
    int i,j;
    int k;
    memset(vis,0,sizeof(vis));
    printf("请输入进程数:");
    scanf("%d",&bank.process);
    printf("请输入资源数:");
    scanf("%d",&bank.resource);
    InitResource();
    ScanfResource();
    InitRequest();
    PrintfInfo();
    k = SafeSequence();
    printf("安全序列:");
    for(i = 0;i < k;i ++)
      printf("%d ",SafeSeq[i]);
    return 0;
}
银行家算法=-- - 1. 安全状态: 在某时刻系统中所有进程可以排列一个安全序列:{P1,P2,`````Pn},刚称此时,系统是安全的. 所谓安全序列{P1,P2,`````Pn}是指对于P2,都有它所需要剩余资源数量不大于系统掌握的剩余的空间资源与所有Pi(j<i)所占的资源之和. 2.不安全状态可能产生死锁. 目前状态 最大需求 尚需 P1 3 9 6 P2 5 10 5 P3 2 4 2 在每一次进程中申请的资源,判定一下,若实际分配的话,之后系统是否安全. 3.银行家算法的思路: 1),进程一开始向系统提出最大需求量. 2),进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待. 4.银行家算法的数据结构. 1),系统剩余资源量A[n],其中A[n]表示第I类资源剩余量. 2),各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i 类资源最大需求. 3),已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量. 4),剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目. 5.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作: 1),判定E[n]是否大于D[j][n],若大于,表示出错. 2),判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待. 3),若以上两步没有问题,尝试分配,即各变量作调整. 4),按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待. 6."安全性检测"算法 1),先定义两个变量,用来表示推算过程的数据. F[n]=A[n],表示推算过程中,系统中剩余资源量的变化. J[n]=False表示推算过程中各进程是否假设"已完成" 2),流程: 在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True (假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行. 若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值