fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define N 3
  5.  
  6. typedef struct {
  7. char name[10];
  8. int prio; // 优先级
  9. int needtime; // 需要运行时间
  10. int runtime; // 已运行时间
  11. char state[10]; // 状态
  12. } PCB;
  13.  
  14. PCB pcb[N];
  15.  
  16. // 按优先级从高到低排序
  17. void sort_prio() {
  18. int i, j;
  19. PCB temp;
  20. for (i = 0; i < N-1; i++) {
  21. for (j = i+1; j < N; j++) {
  22. if (pcb[i].prio < pcb[j].prio) {
  23. temp = pcb[i];
  24. pcb[i] = pcb[j];
  25. pcb[j] = temp;
  26. }
  27. }
  28. }
  29. }
  30.  
  31. // 显示格式完全匹配文档
  32. void show() {
  33. printf("\n进程名\t优先级\t需要时间\t已运行时间\t状态\n");
  34. for (int i = 0; i < N; i++) {
  35. printf("%s\t%d\t%d\t\t%d\t\t%s\n",
  36. pcb[i].name,
  37. pcb[i].prio,
  38. pcb[i].needtime,
  39. pcb[i].runtime,
  40. pcb[i].state);
  41. }
  42. }
  43.  
  44. int main() {
  45. // 固定进程:aa bb cc,和文档完全一致
  46. strcpy(pcb[0].name, "aa");
  47. pcb[0].prio = 3;
  48. pcb[0].needtime = 5;
  49. pcb[0].runtime = 0;
  50. strcpy(pcb[0].state, "就绪");
  51.  
  52. strcpy(pcb[1].name, "bb");
  53. pcb[1].prio = 1;
  54. pcb[1].needtime = 3;
  55. pcb[1].runtime = 0;
  56. strcpy(pcb[1].state, "就绪");
  57.  
  58. strcpy(pcb[2].name, "cc");
  59. pcb[2].prio = 5; // 最高优先级
  60. pcb[2].needtime = 2;
  61. pcb[2].runtime = 0;
  62. strcpy(pcb[2].state, "就绪");
  63.  
  64. printf("===== 进程调度实验:最高优先数优先 =====\n");
  65. sort_prio();
  66. show();
  67.  
  68. int finish = 0;
  69. while (finish < N) {
  70. sort_prio();
  71.  
  72. // 选优先级最高的进程运行
  73. int run_idx = -1;
  74. for (int i = 0; i < N; i++) {
  75. if (strcmp(pcb[i].state, "完成") != 0) {
  76. run_idx = i;
  77. break;
  78. }
  79. }
  80.  
  81. // 标记运行
  82. strcpy(pcb[run_idx].state, "运行");
  83. printf("\n正在运行:%s\n", pcb[run_idx].name);
  84. show();
  85.  
  86. // 运行一个时间单位
  87. pcb[run_idx].runtime++;
  88.  
  89. // 判断是否完成
  90. if (pcb[run_idx].runtime >= pcb[run_idx].needtime) {
  91. strcpy(pcb[run_idx].state, "完成");
  92. finish++;
  93. printf("\n【%s】运行结束\n", pcb[run_idx].name);
  94. } else {
  95. strcpy(pcb[run_idx].state, "就绪");
  96. }
  97. }
  98.  
  99. printf("\n===== 所有进程调度完成 =====\n");
  100. return 0;
  101. }
Success #stdin #stdout 0s 5308KB
stdin
Standard input is empty
stdout
===== 进程调度实验:最高优先数优先 =====

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		0		就绪
aa	3	5		0		就绪
bb	1	3		0		就绪

正在运行:cc

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		0		运行
aa	3	5		0		就绪
bb	1	3		0		就绪

正在运行:cc

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		1		运行
aa	3	5		0		就绪
bb	1	3		0		就绪

【cc】运行结束

正在运行:aa

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		0		运行
bb	1	3		0		就绪

正在运行:aa

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		1		运行
bb	1	3		0		就绪

正在运行:aa

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		2		运行
bb	1	3		0		就绪

正在运行:aa

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		3		运行
bb	1	3		0		就绪

正在运行:aa

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		4		运行
bb	1	3		0		就绪

【aa】运行结束

正在运行:bb

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		5		完成
bb	1	3		0		运行

正在运行:bb

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		5		完成
bb	1	3		1		运行

正在运行:bb

进程名	优先级	需要时间	已运行时间	状态
cc	5	2		2		完成
aa	3	5		5		完成
bb	1	3		2		运行

【bb】运行结束

===== 所有进程调度完成 =====