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

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 使用最少的代码,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


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
6月前
|
算法 安全
【操作系统】死锁处理-银行家算法
【操作系统】死锁处理-银行家算法
213 0
|
6月前
|
存储 算法 安全
操作系统:银行家算法
操作系统:银行家算法
118 0
|
2月前
|
Unix 编译器 Shell
[oeasy]python0033_先有操作系统还是先有编程语言_c语言是怎么来的
本文回顾了计算机语言与操作系统的起源,探讨了早期 Unix 操作系统及其与 C 语言的相互促进发展。Unix 最初用汇编语言编写,运行在 PDP-7 上,后来 Thompson 和 Ritchie 开发了 C 语言及编译器,使 Unix 重写并成功编译。1974 年 Ritchie 发表论文,Unix 开始被学术界关注,并逐渐普及。伯克利分校也在此过程中发挥了重要作用,推动了 Unix 和 C 语言的广泛传播。
61 9
[oeasy]python0033_先有操作系统还是先有编程语言_c语言是怎么来的
|
3月前
|
算法 安全
操作系统中的死锁
【8月更文挑战第23天】
47 0
|
1月前
|
Linux C语言 iOS开发
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
MacOS环境-手写操作系统-06-在mac下通过交叉编译:C语言结合汇编
19 0
|
3月前
|
程序员 数据库
深入剖析操作系统死锁:不可不知的四大条件!
大家好,我是小米。今天探讨操作系统中的死锁问题——两个或更多进程因争夺资源陷入相互等待的状态。死锁有四个必要条件:互斥、请求与保持、非剥夺及循环等待。解决策略包括:使用乐观锁破坏互斥条件;资源一次性分配避免请求与保持;允许资源剥夺;以及采用资源有序分配法消除循环等待。通过这些方法,可以有效预防和解决死锁,提升系统稳定性和效率。希望本文能帮助你更好地理解并处理死锁问题!
140 4
|
3月前
|
算法 安全 调度
操作系统中的死锁、饥饿和优先级反转
【8月更文挑战第23天】
127 0
|
3月前
|
安全 算法 C++
操作系统---死锁相关
操作系统---死锁相关
32 0
|
6月前
|
安全 算法 程序员
操作系统(9)----死锁
操作系统(9)----死锁
45 1
|
6月前
|
数据采集 安全 调度
【C 言专栏】C 语言与操作系统的交互
【5月更文挑战第1天】C语言在操作系统中扮演核心角色,常用于内核及系统级应用开发。它涉及进程管理(如`fork()`创建进程)、内存分配(`malloc()`、`free()`)、文件操作(`open()`、`read()`等)和设备驱动。C语言允许直接硬件交互,支持进程间通信和文件系统管理,但也带来资源管理、错误处理和可移植性的挑战。在嵌入式系统中,C语言尤为重要。随着技术发展,C语言将继续适应新操作系统和硬件架构,与其他语言融合,推进系统编程进步。
99 0
【C 言专栏】C 语言与操作系统的交互