Python|银行家算法

介绍

输入请求资源的进程号以及该进程请求资源数
可以实现的操作:
检查当前状态是否安全,如果安全则输出安全序列
根据输入请求资源的进程号以及该进程请求资源数,判断状态是否安全,如果安全则输出安全序列,否则输出错误

测试

下面测试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))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值