Python银行家算法

这里写图片描述
这里写图片描述
个人觉得最终结果的序列应该是[4, 5, 1, 2, 3],图片博主给出的是{P4,P1,P2,P3,P5}
算法的问题以及详解直接看另外一篇博客
https://blog.csdn.net/only06/article/details/53381153
https://www.cnblogs.com/chuxiuhong/p/6103928.html

代码

#!/usr/bin/python3

#可用资源
Available=[]
#最大需要的资源数
maxNeed=[]
#已有的资源
Allocated=[]
#需要的资源数
Need=[]
# 最大5个线程
Finsh=[False,False,False,False,False]
#剩余资源
Free=[]
#输出最终序列
seq=[]
#初始化可用资源
Available.append(1)
Available.append(0)
Available.append(2)
Available.append(0)
#赋值给剩余资源
Free=Available
#初始化最大需要的资源数
maxNeed.append([4,1,1,1])
maxNeed.append([0,2,1,2])
maxNeed.append([4,2,1,0])
maxNeed.append([1,1,2,1])
maxNeed.append([2,1,1,0])
#初始化已有的资源
Allocated.append([3,0,1,1])
Allocated.append([0,1,0,0])
Allocated.append([1,1,1,0])
Allocated.append([1,1,0,1])
Allocated.append([0,0,0,0])

#初始化需要的资源数,需要的资源数=最大资源数-已有的资源数
for i in range(0,len(Finsh)):
    needList=[]
    m=maxNeed[i]
    a=Allocated[i]
    for j in range(0,len(Available)):
        needList.append(m[j]-a[j])
    Need.append(needList)

#是否能够分配完成
def isFinsh(f):
    for i in f:
        if f[i]==False:
            return False
    return True

#校验剩余的资源是否够分给给need对应的进程
def check(need,free):
    for i in range(0,len(free)):
        flag = True;
        if  free[i]>=need[i]:
            pass
        else:
            return False
    return flag
#校验没问题了,才会分配(省略分配,直接回收)并且回收
def addFree(allocated,free):
    for i in range(0,len(free)):
        free[i]=allocated[i]+free[i]
#循环终止条件是找到可以安全分配的序列,如果找不到会一直死循环。。可以采取其它措施,但是这里就不写了
while True:
    if not isFinsh(Finsh):
        for i in range(0,len(Finsh)): #循环所有的请求线程
           if not Finsh[i]:   # 如果这个线程没有完成
               if check(Need[i],Free):
                   addFree(Allocated[i],Free)
                   Finsh[i]=True;
                   print(Finsh)
                   print(Free)
                   seq.append(i+1);
           else:
               continue
    else:
        break


print(seq)

输出

[[1, 1, 0, 0], [0, 1, 1, 2], [3, 1, 0, 0], [0, 0, 2, 0], [2, 1, 1, 0]]
[False, False, False, True, False]
[2, 1, 2, 1]
[False, False, False, True, True]
[2, 1, 2, 1]
[True, False, False, True, True]
[5, 1, 3, 2]
[True, True, False, True, True]
[5, 2, 3, 2]
[True, True, True, True, True]
[6, 3, 4, 2]
[4, 5, 1, 2, 3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值