银行家算法

银行家算法是著名的死锁避免算法,其思想是:把操作系统视为银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。进程运行之前先声明对各种资源的最大需求量,当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过该进程声明的最大需求量。若超过则拒绝分配资源,若未超过则再测试系统现存的资源能否满足该进程尚须的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

问题描述

设计程序模拟避免死锁的银行家算法的工作过程。假设系统中有n个进程: P 1 , P 2 , … , P n P_1,P_2,\dots,P_n P1​,P2​,…,Pn​,有m类可分配资源 R 1 , … , R m R_1,\dots,R_m R1​,…,Rm​,在某时刻,进程 P i P_i Pi​已分配到的j类资源为 A l l o c a t i o n [ i ] [ j ] Allocation[i][j] Allocation[i][j]个,还需要j类资源 n e e d [ i ] [ j ] need[i][j] need[i][j]个,目前系统剩余j类资源 A v a i l a b l e [ j ] Available[j] Available[j]个。

实验要求

  1. 判断当前状态是否安全。若安全,给出安全序列;若不安全,给出理由。
  2. 对于下一个时刻,某个进程提出资源请求Request(R1,…,Rm),使用银行家算法作为判读是否相应该响应该请求的决策依据。
  3. 输入某时刻的资源分配表和进程请求信息,输出安全序列分析,给出决策方案。

数据结构描述

  • 系统可用资源向量 A v a i l a b l e [ m ] Available[m] Available[m]
  • 最大需求矩阵 M a x [ n ] [ m ] Max[n][m] Max[n][m]
  • 分配矩阵 A l l o c a t i o n [ n ] [ m ] Allocation[n][m] Allocation[n][m]
  • 需求矩阵 N e e d [ n ] [ m ] Need[n][m] Need[n][m]

其中,n是进程数量,m是资源种类数量。

算法描述

  • 输入:T0时刻的资源分配表
  • 输出:Pi发出资源请求后,进行的安全序列分析表和安全序列。若不安全,则给出不安全产生的原因。
  1. 进程Pi发出请求 R e q u e s t i Request_i Requesti​,首先检查其合法性,若 R e q u e s t i ≤ N e e d [ i ] Request_i\le Need[i] Requesti​≤Need[i]则继续进行,否则报错;
  2. 若 R e q u e s t i ≤ A v a i l a b l e Request_i\le Available Requesti​≤Available,则继续进行,否则认为当前资源不足,不响应当前请求;
  3. 系统试探性把资源分配给进程Pi:
    A v a i l a b l e − = R e q u e s t i Available-=Request_i Available−=Requesti​
    A l l o c a t i o n [ i ] + = R e q u e s t i Allocation[i]+=Request_i Allocation[i]+=Requesti​
    N e e d [ i ] − = R e q u e s t i Need[i]-=Request_i Need[i]−=Requesti​
  4. 使用银行家算法进行安全性检查,检查此次资源分配后,系统是否处于安全状态,若安全才正式将资源分配给进程Pi;否则本次的试探作废,Pi继续等待。安全性检查算法如下:
    1. 设置工作量 W o r k [ m ] Work[m] Work[m],表示系统中剩余的可用资源数目。在安全性检查开始时,置Work=Available;
    2. 初始时安全序列为空;
    3. 遍历Need矩阵行,找出一行k,该行对应的Pk不在安全序列中,且 N e e d [ k ] ≤ W o r k Need[k]\le Work Need[k]≤Work,将对应Pk插入安全序列,若找不到则跳过下一步;
    4. 更新 W o r k = W o r k + A l l o c a t i o n [ k ] Work=Work+Allocation[k] Work=Work+Allocation[k],表征Pk获取资源并运行结束后,将资源释放的过程。返回上步,继续寻找下一个可以分配资源的进程;
    5. 此时,安全序列中若存在所有进程,则系统处于安全状态,否则系统不安全。

算法流程图

结果分析

设置n=5;m=3
T0时刻资源分配表
Available: [3 3 2]
P Allocation Need
0 [0 1 0] [7 4 3]
1 [2 0 0] [1 2 2]
2 [3 0 2] [6 0 0]
3 [2 1 1] [0 1 1]
4 [0 0 2] [4 3 1]

