ref_safety_algorithm3.py
4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#_*_ coding: utf-8 _*_
process_num = 4 #process 갯수
resource_num = 3 #resourse 종류
resource_max = []
finished_process = [] # process 수행종료 여부
alloc = [] # 각 process의 초기할당
process_max = [] # 각 process의 max
avail = [] # 각 process의 available
need = [] # 각 process의 need
safety_order = [] # safe한 process의 순서를 나타냄
def main() :
# 초기 설정 작업 #
# finished_process 계산
for i in range(0, process_num) :
finished_process.append(False)
safety_order.append(0)
while(1) :
print("\nPlease Enter 1 to Safe Case")
print("or 2 to Unsafe Case")
choice = int(input("Enter : "))
if(choice == 1) :
# Safe Case의 각 resource 상한과 현재 할당량, process별 상한 지정
resource_max = [20,30,40]
alloc = [[0,5,1],[2,2,2],[1,2,1],[2,8,18]]
process_max = [[10,15,4],[2,25,35],[17,20,30],[10,19,20]]
for j in range(0, resource_num) : # avail 계산
temp = resource_max[j]
for i in range(0,process_num) :
temp -= alloc[i][j]
avail.append(temp)
for i in range(0, process_num) : # need 계산
temp = []
for j in range(0, resource_num) :
temp.append(abs(process_max[i][j]-alloc[i][j]))
need.append(temp)
break
elif(choice == 2) :
# Unsafe Case의 각 resource 상한과 현재 할당량, process별 상한 지정
resource_max = [20,30,40]
alloc = [[0,5,1],[2,2,2],[1,2,1],[2,8,18]]
process_max = [[20,15,4],[2,25,35],[19,20,30],[15,19,20]]
for j in range(0, resource_num) : # avail 계산
temp = resource_max[j]
for i in range(0,process_num) :
temp -= alloc[i][j]
avail.append(temp)
for i in range(0, process_num) : # need 계산
temp = []
for j in range(0, resource_num) :
temp.append(abs(process_max[i][j]-alloc[i][j]))
need.append(temp)
break
else :
print("Please Enter Right Value!")
# 현재상황 출력
print("\n--------------Safety Algorithm--------------\n")
print("Current Allocation : [A, B, C]")
for i in range(0, process_num) :
print(" P#"+str(i+1)+" : "+str(alloc[i]))
print("\n Current Max : [A, B, C]")
for i in range(0, process_num) :
print(" P#"+str(i+1)+" : "+str(process_max[i]))
# 비교 및 순서도출
time = 0
while(time < process_num) :
for i in range(0, process_num) :
k = 0
for j in range(0,resource_num) :
if(need[i][j] <= avail[j]) :
k += 1 # 해당 process가 available보다 작은 need를 가졌다면 count
if(k == resource_num) : # 해당 process의 모든 resource가 available보다 작은 need를 가진 경우
finished_process[i] = True # 해당 process는 finish 했다고 표시됨
for l in range(0, resource_num) :
avail[l] = avail[l] + alloc[i][l] # 자신이 할당했던 resource를 환원하고
need[i][l] = 10000 # 끝난 process는 need값을 많이 높여 비교대상에서 제외
safety_order[time] = i # safety_order에 현재 time에 적합한 process의 index를 설정
break
time += 1
time = 0
for i in range(0, process_num) :
if(finished_process[i] == True) :
time += 1 # i값에 따라 True인 process를 찾고 time을 증가시킨다
if(time == process_num) : # 모든 process가 True여야만 Safe Case이다.
result = ""
for i in range(0, process_num) :
result = result + "Process#" + str(safety_order[i]+1) + "/"
print("\n Safe Processes! : " + result)
else :
print("\nNot Safe Processes!")
print("\n--------------------------------------------\n")
if __name__ == '__main__' :
main()