python:使用银行家算法实现进程安全

栗子如下:

在银行家算法中,若出现下述资源分配情况:
这里写图片描述,

Process代表进程, Allocation代表进程已占用资源数,Need代表进程还需多少资源才能结束释放资源

Avaiable代表当前系统可用资源

    注:题中共四种资源,P0的Allocation为(0,0,3,2)表示已分配给P0的第一种资源和第二种资源为0个,第三种资源3个,第四种资源2个。

(1)该状态是否安全?

(2)若进程P2提出请求Request(1,2,2,2)后,系统能否将资源分配给它?

如何解决?

系统安全吗?

将已占有资源(Allocation)和剩余资源(Avaible)相加可以得到总资源,假设资源为 A B C D

         那么总资源为 {'A':3,'B':12,'C':14,'D':14}

第一步:看 进程需要资源数(Need)小于可用资源数(Avaible)的进程,

那么只有进程 P0 满足

第二步:将P0进程释放,此时可用资源数要(1,6,2,2)加上P0之前占有的资源数( 0 0 3 2),

 故P0释放后可以资源数(Avaible)为(1,6,5,4)

第三步:在剩下的进程里面,看进程需要资源数(Need)小于当前可以资源数(Avaible)(1,6,5,4)

那么我们找到P3,释放P3后可以资源数又为(1,6,5,4) + (0,3,3,2)

依次步骤下去,可得到安全序列 P0,P3,P4,P1,P2 ,故系统安全

P2发出请求向量Request(1,2,2,2),此操作安全吗?

①Request2(1,2,2,2)<=Need2(2,3,5,6)
②Request2(1,2,2,2)<=Available(1,6,2,2)
③系统先假定可为P2分配资源,并修改Available,Allocation2和Need2向量:
Available=(0,4,0,0)
Allocation2=(2,5,7,6)
Need2=(1,1,3,4)
此时再进行安全性检查,发现 Available=(0,4,0,0) 不能满足任何一个进程,所以判定系统进入不安全状态,即不能分配给P2相应的Request(1,2,2,2)。


Python如何解决?

'''
两大功能模块
1.给出进程数,资源数,进程需要资源数,进程已占有资源数,给出是否安全,若安全给出安全序列
2.模拟里面进程请求资源,预测本次操作是否安全
'''

import copy

#模拟进程请求资源
def simulationReques(process_id,request_dict):
    print('Now Allocation:',allocation)
    #最大请求数 >= 请求数 ?
    if not compareDict(max[process_id],request_dict):
        print('请求资源过大,拒绝')
        return False
    #可用资源 >= 请求数?
    if not compareDict(avaiable,request_dict):
        print('无足够资源分配,拒绝')
        return False
    #分配资源
    subtractionDict(avaiable,request_dict)#可用资源减少
    addDict( allocation[process_id],request_dict)#进程占用资源增加
    subtractionDict( need[process_id],request_dict)#进程需要资源减少

    #系统安全性检查
    if calculateSafe(avaiable,need,allocation,pn):
        print('okay')
    else:
        addDict(avaiable, request_dict)
        subtractionDict(allocation[process_id], request_dict)
        addDict(need[process_id], request_dict)
    return allocation



#安全性算法函数
#avaible-可用资源,need--需要资源,allocation-已占有资源,pn-进程数
def calculateSafe(avaiable,need,allocation,pn):
    #copy 可用资源数
    avaible_work = copy.deepcopy(avaiable)
    #创建完成数组,默认设为全0-False
    finsh_arr = [0] * pn
    #创建安全序列
    safe_queue = []
    #循环5次
    count = 0
    print('Avaiable_Work:',avaible_work)
    print('Finsh_Arr:',finsh_arr)
    print('Safe_Queue:',safe_queue)
    while count < pn:
        #按进程编号找到一个可安全加入进程的进程
        i = 0
        while i < pn:
            # 该进程未完成模拟
            if not finsh_arr[i]:
                #可用资源 >= 请求资源 ?
                is_safe = compareDict(avaible_work,need[i])
                if is_safe:#如果成功
                    # 更新安全队列
                    safe_queue.append(i)
                    # 更新完成值
                    finsh_arr[i] = True
                    # 更新可用资源 = 当前可用 + 当前进程释放资源
                    addDict(avaible_work,allocation[i])

            i += 1
        count += 1
    print('Avaiable_Work:', avaible_work)
    print('Finsh_Arr:', finsh_arr)
    print('Safe_Queue:', safe_queue)
    if len(safe_queue) == pn:
        print('系统处于安全状态,计算得出安全序列',safe_queue)
        return True
    print('不安全')
    return False



#比较两个字典,如果a>=b返回true
def compareDict(a,b):
    flag = True
    for key in a.keys():
        if a[key] < b[key]:
            return False
    return flag
#两个字典相加a的值增加b的值
def addDict(a,b):
    for key in a.keys():
        a[key] = a[key] + b[key]
#两个字典相减 a的值减少b的值
def subtractionDict(a,b):
    for key in a.keys():
        a[key] = a[key] - b[key]





if __name__ == '__main__':
    #进程数 = 下面数组的长度
    pn = 5
    #各种资源总资源数
    avaiable = { "A":3,"B":12,'C':14,'D':14}
    #每个进程对各种资源的最大需求
    max = [
        {"A": 0, "B": 0, 'C': 4, 'D': 4},
        {"A": 2, "B": 7, 'C': 5, 'D': 0},
        {"A": 3, "B": 6, 'C': 10, 'D': 10},
        {"A": 0, "B":9, 'C': 8, 'D': 4},
        {"A": 0, "B": 6, 'C': 6, 'D': 10}
    ]
    #各个进程已占有的资源数
    allocation = [
        {"A": 0, "B": 0, 'C': 3, 'D': 2},
        {"A": 1, "B": 0, 'C': 0, 'D': 0},
        {"A": 1, "B": 3, 'C': 5, 'D': 4},
        {"A": 0, "B": 3, 'C': 3, 'D': 2},
        {"A": 0, "B": 0, 'C': 1, 'D': 4}
    ]

    #得到进程资源的需求数 = 最大需求 - 已占有
    need = []
    cn = 0
    for i in range(pn):
        tmp = copy.deepcopy(max[i])
        subtractionDict(tmp,allocation[i])
        need.append(tmp)
        cn += 1
    print('Need:',need)
    #各个资源的可用数量 = 资源总数 - 已占有
    for allo in allocation:
        subtractionDict(avaiable,allo )
    print("Avaiable:",avaiable)

    #调用方法,判断当前进程是否安全
    calculateSafe(avaiable, need, allocation, pn)

    #模拟P2进程请求资源
    args_process_id = 2
    args_request_dict = {'A': 1, 'B': 2, 'C': 2, 'D': 2}#请求资源数情况
    print(simulationReques(args_process_id, args_request_dict))

猜你喜欢

转载自blog.csdn.net/huangmengfeng/article/details/88670014