高响应比优先调度算法是一种常见的进程调度算法,它根据进程等待时间和需要执行的时间来计算响应比,然后将响应比最高的进程置于就绪队列的最前面,以便更快地得到处理。
本实验的目的是使用Python设计并实现高响应比优先调度算法,并通过测试数据验证其性能表现。具体实现步骤如下:
1、定义Process
类
首先需要定义一个Process
类,表示一个进程。该类包含进程id、到达时间、需要执行的时间、等待时间、周转时间、响应比等属性。
class Process:
def __init__(self, pid, arrival_time, burst_time):
self.pid = pid
self.arrival_time = arrival_time
self.burst_time = burst_time
self.waiting_time = 0
self.turnaround_time = 0
self.response_ratio = 0
self.start_time = 0
self.complete_time = 0
2、实现高响应比优先调度算法
高响应比优先调度算法是一种动态调度算法,它根据作业的等待时间和估计运行时间来决定下一个要执行的作业。具体实现过程如下::
def hrrn(processes):
n = len(processes)
current_time = 0
completed_processes = []
while len(completed_processes) < n:
# 计算每个进程的响应比
for p in processes:
if p not in completed_processes:
waiting_time = current_time - p.arrival_time
p.response_ratio = 1 + waiting_time / p.burst_time
# 选择响应比最大的进程执行
selected_process = max(processes, key=lambda x: x.response_ratio)
selected_process.start_time = current_time
selected_process.complete_time = current_time + selected_process.burst_time
selected_process.turnaround_time = selected_process.complete_time - selected_process.arrival_time
current_time = selected_process.complete_time
completed_processes.append(selected_process)
return completed_processes
hrrn()
函数接收一个包含所有进程对象的列表 processes
,并返回完成的进程对象列表。
在函数内部,先对每个进程计算它的响应比(使用 (1 + 等待时间/执行时间
),然后选择响应比最大的进程进行执行。执行结束后,计算所选进程的开始执行时间、结束时间和周转时间,并将其添加到已完成的进程列表中。重复上述过程直到所有进程都完成。
3、测试程序
可以使用以下代码进行测试:
# 创建进程列表
processes = [
Process(1, 0, 10),
Process(2, 1, 5),
Process(3, 2, 8),
Process(4, 3, 6),
]
# 运行调度算法
completed_processes = hrrn(processes)
# 输出结果
total_wait_time = sum([p.waiting_time for p in completed_processes])
total_turnaround_time = sum([p.turnaround_time for p in completed_processes])
total_weighted_turnaround_time = sum([p.turnaround_time / p.burst_time for p in completed_processes])
for p in completed_processes:
print(f"Process {p.pid}:到达时间 {p.arrival_time},所需执行时间{p.burst_time},开始时间{p.start_time},结束时间 {p.complete_time},周转时间 {p.turnaround_time},带权周转时间 {p.turnaround_time / p.burst_time:.2f}")
print(f"平均周转时间:{total_turnaround_time / len(completed_processes):.2f}")
print(f"平均带权周转时间:{total_weighted_turnaround_time / len(completed_processes):.2f}")
以上代码中,我们创建了一个包含4个进程的进程列表,然后运行 hrrn()
函数进行调度。最后,输出每个进程的开始时间、结束时间、周转时间和带权周转时间,以及所有进程的平均周转时间和平均带权周转时间。
运行程序后,可以得到如下输出结果: