操作系统-银行家算法(显示当前所有安全序列)-C语言

银行家算法

给进程分配资源,是系统处于安全状态;当进程向系统申请资源时,系统要预判分配资源后是否还存在安全状态,如果存在则分配,否则不分配。先看效果再附源码(源码、经验交流QQ群:613879714),有问题QQ群提问,这里不能及时回复

演示

B站演示视频链接

银行家算法-C语言

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源代码


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10 
struct POC{
   
 char JobName;//进程名
 int Allocation[3];//已拥有资源数 
 int Need[3];//还需求资源数 
 int Pass;//是否已经过 1是 0否 
}job[N]={
   {
   'A', 0,1,0, 7,4,3 ,0},//3:7  5 3 
      {
   'B', 2,0,0, 1,2,2 ,0},//1:5  3 2 
      {
   'C', 3,0,2, 6,0,0 ,0},//4:10 5 5 
      {
   'D', 2,1,1, 0,1,1 ,0},//2:7  4 3
      {
   'E', 0,0,1, 4,3,1 ,0} //5:10 5 6  
};//3 3 2
int Number=5,SafetySequenceNumber;
int Available[3]={
   3,3,2};
//1.1安全序列
void SafetySequence(char c[N],int k){
   
 int j;
    for(j=0;j<Number;j++){
   
  if(Available[0]>=job[j].Need[0
  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法是一种进程调度算法,用于避免死锁问题。下面是一个简单的操作系统银行家算法的示例,使用 C 语言实现。 ```c #include <stdio.h> #define N 5 // 进程数量 #define M 3 // 源数量 int available[M]; // 可用源数 int allocation[N][M]; // 已分配源数 int need[N][M]; // 还需要的源数 int max[N][M]; // 进程最大需求源数 int request[M]; // 请求源数 int work[M]; // 工作向量 int finish[N]; // 进程是否完成标识 void init() { int i, j; printf("请输入可用源数:"); for (i = 0; i < M; i++) { scanf("%d", &available[i]); } printf("请输入每个进程的最大需求源数:\n"); for (i = 0; i < N; i++) { printf("进程%d:", i + 1); for (j = 0; j < M; j++) { scanf("%d", &max[i][j]); } } printf("请输入每个进程已分配的源数:\n"); for (i = 0; i < N; i++) { printf("进程%d:", i + 1); for (j = 0; j < M; j++) { scanf("%d", &allocation[i][j]); need[i][j] = max[i][j] - allocation[i][j]; } } } int check(int p) { int i; for (i = 0; i < M; i++) { if (need[p][i] > work[i]) { return 0; } } return 1; } int bank() { int i, j, k, flag; for (i = 0; i < M; i++) { work[i] = available[i]; } for (i = 0; i < N; i++) { finish[i] = 0; } for (i = 0; i < N; i++) { if (finish[i] == 0 && check(i)) { for (j = 0; j < M; j++) { work[j] += allocation[i][j]; } finish[i] = 1; } } flag = 1; for (i = 0; i < N; i++) { if (finish[i] == 0) { flag = 0; break; } } if (flag == 1) { return 1; } else { return 0; } } int main() { int i, j, p; init(); printf("请输入请求源的进程编号:"); scanf("%d", &p); printf("请输入请求的源数:"); for (i = 0; i < M; i++) { scanf("%d", &request[i]); if (request[i] > need[p][i]) { printf("错误:请求的源数大于进程还需要的源数!\n"); return 0; } if (request[i] > available[i]) { printf("错误:请求的源数大于系统可用源数!\n"); return 0; } } for (i = 0; i < M; i++) { available[i] -= request[i]; allocation[p][i] += request[i]; need[p][i] -= request[i]; } if (bank()) { printf("系统安全,允许分配!\n"); printf("安全序列:"); for (i = 0; i < N; i++) { if (finish[i] == 1) { printf("%d ", i + 1); } } printf("\n"); } else { printf("系统安全,不允许分配!\n"); for (i = 0; i < M; i++) { available[i] += request[i]; allocation[p][i] -= request[i]; need[p][i] += request[i]; } } return 0; } ``` 该程序中,`init()` 函数用于初始化源数量和进程的最大需求源数、已分配源数、还需要的源数等数组。`check()` 函数用于检查进程是否需要的源数小于等于系统可用源数。`bank()` 函数用于模拟银行家算法的过程,其中使用了工作向量和完成标识数组。最后,在 `main()` 函数中,用户输入需要请求源的进程编号和请求源数,然后判断是否可以分配源,并输出结果。 注意:该示例程序仅供参考,实际使用中需要根据具体情况进行调整和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值