模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:
设置进程体:进程名,进程的到达时间,服务时间,初始优先权,进程状态(W——等待,R——运行,F——完成),进程间的链接指针
进程初始化:由用户输入进程名、服务时间、初始优先权进行初始化,同时,初始化进程的状态为W。
显示函数:在进程调度前、调度中和调度后进行显示。
排序函数:对就绪状态的进程按照优先权排序。优先权相同时进入等待队列时间早的进程在前。考虑到达时间
调度函数:每次从等待队列队首调度优先权最高的进程执行,状态变化。并在执行一个时间单位后优先权变化,服务时间变化,状态变化。当服务时间为0时,状态变为F。
import copy
class HPF(object):
def __init__(self, proname, arrivetime, protime, priority, status):
"""
:param proname: 进程名
:param arrivetime: 到达时间
:param protime: 运行时间
:param priority: 优先级
:param status: 状态 W——等待,R——运行,F——完成
"""
self.proname = proname
self.arrivetime = arrivetime
self.protime = protime
self.priority = priority
self.status = status
def show(b, a):
print("请输入查看的时间")
time = int(input())
result = {}
b = b[:time]
c = b
b = list(set(b))
for i in b:
result[i] = c.count(i)
for k, v in result.items():
k = int(k)
if a[k - 1].protime == v:
a[k - 1].status = 'F'
else:
a[k - 1].status = 'W'
a[int(b[-1]) - 1].status = 'R'
for z in a:
print("进程%s:状态:%s" % (z.proname, z.status))
def arrive_pro(time, a):
if time >= a[-1].arrivetime: # 全部都在等待
return a
b = []
for i in a:
if i.arrivetime <= time:
b.append(i)
else:
break
return b
if __name__ == '__main__':
print('请输入进程个数:')
num = int(input())
all = 0 # 总服务时间
a = [] # 记录进程对象
b = [] # 创建一个列表,记录每个时刻运行哪个进程
while (num):
print("进程名 到达时间 服务时间 优先权 状态")
s = input().split()
num = num - 1
s[0] = HPF(s[0], int(s[1]), int(s[2]), int(s[3]), s[4])
a.append(s[0]) # 创建的对象
z = copy.deepcopy(a)
for i in a:
all = all + i.protime # 得到总运行时间
for i in range(all):
arrive = arrive_pro(i, a) # 得到这个时刻已经到达的进程
for j in arrive:
if j.protime <= 0:
arrive.remove(j)
# for i in arrive:
# print(i.proname, i.arrivetime, i.protime, i.priority)
max_priority = arrive[0].priority
for k in arrive:
if k.priority >= max_priority:
max_priority = k.priority
c = k # 找到优先级最大的
else:
c = arrive[0]
# print("max_priority", max_priority)
# print("c", c)
c.priority = c.priority - 1 # 优先级减1
c.protime = c.protime - 1
b.append(c.proname)
show(b, z)