操作系统——银行家算法

一、写在前面的银行家算法

银行家算法的由来

银行家算法是操作系统中最有代表性的死锁避免方案,操作系统作为裸机上安装的第一层软件,起着控制和管理计算机内部软硬件资源,合理组织计算机工作流程,提高计算机工作效率,用户和计算机硬件接口的重要作用。因此操作系统既要保证系统资源的合理分配提高系统资源利用率,同时又要避免死锁等不安全状况的出现,如果这些不安全状况出现操作系统还要解决这些问题,让系统回到安全状态。银行家算法就是在这样的背景下应运而生的。

银行家算法的核心思想

在进程提出资源申请时,先预判此次分配是否会导致系统进入不安全状态,如果会进入不安全状态,就暂时不答应这次请求,让进程先阻塞等待。

银行家算法的作用

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。
银行家算法的核心它通过自己特有的算法,在每次奉陪给进程系统资源前,先试探性的“假设”分配资源给进程Pi,再通过安全性算法检测此次分配是否会导致系统进入不安全状态,如果分配后系统依然安全则系统将资源正是分配给进程Pi;如果此次分配导致系统进入不安全状态,则暂不分配资源给进程Pi。通过这种机制,系统可以有效的避免死锁的产生,确保系统时时刻刻都处在安全状态。

二、银行家算法的流程

假设系统中有n个进程,m种资源。
每个进程在运行前先声明各种资源的最大需求数,则可用一个m * n的矩阵表示所有进程对各种资源的最大需求数,称为最大需求矩阵Max
同理,系统可以用一个n*m的分配矩阵Allocation,表示对所有进程的资源分配情况
Max- Allocation =Need矩阵,表示各进程最多还需要多少各类资源。另外,还要用一个长度为m的一维数组Available表示当前系统中还有多少可用资源
某进程pi向系统申请资源,可用一个长度为m的一维数组Request i表示本次申请的各种资源量
可用银行家算法预判本次分配是否会导致系统进入不安全状态:
①如果 Request i [j]≤Need[i,j] 便转向第二步
②如果 Request i [j]<Availablel] (0sj≤m),便转向③
③系统试探着把资源分配给进程,并修改相应的数据(并非真的分配,修改数值只是为了做预判)
④操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式分配;否则,恢复相应数据,让进程阻塞等待。

假设总资源[10,5,7],本次分配需要的资源数Request 1=(2,1,1)
由总资源数可以得到当前系统可用的资源Available=(3,3,2)

在这里插入图片描述

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
根据提供的引用内容,我们可以得知银行家算法是一种避免死锁的算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。面是一个简单的银行家算法的C++代码实现: ```c++ #include <iostream> using namespace std; const int P = 5; // 进程数 const int R = 3; // 资源数 int available[R] = {3, 3, 2}; // 可用资源数 int maxm[P][R] = {{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}; // 最大需求矩阵 int allocation[P][R] = {{0, 1, 0}, {2, 0, 0}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}; // 已分配矩阵 int need[P][R]; // 需求矩阵 bool isSafe() { int work[R]; bool finish[P] = {0}; for (int i = 0; i < R; i++) { work[i] = available[i]; } int count = 0; while (count < P) { bool found = false; for (int i = 0; i < P; i++) { if (!finish[i]) { int j; for (j = 0; j < R; j++) { if (need[i][j] > work[j]) { break; } } if (j == R) { for (int k = 0; k < R; k++) { work[k] += allocation[i][k]; } finish[i] = true; found = true; count++; } } } if (!found) { return false; } } return true; } int main() { for (int i = 0; i < P; i++) { for (int j = 0; j < R; j++) { need[i][j] = maxm[i][j] - allocation[i][j]; } } if (isSafe()) { cout << "Safe state" << endl; } else { cout << "Unsafe state" << endl; } return 0; } ``` 上述代码实现了银行家算法的安全性检查,其中包括了进程数、资源数、可用资源数、最大需求矩阵、已分配矩阵和需求矩阵等。在主函数中,我们首先计算出需求矩阵,然后调用isSafe()函数进行安全性检查,最后输出检查结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值