fork(1) download
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #define MAX_PROCESS 5
  5.  
  6. // 进程控制块PCB
  7. typedef struct {
  8. char name[20];
  9. int priority;
  10. int need_time;
  11. int run_time;
  12. char state[10];
  13. } PCB;
  14.  
  15. PCB pcb[MAX_PROCESS];
  16. int process_num;
  17.  
  18. // 按优先级从高到低排序
  19. void sortByPriority() {
  20. int i, j;
  21. PCB temp;
  22. for (i = 0; i < process_num - 1; i++) {
  23. for (j = i + 1; j < process_num; j++) {
  24. if (pcb[i].priority < pcb[j].priority) {
  25. temp = pcb[i];
  26. pcb[i] = pcb[j];
  27. pcb[j] = temp;
  28. }
  29. }
  30. }
  31. }
  32.  
  33. // 显示所有进程状态
  34. void showProcessState() {
  35. printf("\n%-8s%-8s%-12s%-12s%-8s\n",
  36. "进程名", "优先级", "需要时间", "已运行时间", "状态");
  37. for (int i = 0; i < process_num; i++) {
  38. printf("%-8s%-8d%-12d%-12d%-8s\n",
  39. pcb[i].name,
  40. pcb[i].priority,
  41. pcb[i].need_time,
  42. pcb[i].run_time,
  43. pcb[i].state);
  44. }
  45. }
  46.  
  47. int main() {
  48. int i, finished_count = 0;
  49.  
  50. printf("===== 进程调度实验:最高优先数优先算法 =====\n");
  51. printf("请输入进程数量(最多5个):");
  52. scanf("%d", &process_num);
  53. if (process_num > 5) process_num = 5;
  54.  
  55. // 输入进程信息
  56. for (i = 0; i < process_num; i++) {
  57. printf("\n输入第%d个进程信息(进程名 优先级 需要运行时间):\n", i + 1);
  58. scanf("%s %d %d", pcb[i].name, &pcb[i].priority, &pcb[i].need_time);
  59. pcb[i].run_time = 0;
  60. strcpy(pcb[i].state, "就绪");
  61. }
  62.  
  63. printf("\n===== 开始调度 =====\n");
  64.  
  65. // 调度主循环
  66. while (finished_count < process_num) {
  67. sortByPriority();
  68.  
  69. // 找到第一个未完成进程
  70. for (i = 0; i < process_num; i++) {
  71. if (strcmp(pcb[i].state, "完成") != 0) {
  72. break;
  73. }
  74. }
  75.  
  76. // 运行当前进程
  77. strcpy(pcb[i].state, "运行");
  78. showProcessState();
  79.  
  80. // 执行一个时间片
  81. pcb[i].run_time++;
  82. pcb[i].priority--; // 动态优先级:运行一次优先级-1
  83.  
  84. // 判断是否完成
  85. if (pcb[i].run_time >= pcb[i].need_time) {
  86. strcpy(pcb[i].state, "完成");
  87. finished_count++;
  88. printf("\n进程【%s】执行完毕!\n", pcb[i].name);
  89. } else {
  90. strcpy(pcb[i].state, "就绪");
  91. }
  92. }
  93.  
  94. printf("\n===== 所有进程调度完成 =====\n");
  95. return 0;
  96. }
Success #stdin #stdout 0s 5288KB
stdin
Standard input is empty
stdout
===== 进程调度实验:最高优先数优先算法 =====
请输入进程数量(最多5个):
===== 开始调度 =====

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