add related info about deadlock and ipc: pipe, signal
This commit is contained in:
243
related_info/lab7/deadlock/bankers-homework.py
Normal file
243
related_info/lab7/deadlock/bankers-homework.py
Normal file
@@ -0,0 +1,243 @@
|
||||
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"
|
||||
Reference in New Issue
Block a user