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

C语言实现Round Robin CPU调度算法无输出问题求助

问题排查与修复

1. 核心问题:无限死循环

你的dispatcher函数存在致命逻辑漏洞:

  • current_time初始值为0,但create_process中第一个进程的AT是rand()%10 +1(最小值为1),后续进程的AT是前一个AT加至少1,导致所有进程的AT都大于初始current_time。
  • 循环中没有任何逻辑推进current_time,当没有进程满足AT <= current_time时,程序会一直遍历进程数组,永远无法跳出循环,后续代码完全无法执行。

2. 输出缓冲问题

printf默认采用行缓冲模式,若输出内容不带换行符\n,内容会暂存缓冲区而非立即显示到终端。你写的printf("test main 1");等测试语句都没有换行,即使程序未卡死,也可能看不到输出。

修复后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>

struct process
{
    int PID;
    int AT;     // arrival time
    int BT;     // burst time
    int ST;     // start time
    int CT;     // completion time
    int TAT;    // turn-around time
    int WT;     // waiting time
    int RT;     // response time
    int remaining_BT;   // remaining burst time for round robin
    
};

#define PROCESS_LIMIT 100
#define TIME_QUANTUM 2
struct process processes[PROCESS_LIMIT];        // array to store processes
void display(int i);

void create_process()
{
    srand(time(NULL));
    for (int i = 0; i < PROCESS_LIMIT; i++)
    {
        processes[i].PID = (i + 1);
    
        // arrival time
        int at = (rand() % 10) + 1;
        if (i != 0)
        {
            processes[i].AT = processes[i-1].AT + at;
        }
        else
        {
            processes[i].AT = at;
        }
        
        // burst time
        int bt = (rand() % 10) + 1;
        processes[i].BT = bt;
        processes[i].remaining_BT = bt;
        
        processes[i].CT = 0;
        processes[i].TAT = 0;
        processes[i].WT = 0;
        processes[i].RT = -1;
        
    }
}

void dispatcher()
{
    int current_time = 0;
    int processes_completed = 0;
    int i = 0;
    int no_process_executed;

    printf("test 1\n");
    
    while (processes_completed < PROCESS_LIMIT)
    {
        no_process_executed = 1;
        // check if the current process is ready to run
        if (processes[i].remaining_BT > 0 && processes[i].AT <= current_time)
        {
            no_process_executed = 0;
            if (processes[i].RT == -1)
                processes[i].RT = current_time - processes[i].AT;
                
            int time_to_run = processes[i].remaining_BT <= TIME_QUANTUM ? processes[i].remaining_BT : TIME_QUANTUM;
            
            // 仅在进程首次执行时设置开始时间
            if (processes[i].RT == current_time - processes[i].AT)
                processes[i].ST = current_time;
                
            current_time += time_to_run;
            processes[i].remaining_BT -= time_to_run;
            
            if (processes[i].remaining_BT == 0) // check if the process has finished
            {
                processes[i].CT = current_time;
                processes[i].TAT = processes[i].CT - processes[i].AT;
                processes[i].WT = processes[i].TAT - processes[i].BT;
                processes_completed++;

                printf("Processes completed: %d\n", processes_completed);
            }
        }
        
        i = (i + 1) % PROCESS_LIMIT;
        
        // 遍历一圈无进程可执行时,推进时间到下一个未完成进程的到达时间
        if (no_process_executed && i == 0) {
            int next_at = INT_MAX;
            for (int j = 0; j < PROCESS_LIMIT; j++) {
                if (processes[j].remaining_BT > 0 && processes[j].AT > current_time && processes[j].AT < next_at) {
                    next_at = processes[j].AT;
                }
            }
            if (next_at != INT_MAX) {
                current_time = next_at;
            }
        }
    }
}

void display(int i)
{
    if (i == 0)
    {
        printf("PID  AT  BT  ST  CT  TAT  WT  RT\n");
    }
    
    printf("%-4d %-3d %-3d %-3d %-3d %-4d %-3d %-3d\n", processes[i].PID, processes[i].AT, processes[i].BT, processes[i].ST, processes[i].CT, processes[i].TAT, processes[i].WT, processes[i].RT);
    
}

int main()
{
    printf("test main 1\n");
    create_process();
    dispatcher();
    
    printf("tester\n");
    
    // display
    for (int i = 0; i < PROCESS_LIMIT; i++)
    {
        display(i);
    }

    return 0;
}

额外优化说明

  • 修复了ST(开始时间)被多次覆盖的问题,仅在进程首次执行时设置该值。
  • 使用对齐格式化输出%-4d,让结果表格更整齐易读。

内容的提问来源于stack exchange,提问作者Abitatha Roy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:44:50