操作系统模拟实验(银行家算法)
原文链接 http://woodrat.xyz/2014/12/09/%e6%93%8d%e4%bd%9c%e7%b3%bb%e7%bb%9f%e6%a8%a1%e6%8b%9f%e5%ae%9e%e9%aa%8c%e9%93%b6%e8%a1%8c%e5%ae%b6%e7%ae%97%e6%b3%95/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
这几个实验都是上课时候一两小时实现的,因为老师给出的参考代码有些惨不忍睹(虽然我写的也没好到哪去).因为时间有限,就没用C++.
同样是因为时间有限,仅供参考,有bug概不负责.
代码如下
# -- coding: utf-8 -- class Bank(object): def init(self): self.totalpro = 0 self.process = [] self.res_num = 4 self.res_type = ['A', 'B', 'C', 'D'] self.Resources = {'A':10, 'B':9, 'C':8, 'D':7} self.Available = {'A':10, 'B':9, 'C':8, 'D':7} self.Allocation = {} self.Need = {}
def createpc(self, pno, need):
if pno in self.process:
print "process",pno,"exists"
return 0
self.process.append(pno)
self.totalpro += 1
need = self.list2dict(need)
for i in need:
if need[i] > self.Available[i]:
print "process",pno,"need : ",i,"more than available"
return 0
self.Need[pno] = need
self.Allocation[pno] = dict(zip(self.res_type,
[0 for i in xrange(self.res_num)]))
def deletepc(self, pno):
if pno not in self.process:
print "process",pno,"not exists"
return 0
self.free(pno)
self.Need.pop(pno)
self.Allocation.pop(pno)
self.process.remove(pno)
self.totalpro -= 1
print "delete process success"
return 1
def allocate(self, pno, request):
request = self.list2dict(request)
for i in request:
if request[i] > self.Need[pno][i]:
print "process",pno,"request more than needed"
return 0
else:
self.Need[pno][i] -= request[i]
if request[i] < self.Available[i]:
self.Available[i] -= request[i]
else:
print "process",pno,"request : ",i,"more than available"
return 0
self.Allocation[pno][i] += request[i]
if not self.issafe(pno):
print "not safe"
self.free(pno)
else:
print "request safe!"
def free(self,pno):
for i in self.res_type:
self.Available[i] += self.Allocation[pno][i]
self.Need[pno][i] += self.Allocation[pno][i]
self.Allocation[pno][i] = 0
def issafe(self, pno):
#decide is safe
print "checking safety"
safe = True
Finish = {}
Work = dict(zip(self.res_type,
[0 for i in xrange(self.res_num)]))
for i in self.Available:
Work[i] += self.Available[i]
for p in self.process:
Finish[p] = False
print p,Finish[p]
for p in self.process:
for i in self.Need[p]:
if pno != p and self.Need[p][i] < Work[i]:
Work[i] += self.Allocation[p][i]
Finish[p] = True
for p in self.process:
if pno != p and Finish[p] == False:
safe = False
return safe
print p,Finish[p]
return safe
def list2dict(self,request):
return dict(zip(self.res_type, request))
def show(self):
print "System Resources : "
for i in self.res_type:
print i, ":", self.Resources[i], "\t"
print "Available Resources : "
for i in self.res_type:
print i, ":", self.Available[i], "\t"
print "Need Resources : "
for pno in self.process:
print pno, ":"
for i in self.res_type:
print i, ":" ,self.Need[pno][i], "\t"
print "Allocation Resources : "
for pno in self.process:
print pno, ":"
for i in self.res_type:
print i, ":" ,self.Allocation[pno][i], "\t"
def show_type(self):
out = ""
for i in self.res_type:
out += i+' '
print out
def main(): bank = Bank() print "input 0 for create a process" print "input 1 for request resources" print "input 2 for delete a process" print "input 3 for show status" while(1): act = input("what to do : ") if act == 0: print "input pno" pno = input() bank.show_type() need = map(int, raw_input().split()) bank.createpc(pno, need) elif act == 1: print "input pno" pno = input() bank.show_type() request = map(int, raw_input().split()) bank.allocate(pno, request) elif act == 2: print "input pno" pno = input() bank.delete(pno) elif act == 3: bank.show() else: print "error input number" return 0
if name == "main": main() 先创建,再分配资源,如果不安全就把分配的资源收回....实际上应该是试分配,这里是模拟就不计较了=.=
测试代码如下
# test 1 from bank import Bank def test1(): bank = Bank() bank.createpc(1,[5,5,5,5]) bank.createpc(2,[5,5,5,5]) bank.show() bank.allocate(1,[5,5,5,5]) bank.show() 输出结果
; Test 1
System Resources :
A : 10
B : 9
C : 8
D : 7
Available Resources :
A : 10
B : 9
C : 8
D : 7
Need Resources :
1 :
A : 5
B : 5
C : 5
D : 5
2 :
A : 5
B : 5
C : 5
D : 5
Allocation Resources :
1 :
A : 0
B : 0
C : 0
D : 0
2 :
A : 0
B : 0
C : 0
D : 0
checking safety
1 False
2 False
1 False
not safe
System Resources :
A : 10
B : 9
C : 8
D : 7
Available Resources :
A : 10
B : 9
C : 8
D : 7
Need Resources :
1 :
A : 5
B : 5
C : 5
D : 5
2 :
A : 5
B : 5
C : 5
D : 5
Allocation Resources :
1 :
A : 0
B : 0
C : 0
D : 0
2 :
A : 0
B : 0
C : 0
D : 0 第二个
# test 2 from bank import Bank def test2(): bank = Bank() bank.createpc(1,[4,3,2,1]) bank.createpc(2,[5,5,5,5]) bank.show() bank.allocate(1,[4,3,2,1]) bank.show() 输出如下
#test 2
System Resources :
A : 10
B : 9
C : 8
D : 7
Available Resources :
A : 10
B : 9
C : 8
D : 7
Need Resources :
1 :
A : 4
B : 3
C : 2
D : 1
2 :
A : 5
B : 5
C : 5
D : 5
Allocation Resources :
1 :
A : 0
B : 0
C : 0
D : 0
2 :
A : 0
B : 0
C : 0
D : 0
checking safety
1 False
2 False
1 False
2 True
request safe!
System Resources :
A : 10
B : 9
C : 8
D : 7
Available Resources :
A : 6
B : 6
C : 6
D : 6
Need Resources :
1 :
A : 0
B : 0
C : 0
D : 0
2 :
A : 5
B : 5
C : 5
D : 5
Allocation Resources :
1 :
A : 4
B : 3
C : 2
D : 1
2 :
A : 0
B : 0
C : 0
D : 0 仅供参考.