操作系统银行家算法python简单模拟

40个进程随机申请资源,满足则分配资源。

import numpy as np
import time
import random as rd
class PCB:
    safe_seq=[]#安全序列
    X=0
    def __init__(self, ID,ID_request, still_request,ab_resource):
        self.ID_request=ID_request#该进程所需总资源
        self.ID=ID#进程ID
        self.still_request=still_request#任需资源
        self.ab_resource=ab_resource#可用资源
        self.X=len(self.ID)
    def applican(self):#随机进程申请资源,并判断是否满足,不满足,则返回-1,满足则返回进程号,用于下一步分配
        app_ID=rd.sample(self.ID,1)#挑选随机进程
        print(app_ID[0],"号进程正在申请资源")
        z=self.ab_resource-self.still_request[app_ID[0]]
        #print(z)
        min_r=min(z)
        if min_r<0:
            print("当前资源分配后会进入不安全状态,申请失败")
            return -1
        else:
            print("满足资源分配要求,即将分配")
            return app_ID[0]

    def fenpei(self,ID):#分配资源
        self.ab_resource=np.array(self.ab_resource)+np.array(self.ID_request[ID]) #分配完成,资源释放
        self.safe_seq.append(ID)
        self.ID.remove(ID)
        print("分配成功,返还资源,当前可用资源数为:",self.ab_resource) 
    def diaoyong(self):#判断是否分配资源
        z=PCB.applican(self)
        if z>=0:
            PCB.fenpei(self,z)
    def shuchu(self):
            print("所以进程已完成\n")
            print("安全序列为",self.safe_seq)
    def diaoyong1(self):
        while(True):#一直申请资源,直到全部完成
            #for i in range(10):
            PCB.diaoyong(self)
            time.sleep(0.5)
            if len(self.safe_seq)==self.X:#此时已经全部完成
                PCB.shuchu(self)
                break
ID=[]#进程ID
ID_request=[]#进程所需要的总资源
ID_divider=[]#已分配资源
avle_source=[2,3,2,2]#每种资源的剩余
#ID_still_request=所需资源-已分配资源=任需资源
#设置40个进程
for i in range(40):
    #print(i)
    ID.append(i)
    for i in range(4):
        ID_ziyuan=[]
        fenpei=[]
        a=rd.randint(2,6)
        a1=rd.randint(0,2)
        b=rd.randint(3,4)
        b1=rd.randint(0,3)
        c=rd.randint(3,4)
        c1=rd.randint(0,3)
        d=rd.randint(3,4)
        d1=rd.randint(0,3)
        ID_ziyuan.append(a)
        ID_ziyuan.append(b)
        ID_ziyuan.append(c)
        ID_ziyuan.append(d)
        fenpei.append(a1)
        fenpei.append(b1)
        fenpei.append(c1)
        fenpei.append(d1)
        ID_request.append(ID_ziyuan)
        ID_divider.append(fenpei)

for i in range(40):
    print(i,"号",ID_request[i])
ID_still_request=np.array(ID_request)-np.array(ID_divider)#任需资源数
P=PCB(ID,ID_request,ID_still_request,avle_source)
P.diaoyong1()

 

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
银行家算法是一种操作系统中用来避免死锁的算法,下面是一个简单银行家算法Python 实现示例: ```python # 定义函数实现银行家算法 def banker_algorithm(available, maximum, allocation): n = len(available) # 初始化 need 和 work 矩阵 need = [] for i in range(n): need.append([maximum[i][j] - allocation[i][j] for j in range(len(allocation[i]))]) work = available[:] finish = [False] * n # 模拟银行家算法 safe_seq = [] while False in finish: found = False for i in range(n): if not finish[i] and all([need[i][j] <= work[j] for j in range(len(work))]): finish[i] = True found = True safe_seq.append(i) work = [work[j] + allocation[i][j] for j in range(len(work))] break if not found: return None return safe_seq # 测试银行家算法 if __name__ == '__main__': available = [3, 3, 2] maximum = [[7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2]] allocation = [[0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1]] safe_seq = banker_algorithm(available, maximum, allocation) if safe_seq is None: print('No safe sequence found!') else: print('Safe sequence: ', ' -> '.join(['P' + str(i) for i in safe_seq])) ``` 这里的 available、maximum 和 allocation 分别表示系统可用资源、每个进程需要的最大资源和已经分配给每个进程的资源。函数的返回值是银行家算法模拟得到的安全序列,如果找不到安全序列,则返回 None。在上面的示例中,银行家算法得到的安全序列是 P1 -> P3 -> P4 -> P0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵药师

嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值