fork(1) download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define N 5 // 进程数量
  6.  
  7. // 进程状态
  8. char *state_str[] = {"就绪", "运行", "完成"};
  9.  
  10. // 进程控制块 PCB
  11. struct PCB {
  12. char name[20]; // 进程名
  13. int prio; // 优先级(动态)
  14. int needtime; // 需要运行时间
  15. int runtime; // 已运行时间
  16. char state[10]; // 状态
  17. } pcb[N];
  18.  
  19. // 初始化进程信息
  20. void input() {
  21. printf("请输入%d个进程的信息(进程名 优先级 需要时间):\n", N);
  22. for (int i = 0; i < N; i++) {
  23. printf("进程%d: ", i + 1);
  24. scanf("%s %d %d", pcb[i].name, &pcb[i].prio, &pcb[i].needtime);
  25. pcb[i].runtime = 0;
  26. strcpy(pcb[i].state, "就绪");
  27. }
  28. }
  29.  
  30. // 按优先级降序排序(冒泡排序)
  31. void sort_prio() {
  32. struct PCB temp;
  33. for (int i = 0; i < N - 1; i++) {
  34. for (int j = i + 1; j < N; j++) {
  35. // 优先级高的排在前面
  36. if (pcb[i].prio < pcb[j].prio) {
  37. temp = pcb[i];
  38. pcb[i] = pcb[j];
  39. pcb[j] = temp;
  40. }
  41. }
  42. }
  43. }
  44.  
  45. // 显示进程信息
  46. void show() {
  47. printf("\n进程名\t优先级\t需要时间\t已运行时间\t状态\n");
  48. for (int i = 0; i < N; i++) {
  49. printf("%s\t%d\t%d\t\t%d\t\t%s\n",
  50. pcb[i].name,
  51. pcb[i].prio,
  52. pcb[i].needtime,
  53. pcb[i].runtime,
  54. pcb[i].state);
  55. }
  56. }
  57.  
  58. // 调度算法
  59. void schedule() {
  60. int count = N; // 剩余未完成的进程数
  61.  
  62. printf("\n========== 开始进程调度 ==========\n");
  63.  
  64. while (count > 0) {
  65. // 每次调度前按优先级排序
  66. sort_prio();
  67.  
  68. // 找到第一个未完成的进程(优先级最高)
  69. int idx = -1;
  70. for (int i = 0; i < N; i++) {
  71. if (strcmp(pcb[i].state, "完成") != 0) {
  72. idx = i;
  73. break;
  74. }
  75. }
  76.  
  77. if (idx == -1) break; // 所有进程都已完成
  78.  
  79. // 将该进程设为运行态
  80. strcpy(pcb[idx].state, "运行");
  81.  
  82. printf("\n>>> 当前调度进程: %s (优先级: %d, 还需时间: %d)\n",
  83. pcb[idx].name, pcb[idx].prio, pcb[idx].needtime - pcb[idx].runtime);
  84.  
  85. show();
  86.  
  87. // 运行一个时间片
  88. pcb[idx].runtime++;
  89.  
  90. // 动态优先级调整:运行一次后优先级减1
  91. pcb[idx].prio--;
  92.  
  93. // 检查是否完成
  94. if (pcb[idx].runtime >= pcb[idx].needtime) {
  95. strcpy(pcb[idx].state, "完成");
  96. printf(">>> 进程 %s 已完成!\n", pcb[idx].name);
  97. count--;
  98. } else {
  99. strcpy(pcb[idx].state, "就绪");
  100. }
  101. }
  102.  
  103. printf("\n========== 所有进程调度完成 ==========\n");
  104. show();
  105. }
  106.  
  107. int main() {
  108. printf("===== 最高优先数优先调度算法 =====\n");
  109. printf("(动态优先级:每运行一次优先级减1)\n\n");
  110.  
  111. input();
  112.  
  113. printf("\n初始进程状态:");
  114. show();
  115.  
  116. schedule();
  117.  
  118. return 0;
  119. }
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
===== 最高优先数优先调度算法 =====
(动态优先级:每运行一次优先级减1)

请输入5个进程的信息(进程名 优先级 需要时间):
进程1: 进程2: 进程3: 进程4: 进程5: 
初始进程状态:
进程名	优先级	需要时间	已运行时间	状态
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪

========== 开始进程调度 ==========

>>> 当前调度进程:  (优先级: 0, 还需时间: 0)

进程名	优先级	需要时间	已运行时间	状态
	0	0		0		运行
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪
>>> 进程  已完成!

>>> 当前调度进程:  (优先级: 0, 还需时间: 0)

进程名	优先级	需要时间	已运行时间	状态
	0	0		0		运行
	0	0		0		就绪
	0	0		0		就绪
	0	0		0		就绪
	-1	0		1		完成
>>> 进程  已完成!

>>> 当前调度进程:  (优先级: 0, 还需时间: 0)

进程名	优先级	需要时间	已运行时间	状态
	0	0		0		运行
	0	0		0		就绪
	0	0		0		就绪
	-1	0		1		完成
	-1	0		1		完成
>>> 进程  已完成!

>>> 当前调度进程:  (优先级: 0, 还需时间: 0)

进程名	优先级	需要时间	已运行时间	状态
	0	0		0		运行
	0	0		0		就绪
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成
>>> 进程  已完成!

>>> 当前调度进程:  (优先级: 0, 还需时间: 0)

进程名	优先级	需要时间	已运行时间	状态
	0	0		0		运行
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成
>>> 进程  已完成!

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

进程名	优先级	需要时间	已运行时间	状态
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成
	-1	0		1		完成