代码如下:
"""时间片轮转和高响应比优先算法"""
import random
from functools import reduce
class Job(object):
def __init__(self, name):
self.name = name
self.next = None
Job_Num = 5
ArrivalTime = [0 for _ in range(Job_Num)]
ServiceTime = [0 for _ in range(Job_Num)]
PServiceTime = [0 for _ in range(Job_Num)]
FinishTime = [0 for _ in range(Job_Num)]
WholeTime = [0 for _ in range(Job_Num)]
WeightWholeTime = [0 for _ in range(Job_Num)]
AverageWT_RR, AverageWWT_RR = 0, 0
AverageWT_PJF, AverageWWT_PJF = 0, 0
Finished = [False for _ in range(Job_Num)]
Job_Set = []
Job_Queue = []
def initial():
"""初始化"""
global ArrivalTime, ServiceTime, Job_Set
ArrivalTime = random.sample(range(Job_Num), Job_Num)
ServiceTime = random.sample(range(1, 26), Job_Num)
print('请输入{}个作业的名字'.format(Job_Num))
job = Job('head')
job_head = None
for i in range(Job_Num):
name = input()
Job_Set.append(name)
job.next = Job(name)
if i == 0:
job_head = job
job = job.next
job.next = job_head
def deinit():
global Job_Queue, PServiceTime, Finished, FinishTime, WholeTime, WeightWholeTime
global AverageWT_RR, AverageWWT_RR
global AverageWT_PJF, AverageWWT_PJF
Job_Queue = []
AverageWT_RR, AverageWWT_RR = 0, 0
AverageWT_PJF, AverageWWT_PJF = 0, 0
PServiceTime = [0 for _ in range(Job_Num)]
FinishTime = [0 for _ in range(Job_Num)]
WholeTime = [0 for _ in range(Job_Num)]
WeightWholeTime = [0 for _ in range(Job_Num)]
Finished = [False for _ in range(Job_Num)]
def cal_priority(li):
mini = max(li)
for i in range(Job_Num):
if li[i] == mini:
return
def display_rr():
print("进程集:", Job_Set)
print("进程队列下标:", Job_Queue)
print("到达时间:", ArrivalTime)
print("服务时间:", ServiceTime)
print("完成时间:", FinishTime)
print("周转时间:", WholeTime)
print("带权周转时间:", WeightWholeTime)
print("平均周转时间:{}".format(round(sum(WholeTime)/Job_Num), 2))
print("平均带权周转时间:{}".format(round(sum(WeightWholeTime)/Job_Num), 2))
deinit()
def display_pjf():
print("进程集:", Job_Set)
print("初始进程队列下标:", Job_Queue)
print("到达时间:", ArrivalTime)
print("服务时间:", ServiceTime)
print("完成时间:", FinishTime)
print("周转时间:", WholeTime)
print("带权周转时间:", WeightWholeTime)
print("平均周转时间:{}".format(round(sum(WholeTime) / Job_Num), 2))
print("平均带权周转时间:{}".format(round(sum(WeightWholeTime) / Job_Num), 2))
print("优先级:", WeightWholeTime)
deinit()
def rr():
"""引用全局变量"""
global Job_Queue, ServiceTime, Finished, WholeTime, WeightWholeTime, FinishTime
global AverageWT_RR, AverageWWT_RR
real_time = 0
time_chip = float(input("input time_chip:"))
arrival_copy = ArrivalTime.copy()
service_copy = ServiceTime.copy()
for i in range(Job_Num):
min_t = min(arrival_copy)
arrival_copy.remove(min_t)
for j in range(Job_Num):
if min_t == ArrivalTime[j]:
Job_Queue.append(j)
break
count = 0
while count < Job_Num:
if service_copy[Job_Queue[count]] <= time_chip and not Finished[Job_Queue[count]]:
real_time += service_copy[Job_Queue[count]]
FinishTime[Job_Queue[count]] = real_time
WholeTime[Job_Queue[count]] = real_time - ArrivalTime[Job_Queue[count]]
WeightWholeTime[Job_Queue[count]] = round(WholeTime[Job_Queue[count]]/ServiceTime[Job_Queue[count]], 2)
Finished[Job_Queue[count]] = True
elif not Finished[Job_Queue[count]]:
real_time += time_chip
service_copy[Job_Queue[count]] -= time_chip
count += 1
if reduce(lambda x, y: x & y, Finished):
print('所有作业完成')
display_rr()
deinit()
break
if not reduce(lambda x, y: x & y, Finished) and count == Job_Num:
count = 0
def pjf():
"""是允许抢占还是不允许抢占呢
如果允许抢占则要用到时间片,每过一个时间片都要判断优先级,较难
如果不允许抢占,则不用时间片,按进程执行完一个再判断优先级"""
global Job_Queue, ServiceTime, Finished, WholeTime, WeightWholeTime, FinishTime
global AverageWT_PJF, AverageWWT_PJF
global PServiceTime
real_time = 0
wait_time = [0 for _ in range(Job_Num)]
PServiceTime = [1 for _ in range(Job_Num)]
arrival = ArrivalTime.copy()
service = ServiceTime.copy()
for i in range(Job_Num):
min_t = min(arrival)
arrival.remove(min_t)
for j in range(Job_Num):
if min_t == ArrivalTime[j]:
Job_Queue.append(j)
break
job_queue_copy = Job_Queue.copy()
count = 0
# 越后面优先级越低,可以用循环
# todo PserviceTime
while count < Job_Num:
mini = max(PServiceTime)
for index in job_queue_copy:
if not Finished[index]:
if PServiceTime[index] == mini:
real_time += ServiceTime[index]
FinishTime[index] = real_time
Finished[index] = True
WholeTime[index] = real_time - ArrivalTime[index]
WeightWholeTime[index] = round((real_time - ArrivalTime[index])/ServiceTime[index], 2)
break
for i in range(len(wait_time)):
if not Finished[i]:
if real_time < ArrivalTime[i]:
wait_time[i] = 0
else:
wait_time[i] = real_time - ArrivalTime[i]
PServiceTime[i] = round((wait_time[i] + ServiceTime[i])/ServiceTime[i], 2)
else:
PServiceTime[i] = 0
count += 1
display_pjf()
if __name__ == '__main__':
initial()
# rr()
pjf()
"""时间片轮转和高响应比优先算法"""
import random
from