You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已实现FCFS与SJF CPU调度模拟器,如何正确实现SRTF最短剩余时间优先算法

SRTF算法实现问题修正指南

现有代码核心问题

  • 逻辑本质还是非抢占式SJF:没有处理新进程提交时的抢占逻辑,每次选中进程就直接执行完整个burst时间,不符合SRTF可抢占的核心特性
  • 进程管理逻辑错误:用顺序递增的job变量遍历提交列表,SRTF的进程完成顺序和提交顺序无关,该计数逻辑完全不适用
  • 剩余时间绑定错误:remaining_burst_times和进程没有强绑定,调用remove方法删除burst时间时如果有多个相同burst的进程会删错目标
  • 没有标记进程首次运行状态:响应时间是进程首次获得CPU的时间减提交时间,现有代码每次选中进程都会计算响应时间,会重复计算导致结果错误

正确实现思路

  1. 先给每个进程打唯一标识,存储每个进程的提交时间、总burst时间、剩余burst时间、是否已首次响应、是否已完成四个核心状态
  2. 循环终止条件改为「所有进程都已完成」,而非固定次数遍历
  3. 每次时间步进优先取两个事件的最小值:最近的未到达进程的提交时间、当前运行进程的剩余执行时间,减少无意义的逐时钟模拟
  4. 每次时间步进后先把所有已提交的新进程加入就绪队列,再检查当前运行进程是否执行完毕,最后重新从就绪队列选剩余时间最短的进程执行
  5. 仅在进程第一次被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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 04:09:01