【操作系统--银行家与死锁】C语言详解(附代码)

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 使用最少的代码,C语言实现OS银行家与死锁

 一、实验思路

     采用步步为营策略,当某进程提出资源请求时,系统先假设响应该资源请求,然后判断系统的资源状态是否处于安全状态,若安全则分配资源,否则不进行分配。

二、数据结构

  Available[m]: 可用资源,m个资源类型

  Max[n][m]:  n个进程提交的最大资源需求,n*m矩阵

  Allocation[n][m]: n个进程已获得的资源,n*m矩阵

  Need[n][m]:  n个进程还需要的资源,n*m矩阵

三、测试数据

image.gif编辑

3.1)如果P1 请求资源(1,0,2),能否分配?

       实验结果

image.gif编辑

 3.2)如果P0 请求资源(0,2,0) ,能否分配?

       实验结果

image.gif编辑

3.3) 如果 P4 请求资源(3,3,0) ,能否分配?

image.gif编辑

四、代码

#include<stdio.h>
#include<stdlib.h>
int  Judge(int a[])                                                                             //判断是否全部进入安全状态 
{
  int sum=0;
  for (int i=0;i<5;i++)
  {
    if(a[i]==1)
    {sum++;
    }     
  }
  if(sum!=5){ return 1;}
  else return 0;
}  
int main()
{
  //初始化 
  int Allocation[5][3]={ {0,1,0}, {2,0,0}, {3,0,2}, {2,1,1}, {0,0,2}};
  int Max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
  int Need[5][3]= {{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
  int Available[3]={3,3,2};
  int Requesti[3]={3,3,0};                                                                      //修改值申请的值 
  if(Need[4][0]>=Requesti[0]&&Need[4][1]>=Requesti[1]&&Need[4][2]>=Requesti[2]){              //修改值进程剩余资源是哪一个 
    if(Available[0]>=Requesti[0]&&Available[1]>=Requesti[1]&&Available[2]>=Requesti[2]) {   
      for(int j=0;j<3;j++){                                    
      Allocation[4][j]+=Requesti[j];                                                      //修改值:第一次申请值后,对应的是哪个进程需要修改 
      Available[j]-=Requesti[j];
      Need[4][j]-=Requesti[j];                                                          //修改值:第一次申请值后,对应的是哪个进程需要修改  
      }
      //安全性算法
       {
        int work[3],finish[5];
        for (int j=0;j<3;j++){work[j]=Available[j];}
        for(int j=0;j<5;j++){finish[j]=0;}
        int sum1 =0;
          while(Judge (finish))
          {sum1++;
          printf("进入安全序列的顺序是:\n");
            for(int j =0;j<5;j++){
              if (finish[j]==0&&(Need[j][0]<=work[0]&&Need[j][1]<=work[1]&&Need[j][2]<=work[2]))
              {finish[j]=1;
              printf("p%d \n",j);
               for(int m=0;m<3;m++){ work[m]+=Allocation[j][m];}
              }
            }
            if(sum1>5)
            {break;
            }
          }
          if(!Judge(finish))
          {printf("victory");
          }
          if(Judge(finish))
          {printf("fail");
          }
       }
    }
  } 
}

image.gif


目录
相关文章
|
算法 安全
【操作系统】死锁处理-银行家算法
【操作系统】死锁处理-银行家算法
716 0
|
存储 算法 安全
操作系统:银行家算法
操作系统:银行家算法
589 0
|
存储 监控 安全
C语言与操作系统交互探秘
系统调用与库函数 在 C语言中,系统调用是用户程序与操作系统内核交互的桥梁。以下是常见系统调用的概述: 文件操作类:open()、read()、write()、close()、lseek() 进程控制类:fork()、exec()、wait()、exit() 信号处理类:signal()、kill() 进程间通信:pipe()、shmget()、msgget() 网络通信:socket()、bind()、listen()、accept() 系统调用 vs 库函数:
499 20
|
算法 安全
操作系统中的死锁
【8月更文挑战第23天】
339 0
|
程序员 数据库
深入剖析操作系统死锁:不可不知的四大条件!
大家好,我是小米。今天探讨操作系统中的死锁问题——两个或更多进程因争夺资源陷入相互等待的状态。死锁有四个必要条件:互斥、请求与保持、非剥夺及循环等待。解决策略包括:使用乐观锁破坏互斥条件;资源一次性分配避免请求与保持;允许资源剥夺;以及采用资源有序分配法消除循环等待。通过这些方法,可以有效预防和解决死锁,提升系统稳定性和效率。希望本文能帮助你更好地理解并处理死锁问题!
737 4
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
556 0
|
算法 安全 调度
操作系统中的死锁、饥饿和优先级反转
【8月更文挑战第23天】
837 0
|
安全 算法 C++
操作系统---死锁相关
操作系统---死锁相关
|
安全 算法 程序员
操作系统(9)----死锁
操作系统(9)----死锁
767 1

推荐镜像

更多