(1)P1请求资源,Request1 = [1, 0, 2]
✅VALID CHECK PASSED!
✅RESOURCE CHECK PASSED!
通过合法性和资源检查,假定为P1分配资源,然后进行安全性检查:
P Work Need Allocation Work+Allocation
1 [2 3 0] [0 2 0] [3 0 2] [5 3 2]
3 [5 3 2] [0 1 1] [2 1 1] [7 4 3]
0 [7 4 3] [7 4 3] [0 1 0] [7 5 3]
2 [7 5 3] [6 0 0] [3 0 2] [10 5 5]
4 [10 5 5] [4 3 1] [0 0 2] [10 5 7]
✅SAFE CHECK PASSED!
Secured Sequence is [1, 3, 0, 2, 4].
通过安全性检查,为P1分配资源,输出当前资源分配信息:
Available: [2 3 0]
P Allocation Need
0 [0 1 0] [7 4 3]
1 [3 0 2] [0 2 0]
2 [3 0 2] [6 0 0]
3 [2 1 1] [0 1 1]
4 [0 0 2] [4 3 1]

(2)T1时刻,P4继续请求资源
Request4 = [3, 3, 0]
✅VALID CHECK PASSED!
⭕️REQUEST EXCEEDS AVAILABLE!
Request4<=Need[4],但Request4>Available,资源检查失败,P4等待分配资源

(3)T2时刻,P0请求资源
Request0 = [0, 2, 0]
✅VALID CHECK PASSED!
✅RESOURCE CHECK PASSED!
⭕️SAFE CHECK FAILED!
通过合法性和资源检验,假设为P0分配资源,此时Available不满足银行家算法,安全性检验失败,若为P0分配资源会导致死锁,故返回原始状态。

(4)T3时刻,P3请求资源
Request3 = [0, 2, 1]
⭕️Exception: ERROR!P3 REQUEST EXCEEDS ITS NEED!
报错,因为请求资源大于了需求量!

附录:代码

# @Sylvan Ding 2022.05.31import numpy as npdef err(P):raise Exception("ERROR!P{} REQUEST EXCEEDS ITS NEED!".format(P))def valid_check(P, Request, Need):if np.sum(Request > Need[P, :]):err(P)print("\033[0;32mVALID CHECK PASSED!\033[0m")def resource_check(Request, Available):if np.sum(Request > Available):print("\033[0;31mREQUEST EXCEEDS AVAILABLE!\033[0m")return Falseelse:print("\033[0;32mRESOURCE CHECK PASSED!\033[0m")return Truedef safe_check(Work, Need, Allocation, n):Q = []while True:i = 0while i < n:if i not in Q and not np.sum(Need[i, :] > Work):Q.append(i)temp = Work.copy()Work = Work + Allocation[i, :]print_safe_check(i, temp, Need, Allocation, Work)breaki = i + 1if i == n:breakif len(Q) < n:print("\033[0;31mSAFE CHECK FAILED!\033[0m")return Falseelse:print("\033[0;32mSAFE CHECK PASSED!\nSecured Sequence is {}.\033[0m".format(Q))return Truedef try_allocate(Available, Allocation, Need, Request, P):Available = Available - RequestAllocation[P, :] = Allocation[P, :] + RequestNeed[P, :] = Need[P, :] - Requestreturn Available, Need, Allocationdef print_safe_check(k, Work, Need, Allocation, Work_Allocation):print("{}\t {}\t {}\t {}\t {}".format(k,Work,Need[k, :],Allocation[k, :],Work_Allocation))def print_resource(Available, Need, Allocation, n):print("Current resource information: ")print("Available: {}".format(Available))print("P\t Allocation\t Need")for i in range(n):print("{}\t {}\t {}".format(i, Allocation[i, :], Need[i, :]))def print_request_info(P, Request):print("\033[0;33mP{} requests {}.\033[0m".format(P, Request))def Banker(n, Available, Max, Allocation, P, Request):""":param n: int:param Available: array[n][m]:param Max: array[n][m]:param Allocation: array[n][m]:param P: index of process to request:param Request: array[m]:return: Available, Need, Allocation"""print_request_info(P, Request)Available = np.asarray(Available)Max = np.asarray(Max)Allocation = np.asarray(Allocation)Request = np.asarray(Request)Need = Max - Allocationprint_resource(Available, Need, Allocation, n)valid_check(P, Request, Need)if (resource_check(Request, Available) andsafe_check(*try_allocate(Available.copy(),Allocation.copy(),Need.copy(),Request, P), n)):Available, Need, Allocation = try_allocate(Available.copy(),Allocation.copy(),Need.copy(),Request, P)print_resource(Available, Need, Allocation, n)return Available, Need, Allocationdef BankerAlgorithm():n = 5# m = 3Available = [3, 3, 2]Max = [[7, 5, 3],[3, 2, 2],[9, 0, 2],[2, 2, 2],[4, 3, 3]]Allocation = [[0, 1, 0],[2, 0, 0],[3, 0, 2],[2, 1, 1],[0, 0, 2]]P1 = 1Request1 = [1, 0, 2]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P1, Request1)P4 = 4Request4 = [3, 3, 0]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P4, Request4)P0 = 0Request0 = [0, 2, 0]Available, Need, Allocation = Banker(n, Available, Max, Allocation, P0, Request0)P3 = 3Request3 = [0, 2, 1]Banker(n, Available, Max, Allocation, P3, Request3)if __name__ == '__main__':BankerAlgorithm()

