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"
|