@ -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" |
@ -0,0 +1,257 @@ | |||
start here | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [17, 8, 0, 0] [1, 8, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [4, 5, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [2, 2, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [11, 20, 1, 2] | |||
Executing... | |||
Request: | |||
[1, 8, 0, 0] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [18, 16, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [4, 5, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [2, 2, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [10, 12, 1, 2] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [4, 5, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [2, 2, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [28, 28, 1, 2] | |||
Executing... | |||
Request: | |||
[4, 5, 0, 0] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [4, 5, 0, 0] [0, 0, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [2, 2, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [24, 23, 1, 2] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [2, 2, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [28, 28, 1, 2] | |||
Executing... | |||
Request: | |||
[2, 2, 0, 1] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[2, 2, 0, 1] [2, 2, 0, 1] [0, 0, 0, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [26, 26, 1, 1] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[18, 16, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[4, 5, 0, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[2, 2, 0, 1] [0, 0, 0, 0] [0, 0, 0, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [28, 28, 1, 2] Available: [28, 28, 1, 2] | |||
SUCCESS proc lists [0, 1, 2] | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [1, 2, 2, 1] [2, 1, 0, 1] | |||
[1, 2, 3, 4] [1, 0, 3, 3] [0, 2, 0, 1] | |||
[1, 3, 5, 0] [1, 2, 1, 0] [0, 1, 4, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [3, 1, 1, 2] | |||
Executing... | |||
Request: | |||
[2, 1, 0, 1] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [3, 3, 2, 2] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [1, 0, 3, 3] [0, 2, 0, 1] | |||
[1, 3, 5, 0] [1, 2, 1, 0] [0, 1, 4, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [1, 0, 1, 1] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [1, 0, 3, 3] [0, 2, 0, 1] | |||
[1, 3, 5, 0] [1, 2, 1, 0] [0, 1, 4, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [4, 3, 3, 3] | |||
Executing... | |||
Request: | |||
[0, 2, 0, 1] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [1, 2, 3, 4] [0, 0, 0, 0] | |||
[1, 3, 5, 0] [1, 2, 1, 0] [0, 1, 4, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [4, 1, 3, 2] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 3, 5, 0] [1, 2, 1, 0] [0, 1, 4, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [5, 3, 6, 6] | |||
Executing... | |||
Request: | |||
[0, 1, 4, 0] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 3, 5, 0] [1, 3, 5, 0] [0, 0, 0, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [5, 2, 2, 6] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[3, 3, 2, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 2, 3, 4] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[1, 3, 5, 0] [0, 0, 0, 0] [0, 0, 0, 0] | |||
_____________________________________________ | |||
Resources: | |||
Total: [6, 5, 7, 6] Available: [6, 5, 7, 6] | |||
SUCCESS proc lists [0, 1, 2] | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [3, 0, 0, 3] [7, 8, 2, 2] | |||
[6, 1, 3, 1] [1, 1, 2, 0] [5, 0, 1, 1] | |||
[3, 1, 4, 2] [2, 1, 2, 1] [1, 0, 2, 1] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [4, 8, 2, 1] | |||
Executing... | |||
Request: | |||
[7, 8, 2, 2] | |||
HOLD: not enough Resource | |||
Executing... | |||
Request: | |||
[5, 0, 1, 1] | |||
HOLD: not enough Resource | |||
Executing... | |||
Request: | |||
[1, 0, 2, 1] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [3, 0, 0, 3] [7, 8, 2, 2] | |||
[6, 1, 3, 1] [1, 1, 2, 0] [5, 0, 1, 1] | |||
[3, 1, 4, 2] [3, 1, 4, 2] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [3, 8, 0, 0] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [3, 0, 0, 3] [7, 8, 2, 2] | |||
[6, 1, 3, 1] [1, 1, 2, 0] [5, 0, 1, 1] | |||
[3, 1, 4, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [6, 9, 4, 2] | |||
Executing... | |||
Request: | |||
[7, 8, 2, 2] | |||
HOLD: not enough Resource | |||
Executing... | |||
Request: | |||
[5, 0, 1, 1] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [3, 0, 0, 3] [7, 8, 2, 2] | |||
[6, 1, 3, 1] [6, 1, 3, 1] [0, 0, 0, 0] | |||
[3, 1, 4, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [1, 9, 3, 1] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [3, 0, 0, 3] [7, 8, 2, 2] | |||
[6, 1, 3, 1] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[3, 1, 4, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [7, 10, 6, 2] | |||
Executing... | |||
Request: | |||
[7, 8, 2, 2] | |||
Dispatching Done... | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [10, 8, 2, 5] [0, 0, 0, 0] | |||
[6, 1, 3, 1] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[3, 1, 4, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [0, 2, 4, 0] | |||
-----Releasing Process------ | |||
_____________________________________________ | |||
MAX Allocated Need | |||
[10, 8, 2, 5] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[6, 1, 3, 1] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[3, 1, 4, 2] [0, 0, 0, 0] [0, 0, 0, 0] | |||
[5, 4, 2, 1] [0, 0, 2, 0] [5, 4, 0, 1] | |||
_____________________________________________ | |||
Resources: | |||
Total: [10, 10, 8, 5] Available: [10, 10, 6, 5] | |||
Failed |
@ -0,0 +1,23 @@ | |||
#!/usr/bin/env python | |||
# -*- encoding: utf8 -*- | |||
import os, sys | |||
print "I'm going to fork now - the child will write something to a pipe, and the parent will read it back" | |||
r, w = os.pipe() # r,w是文件描述符, 不是文件对象 | |||
pid = os.fork() | |||
if pid: | |||
# 父进程 | |||
os.close(w) # 关闭一个文件描述符 | |||
r = os.fdopen(r) # 将r转化为文件对象 | |||
print "parent: reading" | |||
txt = r.read() | |||
os.waitpid(pid, 0) # 确保子进程被撤销 | |||
else: | |||
# 子进程 | |||
os.close(r) | |||
w = os.fdopen(w, 'w') | |||
print "child: writing" | |||
w.write("here's some text from the child") | |||
w.close() | |||
print "child: closing" | |||
sys.exit(0) | |||
print "parent: got it; text =", txt |
@ -0,0 +1,43 @@ | |||
/* | |||
* From | |||
* [url]http://www.crasseux.com/books/ctutorial/Programming-with-pipes.html[/url] | |||
* but changed to use fgets() instead of the GNU extension getdelim() | |||
*/ | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <string.h> | |||
int main() | |||
{ | |||
FILE *ps_pipe; | |||
FILE *grep_pipe; | |||
int bytes_read; | |||
char buffer[100]; /* could be anything you want */ | |||
/* Open our two pipes | |||
ls -a | grep pipe* | |||
*/ | |||
ps_pipe = popen("/bin/ls -a", "r"); | |||
grep_pipe = popen("/bin/grep 'pipe*'", "w"); | |||
/* Check that pipes are non-null, therefore open */ | |||
if ((!ps_pipe) || (!grep_pipe)) { | |||
fprintf(stderr, "One or both pipes failed.\n"); | |||
return EXIT_FAILURE; | |||
} | |||
bytes_read = 0; | |||
while (fgets(buffer, sizeof(buffer), ps_pipe)) { | |||
fprintf(grep_pipe, "%s", buffer); | |||
bytes_read += strlen(buffer); | |||
} | |||
printf("Total bytes read = %d\n", bytes_read); | |||
/* Close ps_pipe, checking for errors */ | |||
if (pclose(ps_pipe) != 0) { | |||
fprintf(stderr, "Could not run 'ls', or other error.\n"); | |||
} | |||
/* Close grep_pipe, cehcking for errors */ | |||
if (pclose(grep_pipe) != 0) { | |||
fprintf(stderr, "Could not run 'grep', or other error.\n"); | |||
} | |||
/* Exit! */ | |||
return 0; | |||
} | |||
@ -0,0 +1,28 @@ | |||
#include <unistd.h> | |||
#include <stdio.h> | |||
#include <stdlib.h> | |||
#include <signal.h> | |||
// Define the function to be called when ctrl-c (SIGINT) signal is sent to process | |||
void | |||
signal_callback_handler(int signum) | |||
{ | |||
printf("Caught signal %d\n",signum); | |||
// Cleanup and close up stuff here | |||
// Terminate program | |||
exit(signum); | |||
} | |||
int main() | |||
{ | |||
// Register signal and signal handler | |||
signal(SIGINT, signal_callback_handler); | |||
while(1) | |||
{ | |||
printf("Program processing stuff here.\n"); | |||
sleep(1); | |||
} | |||
return EXIT_SUCCESS; | |||
} |