Python3实现银行家算法、安全性算法
学习期间写的,希望大家一起进步。
Available = [] #各可用资源数目
Used ={} #某进程目前占有各资源数
Need = {} #某进程目前需求资源数
zhan = [] #临时存储列表
order = [] #进程安全顺序列表
pandaun = []
def compare(a = [],b = []):
for x in range(0,item): #进行列表对应元素的比较
if (int(a[x]) < int(b[x])): #一旦出现供不应求的情况即返回False
return False
break #且跳出循环
return True #如果符合条件即返回True
def AddUsed(a = [],b = []): #可用资源某进程当前占用资源对应位置相加
for x in range(0,item):
a[x] = int(a[x]) + int(b[x])
item = int(input("请输入资源种类数: "))
SP = int(input("请输入进程数: "))
jinchengshu = SP #设置临时变量表示进程数量,在后面的判断中用
#输入各类资源的可用数目并存储到列表Available中
for x in range(1,item+1):
Available.append(input("请输入第"+str(x)+"种资源的可用数目: "))
#输入各进程名称,占有资源数及所需,键值对存储
for x in range(1,SP+1):
name = input("请输入第"+str(x)+"个进程名称: ")
print("该进程占有的"+str(item)+"类资源数为:")
for y in range(1,item+1):
zhan.append(int(input()))
Used[name] = zhan
zhan = [] #清空临时列表
print("该进程需要的"+str(item)+"类资源数为:")
for z in range(1,item+1):
zhan.append(int(input()))
Need[name] = zhan
zhan = [] #清空临时列表
#安全性算法开始
while Need: #如果进程表Need不为空
for key in Need: #获取Need中的key
zhan = Need[key] #将对应的value赋值给临时列表zhan
if compare(Available,zhan):#调用比较函数比较列表中个元素与Avilable中个元素的大小并返回真值
AddUsed(Available,Used[key]) #如果返回True则调用相加函数
order.append(key) #将key值放入order列表中以便显示
a = key #设置a令它等于key,删除字典元素时使用
break
if compare(Available,zhan): #如果符合大小条件就删除对应的键值对
del Need[a]
jinchengshu -= 1
if SP == jinchengshu:
print("不存在安全序列!!!")
break
if jinchengshu == 0:
for x in range(0,len(order)):
print(order[x]+'-->',end='')
print("END!")