介绍
输入请求资源的进程号以及该进程请求资源数
可以实现的操作:
检查当前状态是否安全,如果安全则输出安全序列
根据输入请求资源的进程号以及该进程请求资源数,判断状态是否安全,如果安全则输出安全序列,否则输出错误
测试
下面测试PPT上的四个问题:
相关阅读
Python|页面置换模拟程序设计
Python|银行家算法
Python|独占设备的分配和回收模拟
Python|模拟文件系统
Python|进程调度算法
Python|分页管理方式下存储分配情况模拟
Python|Windows下实现经典进程同步问题——理发师问题
Python|模拟实现动态分区存储管理
完整代码
import numpy
'''
参考OS10(死锁).ppt中P22银行家算法示例
设系统中有n个进程,m种资源(本题中有五个进程,3种资源)
可利用资源向量Available:m个元素的数组
最大需求矩阵Max:n×m矩阵
分配矩阵Allocation:n×m矩阵
需求矩阵Need:n×m矩阵
三个矩阵间的关系:Need[i,j] = Max[i,j] - Allocation[i,j]
'''
# 可利用资源向量
Available = numpy.array(
[3, 3, 2]
)
# 最大需求矩阵
Max = numpy.array(
[
[7, 5, 3],
[3, 2, 2],
[9, 0, 2],
[2, 2, 2],
[4, 3, 3],
]
)
# 分配矩阵
Allocation = numpy.array(
[
[0, 1, 0],
[2, 0, 0],
[3, 0, 2],
[2, 1, 1],
[0, 0, 2],
]
)
# 需求矩阵
Need = numpy.array(
[
[7, 4, 3],
[1, 2, 2],
[6, 0, 0],
[0, 1, 1],
[4, 3, 1],
]
)
# 安全序列
SafeList = []
# 请求序列
Request = []
# 银行家算法
def BankAlgorithm(num):
global Available, Need, Request
if ((Request <= Need[num]).all()):
if ((Request <= Available).all()):
# 试探性的把要求的资源分配给进程并修改有关数据结构的值
Available = Available - Request
Allocation[num] = Allocation[num] + Request
Need[num] = Need[num] - Request
# 系统执行安全性算法
SafeAlgorithm()
else:
print('系统无足够资源,P{}阻塞等待'.format(num))
else:
print('需求申请超出最大需求值')
# 安全性算法
def SafeAlgorithm():
# 初始化设置工作向量
Work = Available
# 设置完成标志向量
Finish = [False] * 5
while False in Finish:
# 初始化标记
flag = False
# 遍历进程集合找到一个满足以下两个条件的
for i in range(len(Allocation)):
for j in range(len(Allocation)):
if ((Finish[i] == False) and ((Need[i] <= Work).all())):
flag = True
# 进程获得资源后可顺利执行直到完成,并释放出分配给他的资源
for k in range(len(Available)):
Work[k] = Work[k] + Allocation[i][k]
Finish[i] = True
SafeList.append(i)
if not flag:
break
# 如果所有的Finish[i] = True, 则表示系统处于安全状态,否则系统处于不安全状态
if False in Finish:
print('系统处于不安全状态')
else:
print('系统处于安全状态')
print('安全序列为:', SafeList)
SafeList.clear()
# 测试PPT示例中的四个问题
'''
# 1.T0时刻是否安全
print('1.')
print('检测T0时刻是否安全')
SafeAlgorithm()
# 2.P1请求资源Request1(1,0,2)是否允许
print('2.')
num = input('请输入请求资源的进程序号(0-4):')
NewRequest = input('请输入P{}的请求资源数:'.format(num))
NewRequest = list(NewRequest)
# 3.P4请求资源Request4(3,3,0)是否允许
print('3.')
num = input('请输入请求资源的进程序号(0-4):')
NewRequest = input('请输入P{}的请求资源数:'.format(num))
NewRequest = list(NewRequest)
'''
# 4.P0请求资源Request(0,2,0)是否允许
print('4.')
num = input('请输入请求资源的进程序号(0-4):')
NewRequest = input('请输入P{}的请求资源数:'.format(num))
NewRequest = list(NewRequest)
for x in range(0, 5, 2):
i = int(NewRequest[x])
Request.append(i)
Request = numpy.array(Request)
BankAlgorithm(int(num))