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

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