Java教程

银行家算法模拟

本文主要是介绍银行家算法模拟,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。----百度百科

实验要求-----从文件读取数据并输入到文件当中

由于只实现这么一个功能,干脆不分函数了,直接顺下来。

源码po出

  1 available = []#资源向量
  2 proc = []#进程
  3 allocation = []#分配矩阵
  4 max_ = []#最大需求矩阵
  5 need = []#需求矩阵
  6 work = []#工作向量
  7 finish = []
  8 wpa = []#work+allocation
  9 f = open("src.txt","r+")
 10 fr = f.read()
 11 for i in fr:
 12     if i == "\n":
 13         break
 14     if i != " ":
 15         available.append(i)#导入Available
 16 n = len(available)#资源数目
 17 str1 = fr.replace("\n"," ")
 18 list = str1.split(" ")
 19 for i in range(n,len(list),2*n+1):
 20     proc.append(list[i])#导入进程
 21 tmp = 0
 22 temp = n + 1
 23 while temp < len(list):
 24     allocation.append(list[temp])#导入Allocation
 25     tmp+=1
 26     temp+=1
 27     if tmp == n:
 28         tmp = 0
 29         temp += n + 1
 30 temp = 2*n+1
 31 while temp < len(list):
 32     max_.append(list[temp])#导入MAX
 33     tmp+=1
 34     temp+=1
 35     if tmp == n:
 36         tmp = 0
 37         temp += n + 1
 38 for i in range(len(max_)):
 39     need.append(eval(max_[i]) - eval(allocation[i]))#计算need
 40 print("从",proc,"中选择一个请求进程",end=":")
 41 start = input()
 42 print("输入请求的资源(共{a}个,以空格区分)".format(a=n),end=":")
 43 request_t = input()
 44 request = request_t.split(" ")
 45 index = 0
 46 for i in range(len(proc)):
 47     if start == proc[i]:
 48         index = i
 49         break
 50 flag = False
 51 for i in range(n):
 52     if eval(request[i]) > need[i+index*n]:#步骤1判断
 53         flag = False
 54         break
 55     else:
 56         flag = True
 57         continue
 58 if flag == True:
 59     for i in range(n):
 60         if eval(request[i]) > eval(available[i]):#步骤2判断
 61             flag = False
 62             break
 63         else:
 64             flag = True
 65             continue
 66 if flag == True:
 67     for i in range(n):#步骤3修改资源
 68         available[i] = eval(available[i]) - eval(request[i])
 69         allocation[i+index*n] = eval(allocation[i+index*n]) + eval(request[i])
 70         need[i+index*n] = need[i+index*n] - eval(request[i])
 71     work = available
 72     work_str = [0]*n*len(proc)
 73     finish = [False]*len(proc)
 74     for i in range(len(allocation)):
 75         allocation[i] = str(allocation[i])
 76         allocation[i] = eval(allocation[i])
 77     queue = []#安全序列
 78     for i in range(len(proc)):#安全性检查
 79         for index_t in range(len(proc)):
 80             if index_t not in queue:
 81                 if finish[index_t] == False:
 82                     flag_t = True
 83                     for j in range(n):
 84                         if need[j+index_t*n] > work[j]:#判断need[i][j]≤work[j]
 85                             flag_t = False
 86                             break
 87                     if flag_t == True:
 88                         for j in range(n):
 89                             work_str[j+index_t*n] = work[j]
 90                             work[j] = work[j] + allocation[j+index_t*n]
 91                         queue.append(index_t)
 92                         finish[index_t] = True
 93     for i in finish:
 94         if i == False:
 95             flag = False
 96             break
 97     for i in range(len(work_str)):
 98         wpa.append(work_str[i]+allocation[i])
 99     if flag == True:
100         with open("yhj_res.txt","w",encoding="utf-8") as ff:
101             ff.write("\t进程\twork\tallocation\tneed\twork+allocation\tfinish\n")
102             res_list = []
103             for i in queue:
104                 ff.write("\t"+str(proc[i]))
105                 ff.write("\t"+str(work_str[i*n:i*n+n]))
106                 ff.write("\t"+str(allocation[i*n:i*n+n]))
107                 ff.write("\t"+str(need[i*n:i*n+n]))
108                 ff.write("\t"+str(wpa[i*n:i*n+n]))
109                 ff.write("\t   "+str(finish[i])+"\n")
110                 res_list.append(proc[i])
111             ff.write("可以分配,存在安全序列"+str(res_list))
112             print("可以分配,存在安全序列"+str(res_list))
113     else:
114         with open("yhj_res.txt","w",encoding="utf-8") as ff:
115             ff.write("无法分配")
116             print("无法分配")
117     f.close()
118     ff.close()

 

源文件内容---src.txt 

其中,第一行的1 6 2 2表示给出的Available为[1,6,2,2],后面5行的第1列表示进程的名称,根据Available的长度为4,后四列为Allocation,最后4列为Max。

 
1 6 2 2
 
a 0 0 3 2 0 0 4 4
 
b 1 0 0 0 2 7 5 0
 
c 1 3 5 4 3 6 10 10
 
d 0 3 3 2 0 9 8 4
 
e 0 0 1 4 0 6 6 10

 

测试

输出结果到文件yhj_res.txt

进程 work        allocation      need     work+allocation   finish
 
a [1, 5, 1, 2] [0, 0, 3, 2] [0, 0, 1, 2] [1, 5, 4, 4] True
 
d [1, 5, 4, 4] [0, 4, 4, 2] [0, 5, 4, 2] [1, 9, 8, 6] True
 
e [1, 9, 8, 6] [0, 0, 1, 4] [0, 6, 5, 6] [1, 9, 9, 10] True
 
b [1, 9, 9, 10] [1, 0, 0, 0] [1, 7, 5, 0] [2, 9, 9, 10] True
 
c [2, 9, 9, 10] [1, 3, 5, 4] [2, 3, 5, 6] [3, 12, 14, 14] True
 
可以分配,存在安全序列['a', 'd', 'e', 'b', 'c']

 

这篇关于银行家算法模拟的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!