import os import random import numpy as np import itertools class Bankers(object): def __init__(self, totalResource): #initiating self.RESOURCE = totalResource def SignProcesses(self, max_, allocated_): self.max = max_ self.allocated = allocated_ self.need = self.CalcNeed() self.avaliable = self.CalcAvaliable() self.finished = [False]*len(self.allocated) def Difference(self,a,b): #return matrix subtracted from a by b res = [] for i in range(len(a)): tmp = [] for j in range(len(a[i])): tmp.append(a[i][j]-b[i][j]) res.append(tmp) return res def CalcNeed(self): #calc request by subtracting signed matrix from max matrix return self.Difference(self.max,self.allocated) def CalcAvaliable(self): """Calc Avaliable Resource""" a = self.allocated res = [] for j in range(len(a[0])): tmp = 0 for i in range(len(a)): tmp += a[i][j] res.append(self.RESOURCE[j] - tmp) return res def ExecuteProcess(self,index): #check if less avaliable than Request # YOUR CODE, YOUR ID #check END here #allocating what they need. # YOUR CODE, YOUR ID #allocating END here pass def TempSafeCheckAfterRelease(self): #check if at least one request can be done after previous process done. not check whole sequances. #if every element of Requests can't accepted after previous process done, this mean it is not safe state # YOUR CODE, YOU ID #check END here pass def print_matrixes(self): print "_____________________________________________" print "MAX\t\tAllocated\tNeed" for idx in range(len(self.max)): print "%s\t%s\t%s" % (self.max[idx],self.allocated[idx], self.need[idx]) print "_____________________________________________" print "Resources:" print "Total: %s\tAvailable: %s\n" % (self.RESOURCE, self.avaliable) def ReleasingProcess(self,index): for i in range(0,len(self.RESOURCE)): self.finished[index] = True self.allocated[index][i] = 0 self.avaliable = self.CalcAvaliable() def Execute(self): i = 0 # get all permutation of processes perm = itertools.permutations(range(procnum), procnum) permArray = np.asarray(list(perm)) for arr in permArray: for i in arr: if self.finished[i] == False: print "Executing..." print "Request: " print self.need[i] #check if less avaliable than Request if self.ExecuteProcess(i): print "Dispatching Done..." self.print_matrixes() print "-----Releasing Process------" self.ReleasingProcess(i) self.print_matrixes() #check if at least one request can be done after previous process done. not check whole sequances. #if every element of Requests can't accepted after previous process done, this mean it is not safe state if not (self.TempSafeCheckAfterRelease()): print "SAFE STATE: NOT SAFE - There are no sequances can avoid Deadlock" return False processes.append(i) else: print "HOLD: not enough Resource" if i == len(self.allocated)-1: i = 0 else: i += 1 check = True for k in range(0,len(self.allocated)): if self.finished[k] == False: check = False break if check == True: return True break #every permutation of processes is false return False def getmax(): res = [] for j in range(procnum): tmp = [] for i in range(len(total_resources)): randnum=random.random() remain_max=0 if j >0: remain_max=total_resources[i] for k in range(j): remain_max=remain_max-res[k][i] if remain_max < 0: remain_max=0 else: remain_max=total_resources[i] tmp.append((int)(randnum*remain_max*0.8)) res.append(tmp) return res def getallocated(): res = [] for j in range(procnum): tmp = [] for i in range(len(total_resources)): randnum=random.random() remain=0 if j >0: remain=max[j][i] for k in range(j): remain=remain-res[k][i] if remain < 0: remain=0 else: remain=max[j][i] tmp.append((int)(randnum*remain)) res.append(tmp) return res print "start here" # random seed seed = 2 random.seed(seed) # the number of process list procnum = 3 # the number of type of resource resnum = 4 # the max total value of resource restotalval = 30 # the total resources list total_resources=[] # the total processes processes=[] # set the real total value of resource in total_resources for i in range(resnum): total_resources.append((int)(restotalval*random.random())) # init the Banker b = Bankers(total_resources) # get the max request values of resources from process max=getmax() # get the already gotted values of resources from process allocated=getallocated() # init need matrix, available vector b.SignProcesses(max, allocated) # print all theses matrixes b.print_matrixes() # executing Banker algorithm result=b.Execute() # show results if result: print "SUCCESS proc lists ",processes else: print "Failed" # total_resources = [6, 5, 7, 6] # processes=[] # b = Bankers(total_resources) # # max = [ # [3, 3, 2, 2], # [1, 2, 3, 4], # [1, 3, 5, 0], # ] # allocated = [ # [1, 2, 2, 1], # [1, 0, 3, 3], # [1, 2, 1, 0], # ] # # b.SignProcesses(max, allocated) # b.print_matrixes() # result=b.Execute() # if result: # print "SUCCESS proc lists ",processes # else: # print "Failed" # # # total_resources = [10, 10, 8, 5] # processes=[] # b = Bankers(total_resources) # max = [ # [10, 8, 2,5], # [6, 1, 3,1], # [3, 1, 4,2], # [5, 4, 2,1] # ] # allocated = [ # [3, 0, 0,3], # [1, 1, 2,0], # [2, 1, 2,1], # [0, 0, 2,0] # ] # b.SignProcesses(max, allocated) # b.print_matrixes() # result=b.Execute() # if result: # print "SUCCESS proc lists ",processes # else: # print "Failed"