2019329621249陈雅冰homework8 Version 0 |
|
👤 Author: by 1422679707qqcom 2021-12-25 17:53:04 |
import random
class system: ##系统类
def __init__(self,res_a,res_b,res_c): ##系统拥有的资源量ABC
self.res_a=res_a
self.res_b=res_b
self.res_c=res_c
def output(self): ##输出系统资源量
print("系统资源A数量:"+str(self.res_a),
"系统资源B数量:"+str(self.res_b),
"系统资源C数量:"+str(self.res_c))
def safeTest(self,res_a,res_b,res_c): ##检测系统是否能满足进程的请求资源量
if self.res_a
return False
else:
return True
def safeList(self,list_p,PCB): ##检测系统分配给进程资源后的安全队列
list1=[] ##除了当前进程的所有进程
list2=[] ##安全队列
ra=self.res_a ##记录系统的当前资源量
rb=self.res_b
rc=self.res_c
self.freed(PCB) ##假设当前进程已经释放资源
for i in list_p: ##将除了当前进程的所有进程放入list1
if i.pid!=PCB.pid:
list1.append(i)
for i in range(0,len(list1)): ##循环找出安全队列
for i in list1:
if self.safeTest(i.need_a,i.need_b,i.need_c):
self.freed(i) ##模拟每次进程执行完后释放资源
list2.append(i.pid)
list1.remove(i)
break
self.res_a=ra ##还原系统当前资源量
self.res_b=rb
self.res_c=rc
return list2 ##返回安全队列
def freed(self,PCB): ##进程执行完后释放资源
self.res_a+=PCB.res_a
self.res_b+=PCB.res_b
self.res_c+=PCB.res_c
class PCB:
def __init__(self,pid,res_a,res_b,res_c): ##进程所需资源量need_res,进程当前资源量res=0,状态state为等待
self.pid=pid
self.need_a=res_a
self.need_b=res_b
self.need_c=res_c
self.res_a=self.res_b=self.res_c=0
self.state="等待"
def output(self): ##输出进程信息
print("进程"+str(self.pid)+"资源拥有量为:",self.res_a,self.res_b,self.res_c,
"进程还需资源量为:",self.need_a,self.need_b,self.need_c)
def finish(self,system,res_a,res_b,res_c): ##系统为进程分配资源
print("系统正在为进程"+str(self.pid)+"分配资源")
self.res_a+=res_a
self.res_b+=res_b
self.res_c+=res_c
self.need_a-=res_a
self.need_b-=res_b
self.need_c-=res_c
system.res_a-=res_a
system.res_b-=res_b
system.res_c-=res_c
if self.need_a==self.need_b==self.need_c==0: ##进程执行
self.state="就绪"
print("进程"+str(self.pid)+"已就绪,进程正在执行")
if self.state=="就绪": ##进程释放资源
self.state="完成"
print("进程"+str(self.pid)+"已执行完毕,正在释放资源")
system.freed(self)
def bankerAlgorithm():
list_p=[]
a=system(10,10,10) ##系统初始资源量为:A 10,B 10,C 10
print("初始化——————————————————————————")
for i in range(0,5):
list_p.append(PCB(i,random.randint(3,6),random.randint(3,6), ##进程所需资源量设为:A 3-6=B=C
random.randint(3,6)))
for i in list_p:
i.finish(a,random.randint(0,i.need_a//2),random.randint(0,i.need_b//2), ##进程初始资源量设为: A 0-所需资源量的一半=B=C
random.randint(0,i.need_c//2))
print("初始化完成————————————————————————")
time=0 ##模拟时间
list_f=[] ##进程执行完成队列
while 1:
print("time:"+str(time)) ##输出当前时间
a.output() ##输出系统当前资源量
for i in list_p: ##输出各个进程的信息
i.output()
for i in list_p: ##判断系统能否满足当前进程的需求,如果能并且分配后存在安全队列,则将资源分配给进程
if a.safeTest(i.need_a,i.need_b,i.need_c) and len(a.safeList(list_p,i))==len(list_p)-1:
print("系统准备为进程"+str(i.pid)+"分配资源,安全队列为:",a.safeList(list_p,i))
i.finish(a,i.need_a,i.need_b,i.need_c)
list_f.append(i.pid) ##将进程的id放入完成队列list_f
list_p.remove(i) ##将进程从进程队列移除
break
elif i!=list_p[-1]: ##若不满足当前进程的需求,则转入下一进程
continue
else: ##若都不满足,则输出警告
print("系统不安全,请重新调整参数!")
time+=1 ##时间+1
print("") ##输出一行空白隔开每一秒
if list_p==[] or list_f==[]: ##如果进程全部执行完毕或全都不能执行,终止循环
break
a.output() ##输出系统当前资源量
print("进程的执行顺序为:",list_f) ##输出进程的执行顺序
if __name__ == "__main__":
bankerAlgorithm()
初始化---------------------------
系统正在为进程0分配资源
系统正在为进程1分配资源
系统正在为进程2分配资源
系统正在为进程3分配资源
系统正在为进程4分配资源
初始化完成------------------------
tine: 0
系统资源A数量:5系统资源B数量:7系统资源c数量:5
进程0资源拥有量为:0 0 2进程还需资源量为:6 3 3
进程1资源拥有量为:3 0 0进程还需资源量为:3 4 6
进程2资源拥有量为:0 1 2进程还需资源量为:4 2 3
进程3资源拥有量为:0 0 1进程还需资源量为:6 5 4
进程4资源拥有量为:2 2 0进程还需资源量为:3 4 3
系统准备为进程2分配资源,安全队列为:[1i,0,3,4]
系统正在为进程2分配资源
进程之已就绪,进程正在执行
进程2执行完毕,正在释放资源
time:1
系统资源A数量:5系统资源B数量:8系统资源c数量:7
进程0资源拥有量为:0 0 2进程还需资源量为:6 3 3
进程1资源拥有量为:3 0 0进程还需资源量为:3 4 6
进程3资源拥有量为:0 0 1进程还需资源量为:6 5 4
进程4资源拥有量为:2 2 0进程还需资源量为:3 4 3
系统准备为进程1分配资源,安全队列为:[0,3,4]
系统正在为进程1分配资源
进程1已就绪,进程正在执行进程1己执行完毕,正在释放资源
tinme: 2
系统资源A数量:8系统资源B数量:8系统资源c数量:7
进程0资源拥有量为:0 0 2进程还需资源量为: 6 3 3
进程3资源拥有量为:0 0 1进程还需资源量为:6 5 4
进程4资源拥有量为:2 2 0进程还需资源量为:3 4 3
系统准备为进程0分配资源,安全队列为:[3,4]
系统正在为进程0分配资源
进程0已就绪,进程正在执行
进程0己执行完毕,正在释放资源
time: 3
系统资源A数量:8系统资源B数量:8系统资源c数量:9
进程3资源拥有量为:0 0 1进程还需资源量为:6 5 4
进程4资源拥有量为:2 2 0进程还需资源量为:3 4 3
系统准备为进程3分配资源,安全队列为:[4]
系统正在为进程3分配资源
进程3已就绪,进程正在执行
进程3已执行完毕,正在释放资源
time: 4
系统资源A数量:8系统资源B数量:8系统资源c数量:10
进程4资源痈有量为:2 2 0进程还需资源量为:3 4 3
系统准备为进程4分配资源,安全队列为:[]
系统正在为进程4分配资源
进程4已就绪,进程正在执行
进程4已执行完毕,正在释放资源
系统资源A数量:10系统资源B数量:10系统资源c数量:10
进程的执行顺序为:[2,1,0,3,4]