使用银行家算法避免死锁_操作系统_c语言实现

1.银行家算法测试数据:

系统有5个进程(p0,p1,p2,p3,p4)和4类资源(A,B,C,D),在T0时刻的资源分配情况如下表所示:
在这里插入图片描述
试问:
(1)该状态是否安全?答:安全,安全序列为0 3 4 1 2
(2)如果进程P2提出请求Request2(1,2,2,2)后,系统能否将资源分配给它?
答:不能,分配给p2(1,2,2,2)后,Available还剩(0,4,0,0),这时候已经不能满足任何进程的,进入死锁状态

2.算法流程图:

在这里插入图片描述

3.源程序代码

#include<stdio.h>
#define resourceNum 4
#define processNum  5
//系统可用(剩余)资源
int available[resourceNum]={
   1,6,2,2};
//进程的最大需求
int maxRequest[processNum][resourceNum]={
   {
   0,0,4,4},{
   2,7,5,0},{
   3,6,10,10},{
   0,9,8,4},{
   0,6,6,10}};
//进程已经占有(分配)资源
int allocation[processNum][resourceNum]={
   {
   0,0,3,2},{
   1,0,0,0},{
   1,3,5,4},{
   0,3,3,2},{
   0,0,1,4}};
//进程还需要资源
int need[processNum][resourceNum]={
   {
   0,0,1,2},{
   1,7,5,0},{
   2,3,5,6},{
   0,6,5,2},{
   0,6,5,6}};
//是否安全
bool Finish[processNum];
//安全序列号
int safeSeries[processNum]={
   0,0,0,0,0};
//进程请求资源量
int request[resourceNum];
//资源数量计数
int num;

//打印输出系统信息
void showInfo()
{
   
	printf("\n------------------------------------------------------------------------------------\n");  
	printf("当前系统各类资源剩余:");
    for(
  • 8
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
银行家算法是一种操作系统中用于避免死锁的算法。它通过动态地分配资源避免死锁的发生。在银行家算法中,系统会对每个进程资源请求进行检查,如果该请求导致系统进入不安全状态,则该请求将被拒绝,否则该请求将被满足。C语言是一种常用的编程语言,可以用来实现银行家算法。 以下是利用C语言实现银行家算法的基本步骤: 1. 定义进程数和资源数,以及每个进程的最大需求量、已分配资源量和需要资源量。 2. 定义可用资源量和安全序列。 3. 实现银行家算法的主要函数,包括安全性检查函数和资源分配函数。 4. 在主函数中调用银行家算法函数,输出安全序列或死锁信息。 以下是一个简单的C语言实现银行家算法的例子: ```c #include <stdio.h> #define MAX_PROCESS 10 #define MAX_RESOURCE 10 int available[MAX_RESOURCE]; int max[MAX_PROCESS][MAX_RESOURCE]; int allocation[MAX_PROCESS][MAX_RESOURCE]; int need[MAX_PROCESS][MAX_RESOURCE]; int work[MAX_RESOURCE]; int finish[MAX_PROCESS]; int safety_check(int n, int m) { int i, j, k, count = 0; for (i = 0; i < m; i++) { work[i] = available[i]; } for (i = 0; i < n; i++) { finish[i] = 0; } while (count < n) { int found = 0; for (i = 0; i < n; i++) { if (!finish[i]) { int flag = 1; for (j = 0; j < m; j++) { if (need[i][j] > work[j]) { flag = 0; break; } } if (flag) { for (k = 0; k < m; k++) { work[k] += allocation[i][k]; } finish[i] = 1; found = 1; count++; } } } if (!found) { return 0; } } return 1; } int resource_request(int pid, int request[], int n, int m) { int i, j; for (i = 0; i < m; i++) { if (request[i] > need[pid][i] || request[i] > available[i]) { return 0; } } for (i = 0; i < m; i++) { available[i] -= request[i]; allocation[pid][i] += request[i]; need[pid][i] -= request[i]; } if (!safety_check(n, m)) { for (i = 0; i < m; i++) { available[i] += request[i]; allocation[pid][i] -= request[i]; need[pid][i] += request[i]; } return 0; } return 1; } int main() { int n, m, i, j; printf("Enter the number of processes: "); scanf("%d", &n); printf("Enter the number of resources: "); scanf("%d", &m); printf("Enter the available resources: "); for (i = 0; i < m; i++) { scanf("%d", &available[i]); } printf("Enter the maximum demand of each process: "); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &max[i][j]); } } printf("Enter the allocated resources of each process: "); for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { scanf("%d", &allocation[i][j]); need[i][j] = max[i][j] - allocation[i][j]; } } if (safety_check(n, m)) { printf("The system is in safe state.\n"); } else { printf("The system is in unsafe state.\n"); } int pid; int request[MAX_RESOURCE]; printf("Enter the process id and resource request: "); scanf("%d", &pid); for (i = 0; i < m; i++) { scanf("%d", &request[i]); } if (resource_request(pid, request, n, m)) { printf("The request is granted.\n"); } else { printf("The request is denied.\n"); } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值