fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAX_PROCESS 5 // 进程数量
  4. #define TIME_SLICE 1 // 时间片大小(单位时间)
  5.  
  6. // 进程状态
  7. enum State{
  8. READY,
  9. RUNNING,
  10. FINISHED
  11. };
  12.  
  13. // 进程控制块
  14. typedef struct{
  15. int pid; // 进程ID
  16. int priority; // 优先级
  17. int need_time; // 剩余需要运行时间
  18. int total_time; // 总运行时间
  19. int arrival_time; // 到达时间
  20. int start_time; // 开始运行时间
  21. int finish_time; // 完成时间
  22. enum State state; // 进程状态
  23. }PCB;
  24.  
  25. // 全局进程数组
  26. PCB processes[MAX_PROCESS];
  27.  
  28. // 当前时间
  29. int current_time = 0;
  30.  
  31. // 初始化5个进程
  32. void init_processes(){
  33. // 正确初始化所有进程
  34. processes[0] = (PCB){1, 3, 4, 4, 0, -1, 0, READY};
  35. processes[1] = (PCB){2, 5, 2, 2, 1, -1, 0, READY};
  36. processes[2] = (PCB){3, 2, 1, 1, 2, -1, 0, READY};
  37. processes[3] = (PCB){4, 4, 3, 3, 3, -1, 0, READY};
  38. processes[4] = (PCB){5, 1, 2, 2, 4, -1, 0, READY};
  39. }
  40.  
  41. // 检查是否所有进程都已完成
  42. int all_finished(){
  43. for(int i=0; i<MAX_PROCESS; i++){
  44. if(processes[i].state != FINISHED)
  45. return 0;
  46. }
  47. return 1;
  48. }
  49.  
  50. // 选择当前就绪队列中优先级最高的进程(若优先级相同,选择ID较小的)
  51. // 返回进程在数组中的下标,若没有就绪进程则返回-1
  52. int select_highest_priority(){
  53. int selected = -1;
  54. int max_priority = -1;
  55. for(int i=0; i<MAX_PROCESS; i++){
  56. if(processes[i].state == READY){
  57. if(processes[i].priority > max_priority){
  58. max_priority = processes[i].priority;
  59. selected = i;
  60. }else if(processes[i].priority == max_priority){
  61. // 优先级相同,选择ID更小的
  62. if(selected == -1 || processes[i].pid < processes[selected].pid){
  63. selected = i;
  64. }
  65. }
  66. }
  67. }
  68. return selected;
  69. }
  70.  
  71. int main(){
  72. init_processes();
  73. printf("-----进程调度模拟过程-----\n");
  74. printf("调度算法:最高优先数优先(抢占式,动态优先级)\n");
  75. printf("动态规则:每获得一次CPU,优先数减1\n\n");
  76.  
  77. int last_selected = -1;
  78.  
  79. while(!all_finished()){
  80. int selected = select_highest_priority();
  81.  
  82. // 无就绪进程,时间流逝
  83. if(selected == -1){
  84. current_time++;
  85. continue;
  86. }
  87.  
  88. // 记录首次运行时间
  89. if(processes[selected].start_time == -1){
  90. processes[selected].start_time = current_time;
  91. }
  92.  
  93. // 进程切换时打印信息
  94. if(last_selected != selected){
  95. printf("->时刻%d: 选中进程P%d (优先级=%d, 剩余时间=%d)\n",
  96. current_time, processes[selected].pid, processes[selected].priority, processes[selected].need_time);
  97. }
  98.  
  99. // 运行一个时间片
  100. processes[selected].state = RUNNING;
  101. processes[selected].need_time--;
  102. current_time++;
  103.  
  104. // 动态优先级:运行一次优先级-1
  105. processes[selected].priority--;
  106.  
  107. // 进程完成
  108. if(processes[selected].need_time == 0){
  109. processes[selected].state = FINISHED;
  110. processes[selected].finish_time = current_time;
  111. printf("进程P%d已完成!(完成时刻=%d)\n", processes[selected].pid, current_time);
  112. }else{
  113. processes[selected].state = READY;
  114. }
  115.  
  116. last_selected = selected;
  117. }
  118.  
  119. // 输出调度结果统计
  120. printf("\n-----调度完成-----\n");
  121. printf("进程\t到达时间\t开始时间\t总运行时间\t完成时间\t周转时间\n");
  122. int total_turnaround = 0;
  123. for(int i=0; i<MAX_PROCESS; i++){
  124. int turnaround = processes[i].finish_time - processes[i].arrival_time;
  125. total_turnaround += turnaround;
  126. printf("P%d\t%d\t\t%d\t\t%d\t\t%d\t\t%d\n",
  127. processes[i].pid,
  128. processes[i].arrival_time,
  129. processes[i].start_time,
  130. processes[i].total_time,
  131. processes[i].finish_time,
  132. turnaround);
  133. }
  134.  
  135. printf("\n平均周转时间=%.2f\n", (float)total_turnaround / MAX_PROCESS);
  136. return 0;
  137. }
Success #stdin #stdout 0s 5316KB
stdin
Standard input is empty
stdout
-----进程调度模拟过程-----
调度算法:最高优先数优先(抢占式,动态优先级)
动态规则:每获得一次CPU,优先数减1

->时刻0: 选中进程P2 (优先级=5, 剩余时间=2)
进程P2已完成!(完成时刻=2)
->时刻2: 选中进程P4 (优先级=4, 剩余时间=3)
->时刻3: 选中进程P1 (优先级=3, 剩余时间=4)
->时刻4: 选中进程P4 (优先级=3, 剩余时间=2)
->时刻5: 选中进程P1 (优先级=2, 剩余时间=3)
->时刻6: 选中进程P3 (优先级=2, 剩余时间=1)
进程P3已完成!(完成时刻=7)
->时刻7: 选中进程P4 (优先级=2, 剩余时间=1)
进程P4已完成!(完成时刻=8)
->时刻8: 选中进程P1 (优先级=1, 剩余时间=2)
->时刻9: 选中进程P5 (优先级=1, 剩余时间=2)
->时刻10: 选中进程P1 (优先级=0, 剩余时间=1)
进程P1已完成!(完成时刻=11)
->时刻11: 选中进程P5 (优先级=0, 剩余时间=1)
进程P5已完成!(完成时刻=12)

-----调度完成-----
进程	到达时间	开始时间	总运行时间	完成时间	周转时间
P1	0		3		4		11		11
P2	1		0		2		2		1
P3	2		6		1		7		5
P4	3		2		3		8		5
P5	4		9		2		12		8

平均周转时间=6.00