银行家算法详解

为了方便大家复习这里就不再详细赘述银行家算法的一些前世今生什么的,咱们直接上例题

上概念。

先熟悉几个要用到的关键词的概念。

最大申请矩阵(MAX):每个进程运行完所需要的最大资源向量

分配矩阵(allocation):这个时刻已经占有的资源向量

需求矩阵(need):这个时刻还需要的资源向量

可用矩阵(avaailable):这个时刻可用的资源向量

银行家算法

资源分配算法:

安全性算法:

讲解综合例题

解析

(1)分析:判断此时是否为安全状态,就是推出此时是否能够写出他的安全序列。我们先用有效向量(available)按照顺序依次对比需求矩阵,当所有类型的资源都满足时说明该进程可以执行,每有一个符合的之后。可用进程就得加上该进程的分配矩阵,(之前cpu给他分了一些,用完了得收回来,就是回收之前给他分配的),每一次有一个进程符合之后就从需要按照顺序从第一个开始,开始满足的就不管他了。

答:

注释:work第一个先是有效矩阵,之后是不断更新上一个那个work+allocation,其实就是可用矩阵的意思

(2)分析:我们需要先对于他的请求进行判断。首先是必须要小于我们的need矩阵,就是可以理解成超过需求矩阵之后他已经超过他的max了,来判断合不合法。其次我们判断这个时刻运行至这个进程时,cpu的有效向量是否满足他的请求(可以看一下判断安全序列的那个图)接着画出资源变化图即可。

答:

同时根据安全分析表检查可知,可以找到一个安全序列,因此系统是安全的可以将p1分配的资源分配给他

(3)分析:这道题和第二小问类似,步骤思路也一样。可以将分析表画出来

答:

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
银行家算法用于避免死锁,确保系统资源的分配是安全的。下面是一个简单的银行家算法的C语言代码实现,该代码实现了以下函数: - `request_resources()`:请求资源 - `release_resources()`:释放资源 - `is_safe()`:判断当前状态是否安全 注意,这里的资源是指系统中的各种资源,如内存、I/O设备等。每个进程都会请求一定数量的资源,并在使用完这些资源后释放它们。 ```c #include <stdio.h> #define MAX_PROCESSES 10 #define MAX_RESOURCES 10 int available[MAX_RESOURCES]; int maximum[MAX_PROCESSES][MAX_RESOURCES]; int allocation[MAX_PROCESSES][MAX_RESOURCES]; int need[MAX_PROCESSES][MAX_RESOURCES]; int num_processes; int num_resources; int request_resources(int pid, int request[]) { int i; for (i = 0; i < num_resources; i++) { if (request[i] > need[pid][i]) { return -1; } if (request[i] > available[i]) { return -1; } } for (i = 0; i < num_resources; i++) { available[i] -= request[i]; allocation[pid][i] += request[i]; need[pid][i] -= request[i]; } if (is_safe()) { return 0; } else { for (i = 0; i < num_resources; i++) { available[i] += request[i]; allocation[pid][i] -= request[i]; need[pid][i] += request[i]; } return -1; } } int release_resources(int pid, int release[]) { int i; for (i = 0; i < num_resources; i++) { available[i] += release[i]; allocation[pid][i] -= release[i]; need[pid][i] += release[i]; } return 0; } int is_safe() { int i, j, k; int work[MAX_RESOURCES]; int finish[MAX_PROCESSES]; for (i = 0; i < num_resources; i++) { work[i] = available[i]; } for (i = 0; i < num_processes; i++) { finish[i] = 0; } for (i = 0; i < num_processes; i++) { if (finish[i] == 0) { for (j = 0; j < num_resources; j++) { if (need[i][j] > work[j]) { break; } } if (j == num_resources) { finish[i] = 1; for (k = 0; k < num_resources; k++) { work[k] += allocation[i][k]; } i = -1; } } } for (i = 0; i < num_processes; i++) { if (finish[i] == 0) { return 0; } } return 1; } ``` 在上面的代码中,`available`数组表示每个资源当前可用的数量;`maximum`数组表示每个进程最多需要的每个资源的数量;`allocation`数组表示每个进程已分配的资源数量;`need`数组表示每个进程还需要的资源数量。 `request_resources()`函数用于请求资源。如果请求的资源超过了进程所需要的资源数量或者超过了当前可用的资源数量,该函数将返回-1,表示请求失败。否则,该函数将分配请求的资源,并调用`is_safe()`函数判断当前状态是否安全。如果是安全的,该函数将返回0,否则将释放分配的资源,并返回-1。 `release_resources()`函数用于释放资源。该函数将释放进程已分配的资源,并更新`available`、`allocation`和`need`数组。 `is_safe()`函数用于判断当前状态是否安全。该函数首先初始化`work`数组为当前可用的资源数量,`finish`数组为0。然后对于每个未完成的进程,检查它是否需要的每个资源数量都小于等于`work`数组中的相应资源数量。如果是,将该进程标记为完成,并将它已分配的资源释放到`work`数组中。如果所有进程都完成了,返回1,否则返回0。 在实际使用中,需要根据具体情况修改上面的代码。例如,可以在`request_resources()`和`release_resources()`函数中添加一些输出语句,以便调试和测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值