已实现FCFS与SJF CPU调度模拟器,如何正确实现SRTF最短剩余时间优先算法
SRTF算法实现问题修正指南
现有代码核心问题
- 逻辑本质还是非抢占式SJF:没有处理新进程提交时的抢占逻辑,每次选中进程就直接执行完整个burst时间,不符合SRTF可抢占的核心特性
- 进程管理逻辑错误:用顺序递增的
job变量遍历提交列表,SRTF的进程完成顺序和提交顺序无关,该计数逻辑完全不适用 - 剩余时间绑定错误:
remaining_burst_times和进程没有强绑定,调用remove方法删除burst时间时如果有多个相同burst的进程会删错目标 - 没有标记进程首次运行状态:响应时间是进程首次获得CPU的时间减提交时间,现有代码每次选中进程都会计算响应时间,会重复计算导致结果错误
正确实现思路
- 先给每个进程打唯一标识,存储每个进程的提交时间、总burst时间、剩余burst时间、是否已首次响应、是否已完成四个核心状态
- 循环终止条件改为「所有进程都已完成」,而非固定次数遍历
- 每次时间步进优先取两个事件的最小值:最近的未到达进程的提交时间、当前运行进程的剩余执行时间,减少无意义的逐时钟模拟
- 每次时间步进后先把所有已提交的新进程加入就绪队列,再检查当前运行进程是否执行完毕,最后重新从就绪队列选剩余时间最短的进程执行
- 仅在进程第一次被CPU选中时计算响应时间,进程执行完毕时再计算周转时间和等待时间
修正后的参考实现
def srtf(submit_times, burst_times): """最短剩余时间优先调度算法,返回响应时间、周转时间、等待时间列表""" n = len(submit_times) # 进程状态结构:[提交时间, 总burst时间, 剩余burst时间, 是否首次响应, 是否完成] jobs = [] for i in range(n): submit = int(submit_times[i]) burst = int(burst_times[i]) jobs.append([submit, burst, burst, False, False]) response_times = [0]*n turn_around_times = [0]*n wait_times = [0]*n completed = 0 cpu_clock = 0 while completed < n: # 收集所有已提交且未完成的进程作为就绪队列,存储索引和剩余burst时间 ready_queue = [] for i in range(n): if jobs[i][0] <= cpu_clock and not jobs[i][4]: ready_queue.append((i, jobs[i][2])) if not ready_queue: # 无就绪进程时直接跳到下一个进程的提交时间 next_submit = min([jobs[i][0] for i in range(n) if not jobs[i][4]]) cpu_clock = next_submit continue # 选择剩余时间最短的进程 ready_queue.sort(key=lambda x: x[1]) selected_idx, selected_remaining = ready_queue[0] # 首次被调度时记录响应时间 if not jobs[selected_idx][3]: response_times[selected_idx] = cpu_clock - jobs[selected_idx][0] jobs[selected_idx][3] = True # 确定下一个事件时间:当前进程完成时间/下一个新进程提交时间 next_events = [cpu_clock + selected_remaining] future_submits = [jobs[i][0] for i in range(n) if jobs[i][0] > cpu_clock and not jobs[i][4]] if future_submits: next_events.append(min(future_submits)) next_event_time = min(next_events) # 扣减运行时长,更新CPU时钟 run_time = next_event_time - cpu_clock jobs[selected_idx][2] -= run_time cpu_clock = next_event_time # 进程执行完成时计算周转、等待时间 if jobs[selected_idx][2] == 0: turn_around = cpu_clock - jobs[selected_idx][0] turn_around_times[selected_idx] = turn_around wait_times[selected_idx] = turn_around - jobs[selected_idx][1] jobs[selected_idx][4] = True completed +=1 return response_times, turn_around_times, wait_times
内容的提问来源于stack exchange,提问作者funjunkstorage
相关产品推荐
相关产品推荐

