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
相关产品推荐
相关产品推荐

