如何实现Round-Robin调度的时间线全进程状态表格打印
Round-Robin调度时间线打印问题解决
问题需求
实现Round-Robin调度的时间线打印功能,要求按给定时间量子间隔输出所有进程信息:
- 正在处理的进程排在最前
- 其余未处理进程排在后面
- 已完成的进程不再打印
给定输入:
char name[50][10] = {"A","B","C","D","E"}; // process names int btime[] = {9,7,8,5,3}; // process burst times int n = 5;
预期输出示例:
Round robin scheduling with time quantum = 2 0: (A,9,9) (B,7,7) (C,8,8) (D,5,5) (E,3,3) 2: (B,7,7) (C,8,8) (D,5,5) (E,3,3) (A,9,7) 4: (C,8,8) (D,5,5) (E,3,3) (A,9,7) (B,7,5) ...
当前代码问题:仅能打印正在运行的单个进程,无法输出同一时间点的其他未执行进程。
解决方案
原代码的核心问题是未遍历所有未完成进程来输出完整列表。调整逻辑后,在每次处理进程时,先打印当前时间点的所有未完成进程(当前处理的排最前),再更新进程状态和时间戳。
修改后的代码:
#include <stdio.h> int main() { char name[50][10] = {"A", "B", "C", "D", "E"}; // process names int btime[] = {9, 7, 8, 5, 3}; // process burst times int n = sizeof btime / sizeof btime[0]; int quantum = 2; int wt[n]; int rem_bt[n]; for (int i = 0; i < n; i++) rem_bt[i] = btime[i]; printf("Round robin scheduling with time quantum = %d\n", quantum); int t = 0; while (1) { int done = 1; // 遍历所有进程,处理每个未完成的进程 for (int i = 0; i < n; i++) { if (rem_bt[i] > 0) { done = 0; // 打印当前时间点的所有未完成进程:当前处理的进程排最前 printf("%d: ", t); printf("(%s,%d,%d) ", name[i], btime[i], rem_bt[i]); // 打印其余未完成进程 for (int j = 0; j < n; j++) { if (j != i && rem_bt[j] > 0) { printf("(%s,%d,%d) ", name[j], btime[j], rem_bt[j]); } } printf("\n"); // 更新当前进程的剩余时间与时间戳 if (rem_bt[i] > quantum) { rem_bt[i] -= quantum; t += quantum; } else { t += rem_bt[i]; wt[i] = t - btime[i]; // 修正等待时间计算逻辑 rem_bt[i] = 0; } } } if (done == 1) { break; } } return 0; }
关键改动说明
- 完整进程列表打印:处理每个进程前,先输出当前时间,再依次打印当前处理的进程和其余未完成进程,确保时间线信息完整。
- 修正等待时间计算:原代码中等待时间公式错误,改为
完成时间 - 总执行时间的正确逻辑。 - 格式对齐:严格按照预期格式输出进程信息,保证与示例输出一致。
内容的提问来源于stack exchange,提问作者hoangdat
相关产品推荐
相关产品推荐

