这几个实验都是上课时候一两小时实现的,因为老师给出的参考代码有些惨不忍睹(虽然我写的也没好到哪去).因为时间有限,就没用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 

仅供参考.