原创文章:转载请注明出处 ©️ Sylvan Ding

参考文献

  1. 2023年操作系统考研复习指导/王道论坛考研组编.——北京:电子工业出版社,2021.12

银行家算法之Python实现[操作系统实验]相关推荐

  1. python编写操作系统实验_6.828 操作系统 lab2 实验报告

    Introduction 该 lab 主要需要编写操作系统的内存管理部分.内存管理分为两个部分: 内核的物理内存分配器 (physical memory allocator) 使得内核可以分配.释放内 ...

  2. 操作系统 进程调度-银行家算法实验报告

    实验要求 一. 实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止.本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家 ...

  3. 实验三银行家算法linux,操作系统原理与linux_银行家算法实验报告.doc

    . . . PAGE 成 绩 评 阅 人 评阅日期 计算机科学与技术系 实 验 报 告 课程名称: 操作系统原理与linux 实验名称: 银行家算法 2011年 04 月 实验三 银行家算法 一.实验 ...

  4. 计算机操作系统实验银行家算法,实验六 银行家算法(下)

    实验六 银行家算法(下) 一.实验说明 实验说明:本次实验主要是对银行家算法进行进一步的实践学习,掌握银行家算法的整体流程,理解程序测试时每一步的当前状态,能对当前的资源分配进行预判断. 二.实验要求 ...

  5. 【南邮操作系统实验】银行家算法Java版

    这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...

  6. 操作系统实验报告(二)银行家算法

    一. 实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程. 二. 实验环境 Windows ...

  7. 广州大学2020操作系统实验二:银行家算法

    相关资料 广州大学2020操作系统实验一:进程管理与进程通信 广州大学2020操作系统实验二:银行家算法 广州大学2020操作系统实验三:内存管理 广州大学2020操作系统实验四:文件系统 广州大学2 ...

  8. 广州大学 操作系统实验之银行家算法

    实验二 银行家算法 一.实验目的 1.了解什么是操作系统安全状态和不安全状态: 2.了解如何避免系统死锁: 3.理解银行家算法是一种最有代表性的避免死锁的算法,掌握其实现原理及实现过程 二.实验环境 ...

  9. 广州大学操作系统实验 2020版 银行家算法

    银行家算法 银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法.它以银行借贷 ...

最新文章

  1. Python错误和异常学习
  2. 计算机应用12班,计算机应用二班xx毕业论文.doc
  3. 遨游3.0 RC 版公布
  4. python基本符合_python 3-3(2019-11-06 ) Python基础 (三)
  5. 绝地求生测试服画面优化软件,绝地求生大逃杀优化方法 画面优化工具使用教程_3DM单机...
  6. 汇川PLC软件下载及安装
  7. 有关存储器容量的计算
  8. php网页错误404,php出现404错误页面的解决方法
  9. 好用的工程项目管理软件推荐
  10. 网易云音乐在 Ubuntu 下缩放的问题
  11. 爱陆通研习社,水利RTU、环保数采仪、遥测终端机定义,4G5G课堂
  12. Arranging The Sheep 中位数定理
  13. html5的vidoe标签,HTML5的Video标签的属性,方法和事件
  14. 单片机开发教程4——多文件编程
  15. UltraISO 制作U盘启动盘
  16. Java项目:超市收银管理系统(java+SSM+HTML+maven+mysql)
  17. Verilog自顶向下设计24进制和60进制计数器(FPGA)
  18. 没有粉丝基础怎么直播带货,了解这3点误区即可丨国仁网络资讯
  19. 作为前端er,写在年末的一些话
  20. 12招,让你成为「耐撕」的产品人

热门文章

  1. php将字符串转换成utf8编码,php字符串转utf8编码的方法
  2. 基于HSV+HOG特征和SVM的人脸口罩检测算法
  3. 6000php相当于,jquery – Javascript中的PMT
  4. Android Flurry使用说明
  5. 开放式API安全防护的七大原则
  6. 塔斯马尼亚大学计算机专业硕士,塔斯马尼亚大学计算机专业
  7. excel使用技巧,激活Administrator用户方法, 创建以管理员身份打开的命令行快捷方式
  8. 黑苹果 常用必装kext 补丁 驱动 文件说明 用途 笔记 (备用)
  9. 王桂林讲C++之友元
  10. 《统计学原理》李洁明(第六版)课后习题答案