fork download
  1. #include <stdio.h>
  2. // #include <stdlib.h>
  3.  
  4.  
  5. struct pcb
  6. {
  7. //char* name;
  8. int no; //进程号
  9. int priority; //优先级
  10. int arrtime; //到达时间
  11. int runtime; //需要运行时间
  12. int cputime; //已运行时间
  13. int io_num; //需要io次数(以1s为单位)
  14. char state; //状态,就绪Wait(W)、运行R(Run)、或阻塞B(Block)
  15. };
  16.  
  17. struct pcb pcb[20]; //所有进程
  18. struct pcb wait[20]; //等待队列
  19. int time;
  20. int current_pcb;
  21. int i,j,num;
  22.  
  23. void run(){
  24. pcb[current_pcb].priority--;
  25. pcb[current_pcb].runtime--;
  26. pcb[current_pcb].cputime++;
  27. pcb[current_pcb].state = 'r';
  28. printf("时间片%d运行:进程 %d\n",time,current_pcb);
  29. }
  30. int compare(struct pcb wait[]){
  31. //找出优先级最高的
  32. current_pcb=wait[0].no;
  33. int x;
  34. x = wait[0].priority;
  35. for(i=1;i<j;i++){
  36. if( x< wait[i].priority){
  37. current_pcb = wait[i].no;
  38. x = wait[i].priority;
  39. }
  40. }
  41. return current_pcb; //返回运行的进程编号
  42. }
  43.  
  44. void io(){
  45. for(i=1;i<=num;i++){
  46. if(pcb[i].io_num ==0 && pcb[i].state == 'b'){
  47. pcb[i].state = 'w';
  48. pcb[i].cputime++;
  49. }
  50. if(pcb[i].io_num>0 && (pcb[i].state =='b'|| pcb[i].state == 'r') ){
  51. pcb[i].io_num--;
  52. pcb[i].state = 'b';
  53. pcb[i].cputime++;
  54. }
  55. }
  56. }
  57. void pcb_finish(){
  58. int no;
  59. for(i =0;i<num;i++){
  60. if(pcb[i].runtime ==0){
  61. no = pcb[i].no;
  62. pcb[i].no = pcb[i+1].no;
  63. pcb[i].priority = pcb[i+1].priority;
  64. pcb[i].arrtime = pcb[i+1].arrtime;
  65. pcb[i].runtime = pcb[i+1].runtime;
  66. pcb[i].cputime = pcb[i+1].cputime;
  67. pcb[i].io_num = pcb[i+1].io_num;
  68. pcb[i].state = pcb[i+1].state;
  69. num--;
  70. printf("进程%d运行完毕",no);
  71. }
  72. }
  73. }
  74.  
  75. int main()
  76. {
  77. printf("请输入进程的数量:\n");
  78. scanf("%d",&num);
  79. printf("输入进程号.进程优先级.进程到达时间.进程运行时间.进程所需I/O时间\n");
  80. for(int i=0; i<num; i++){
  81. scanf("%d %d %d %d %d",&pcb[i].no,&pcb[i].priority,&pcb[i].arrtime,&pcb[i].runtime,&pcb[i].io_num);
  82. }
  83.  
  84. printf("--------------------时间片0--------------------\n");
  85. printf("进程号 进程优先级 进程到达时间 进程运行时间 进程已用时间 I/O时间\n");
  86. for(int i=0; i<num; i++){
  87. printf("%2d %10d %10d %10d %10d %10d\n",pcb[i].no, pcb[i].priority, pcb[i].arrtime, pcb[i].runtime, pcb[i].cputime, pcb[i].io_num);
  88. }
  89. time = 1;
  90.  
  91. while(num!=0){ //pcb[i]运行完一个num就减少一个,直到pcb清空为0结束
  92. printf("--------------------时间片%d--------------------\n",time);
  93.  
  94. for(i=0; i < num; i++)
  95. wait[i].no = -1;
  96.  
  97. for(i=0,j=0;i<num;i++){ //检查哪个进程到达了并且没有阻塞或者运行中
  98. if(pcb[i].arrtime <= time && pcb[i].state != 'b' ){
  99. pcb[i].state = 'w';
  100. wait[j].priority = pcb[i].priority;
  101. wait[j].no= i; //进程编号进入wait
  102. printf("%d %d \n",wait[j].priority,wait[j].no);
  103. j=j+1;
  104. }
  105. }
  106. if(wait[0].no == -1){ //没有进程到达
  107. time++;
  108. }
  109. else{
  110. printf("就绪队列:");
  111. for(i=0; wait[i].no != -1; i++)
  112. printf("%d ",wait[i].no);
  113. printf("\n");
  114. current_pcb = compare(wait); //j-1为到达个数,wait编号1到j-1,max=到达的优先级最高的进程编号
  115. printf("%d",current_pcb);
  116. run(); //运行优先级最高的进程
  117. }
  118.  
  119. printf("进程号 进程优先级 进程到达时间 进程运行时间 进程已用时间 I/O时间\n");
  120. for(int i=0; i<num; i++){
  121. printf("%2d %10d %10d %10d %10d %10d\n",pcb[i].no, pcb[i].priority, pcb[i].arrtime, pcb[i].runtime, pcb[i].cputime, pcb[i].io_num);
  122. }
  123.  
  124. io();
  125. pcb_finish();
  126. time++;
  127. /* 输入3
  128. 1 90 1 2 1
  129. 2 60 2 2 0
  130. 3 70 1 1 0*/
  131. }
  132.  
  133. return 0;
  134. }
Runtime error #stdin #stdout 0s 4276KB
stdin
3
1 97 1 3 0
2 100 2 4 2
3 98 4 2 0
stdout
Standard output is empty