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

Python实现Round Robin调度算法Gantt Chart不符,求代码问题排查

Round Robin调度算法代码问题排查

我编写了一段实现Round Robin调度算法的Python代码,但生成的甘特图与GeeksforGeek网站上的示例结果不一致,请帮忙排查代码问题。

我的代码

def round_robin(processes, burst_time, arrival_time, time_quantum):
    n = len(processes)
    
    # Waiting times
    waiting_time = [0] * n
    # remaining burst time
    rem_burst = list(burst_time)
    # remaining arrival time
    rem_arrival = list(arrival_time)
    # Gantt chart
    gantt_chart = []
    
    t = 0
    while True:
        done = True
        for i in range(n):
            if rem_arrival[i] <= t and rem_burst[i] > 0:
                done = False
                if rem_burst[i] > time_quantum:
                    t += time_quantum
                    rem_burst[i] -= time_quantum
                    rem_arrival[i] = t
                    gantt_chart.append((processes[i], t))
                else:
                    t += rem_burst[i]
                    waiting_time[i] = t - burst_time[i] - arrival_time[i]
                    rem_burst[i] = 0
                    rem_arrival[i] = t
                    gantt_chart.append((processes[i], t))
        if done:
            break
    
    # Calculate Turnaround Time
    turnaround_time = [waiting_time[i] + burst_time[i] for i in range(n)]
    
    return gantt_chart, waiting_time, turnaround_time

参考说明

  • 正确甘特图结果
  • 我的代码生成的甘特图结果
  • GeeksforGeek上的示例场景

代码问题分析

1. 错误修改进程到达时间

代码中定义的rem_arrival变量完全多余,且每次处理进程后将rem_arrival[i] = t,这会破坏进程到达时间的原始值,导致后续判断进程是否就绪的逻辑混乱。进程到达时间是固定值,无需修改,直接用原始arrival_time[i]判断即可。

2. 未使用就绪队列维护调度顺序

当前代码通过循环遍历所有进程的方式调度,不符合Round Robin的核心逻辑:应该用队列维护就绪进程,每次取出队首进程运行一个时间片,未完成则放回队尾。直接遍历所有进程会导致同一时间窗口内,到达的进程被连续处理,打乱轮询顺序。

3. 等待时间计算逻辑不严谨

代码仅在进程完成时一次性计算等待时间,虽然公式最终结果可能正确,但依赖完成时间的准确性;而如果调度逻辑出错(比如时间推进错误),等待时间也会随之出错。更严谨的方式是通过周转时间(完成时间-到达时间)减去总执行时间来计算等待时间。


修正后的代码

def round_robin(processes, burst_time, arrival_time, time_quantum):
    n = len(processes)
    waiting_time = [0] * n
    turnaround_time = [0] * n
    rem_burst = list(burst_time)
    gantt_chart = []
    ready_queue = []
    t = 0
    # 标记进程是否已加入就绪队列
    added = [False] * n

    while True:
        # 将当前时间点已到达的未加入队列的进程加入就绪队列
        for i in range(n):
            if arrival_time[i] <= t and not added[i] and rem_burst[i] > 0:
                ready_queue.append(i)
                added[i] = True
        
        if not ready_queue:
            # 无就绪进程时,直接跳转到下一个进程的到达时间
            next_arrivals = [arrival_time[i] for i in range(n) if rem_burst[i] > 0]
            if not next_arrivals:
                break  # 所有进程已完成
            t = min(next_arrivals)
            continue
        
        # 取出队首进程调度
        current_idx = ready_queue.pop(0)
        start_time = t

        if rem_burst[current_idx] > time_quantum:
            t += time_quantum
            rem_burst[current_idx] -= time_quantum
            gantt_chart.append((processes[current_idx], t))
            # 未完成的进程重新加入队列尾部
            ready_queue.append(current_idx)
        else:
            t += rem_burst[current_idx]
            rem_burst[current_idx] = 0
            gantt_chart.append((processes[current_idx], t))
            # 计算周转时间和等待时间
            turnaround_time[current_idx] = t - arrival_time[current_idx]
            waiting_time[current_idx] = turnaround_time[current_idx] - burst_time[current_idx]
        
        # 检查当前进程运行期间是否有新进程到达,加入就绪队列
        for i in range(n):
            if arrival_time[i] > start_time and arrival_time[i] <= t and not added[i] and rem_burst[i] > 0:
                ready_queue.append(i)
                added[i] = True

    return gantt_chart, waiting_time, turnaround_time

内容的提问来源于stack exchange,提问作者Jseok Y.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:01:13