import copy
# 优先级抢占式算法
class PC:
name = None
arrive_time = None
process_time = None
priority = None
pc_num = int(input("请输入进程的数量:"))
list_pc = []
for i in range(pc_num): # 构造结构体,方便后面使用数据
pc_temp = PC()
pc_temp.name = input(f"请输入第{i + 1}号进程的名字")
pc_temp.arrive_time = int(input(f"请输入第{i + 1}号进程抵达的时间:"))
pc_temp.process_time = int(input(f"请输入第{i + 1}号的执行时间:"))
pc_temp.priority = int(input(f"请输入第{i + 1}号的优先级:"))
list_pc.append(pc_temp)
list_upcoming = copy.deepcopy(list_pc) # 未抵达的进程
list_upcoming_name = [i.name for i in list_pc] # 改小bug的补丁
list_processing = [] # 正在等待处理的进程
list_done = [] # 处理完的进程
time = 0
list_slice = [] # 记录每一秒做的事情
while len(list_done) != pc_num: # 当所有进程都处理完时才结束
for i, v in enumerate(list_pc): # 同时使用index与value
if v.arrive_time <= time and v.name in list_upcoming_name:
print(f"time={time}时,进程{v.name}抵达")
del list_upcoming_name[list_upcoming_name.index(v.name)] # 从等待队列中取出进程
list_processing.append(v) # 将进程放入处理队列
list_processing.sort(key=lambda p: p.priority, reverse=True) # 使用sort于匿名函数将list_processing按照优先级大小排序
if list_processing: # 只要还有事情做就要接着做
list_processing[0].process_time -= 1
list_slice.append(list_processing[0].name)
if list_processing[0].process_time == 0:
print(f"time={time + 1}时,进程{list_processing[0].name}完成") # time要+1,因为这里预判这个时间片的工作
list_done.append(list_processing[0]) # 将进程标为“执行完毕”
del list_processing[0] # 从执行队列中取出执行完毕的进程
else:
list_slice.append("Do nothing")
time += 1
print(f"总耗时为{time},时间片记录为:{list_slice}")
运行截图: