短进程优先

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4. #define TAKEIN "Takein"//吸纳状态   
  5. #define WAIT "Wait"//就绪状态   
  6. #define RUN "Run"//运行状态   
  7. #define FINISH "Finish"//完成状态   
  8. #define JOBNUMBER 5 //设置进程测试数为5   
  9. #define MIN 100    
  10. typedef struct PCB{   
  11.     char jobName[10];//作业号   
  12.     int arriveTime;//到达时间   
  13.     int runTime;//需要运行时间   
  14.     int startTime;//开始时间   
  15.     int endTime;//完成时间   
  16.     int turnoverTime;//周转时间   
  17.     float useWeightTurnoverTime;//带权周转时间  
  18.     char processStatus[10];//进程状态     
  19. };  
  20. static int currentTime = 0;   
  21. static int finishNumber = 0;  
  22. char JobArray[JOBNUMBER][10];  
  23. static int indexJob = 1;  
  24.   
  25. //创建PCB  
  26. void createPCB(struct PCB* pcb){  
  27.     freopen("input.txt","r",stdin);  
  28.     printf("从文件中读入三个参数的数据:\n");  
  29.     printf("作业号 到达时间 需要运行时间\n");   
  30.     for(int i = 0; i < 5; i++){  
  31.         scanf("%s", &pcb[i].jobName);//作业号   
  32.         scanf("%d", &pcb[i].arriveTime);//到达时间   
  33.         scanf("%d", &pcb[i].runTime);//需要运行时间   
  34.         pcb[i].startTime = 0;  
  35.         pcb[i].endTime = 0;  
  36.         pcb[i].turnoverTime = 0;  
  37.         pcb[i].useWeightTurnoverTime = 0.0;  
  38.         strcpy(pcb[i].processStatus, TAKEIN);  
  39.         printf("%s\t%d\t%d\n",pcb[i].jobName, pcb[i].arriveTime,pcb[i].runTime);  
  40.     }  
  41.     printf("---------------------------------------------\n");  
  42.  }  
  43.    
  44. //打印用途  
  45. void printJob(struct PCB* pcb){  
  46.     printf("当前时间为%d\n", currentTime);  
  47.     printf("作业号 到达时间 需要运行时间 开始时间 完成时间 周转时间 带权周转时间 进程状态\n");  
  48.     for(int i = 0; i < JOBNUMBER; i++){    
  49.         if(strcmp(pcb[i].processStatus, FINISH) == 0)//如果进程为finish状态,这样输出   
  50.             printf("%s\t%d\t%4d\t\t%d\t%d\t  %d\t%.2f\t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].startTime, pcb[i].endTime, pcb[i].turnoverTime, pcb[i].useWeightTurnoverTime, pcb[i].processStatus);      
  51.         else if(strcmp(pcb[i].processStatus, RUN) == 0)//如果进程为run状态,这样输出   
  52.             printf("%s\t%d\t%4d\t\t%d\t运行中\t  none\tnone  \t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].startTime, pcb[i].processStatus);    
  53.         else //如果进程为take in或wait状态,这样输出  
  54.             printf("%s\t%d\t%4d\t\t未运行\tnone\t  none\tnone  \t%s\n", pcb[i].jobName, pcb[i].arriveTime, pcb[i].runTime, pcb[i].processStatus);  
  55.     }  
  56.     printf("---------------------------------------------\n");  
  57. }   
  58.   
  59. //根据当前时间修改status状态  
  60. void statusConfirm(struct PCB* pcb){  
  61.     for(int i = 0; i < JOBNUMBER; i++){  
  62.         //将当前时间为进程的到达时间,修改take in状态改为Wait状态   
  63.         if(currentTime >= pcb[i].arriveTime && strcmp(pcb[i].processStatus, TAKEIN) == 0){  
  64.             strcpy(pcb[i].processStatus, WAIT);   
  65.         }  
  66.     }  
  67. }   
  68.   
  69. //确定当前时间wait进程中最短进程的数组下标,没有wait进程则返回-1   
  70. int shortIndex(struct PCB* pcb){  
  71.     int min = MIN, temp = -1;  
  72.     statusConfirm(pcb);  
  73.     for(int i = 0; i < JOBNUMBER; i++){  
  74.         if(strcmp(pcb[i].processStatus, WAIT) == 0){  
  75.             if(pcb[i].runTime <= min){  
  76.                 min = pcb[i].runTime;  
  77.                 temp = i;  
  78.             }   
  79.         }  
  80.     }  
  81.     return temp;  
  82. }   
  83.   
  84.  //运行第一个到达的进程  
  85. void runFirstJob(struct PCB* pcb){  
  86.     pcb[0].startTime = currentTime;  
  87.     int endTime = pcb[0].startTime + pcb[0].runTime;  
  88.     strcpy(pcb[0].processStatus, RUN);  
  89.     while(true){      
  90.         if(currentTime == endTime){   
  91.             pcb[0].endTime = endTime;   
  92.             pcb[0].turnoverTime = pcb[0].endTime - pcb[0].arriveTime;  
  93.             pcb[0].useWeightTurnoverTime = pcb[0].turnoverTime * 1.0 / pcb[0].runTime;  
  94.             strcpy(pcb[0].processStatus, FINISH);  
  95.             finishNumber++;   
  96.             break;  
  97.         }  
  98.         else{  
  99.             statusConfirm(pcb);  
  100.             printJob(pcb);    
  101.             currentTime++;  
  102.         }     
  103.     }  
  104. }   
  105.   
  106. //运行其他进程   
  107. void runOtherJob(struct PCB* pcb)  
  108. {  
  109.     int index = shortIndex(pcb);  
  110.     strcpy(JobArray[indexJob++], pcb[index].jobName);  
  111.     if(index == -1) //没有进程处于wait状态   
  112.         printJob(pcb);   
  113.     else{  
  114.         pcb[index].startTime = currentTime;  
  115.         pcb[index].endTime = pcb[index].startTime + pcb[index].runTime;  
  116.         pcb[index].turnoverTime = pcb[index].endTime - pcb[index].arriveTime;  
  117.         pcb[index].useWeightTurnoverTime = pcb[index].turnoverTime * 1.0 / pcb[index].runTime;  
  118.         strcpy(pcb[index].processStatus, RUN);  
  119.         while(true){  
  120.             statusConfirm(pcb);  
  121.             if(currentTime == pcb[index].endTime){    
  122.                 strcpy(pcb[index].processStatus, FINISH);  
  123.                 finishNumber++;  
  124.                 if(finishNumber == JOBNUMBER){  
  125.                     printJob(pcb);  
  126.                 }     
  127.                 break;  
  128.             }  
  129.             else{  
  130.                 printJob(pcb);  
  131.                 currentTime++;    
  132.             }     
  133.         }  
  134.     }   
  135. }   
  136.   
  137.  //比较各个进程之间的到达时间,按升序排列   
  138. void compare(struct PCB* pcb){  
  139.     for(int i = 0; i < JOBNUMBER; i++){  
  140.         int min = pcb[i].arriveTime;  
  141.         int minIndex = i;  
  142.         for(int j = i + 1; j < JOBNUMBER; j++){  
  143.             if(pcb[j].arriveTime < min){  
  144.                 min = pcb[j].arriveTime;  
  145.                 minIndex = j;         
  146.             }     
  147.         }  
  148.         struct PCB temp = pcb[i];  
  149.         pcb[i] = pcb[minIndex];  
  150.         pcb[minIndex] = temp;  
  151.     }     
  152. }  
  153.   
  154. //计算平均带权周转时间   
  155. float weightTurnoverTimeCount(struct PCB* pcb){  
  156.     float sum = 0.0;  
  157.     for(int i = 0; i < JOBNUMBER; i++){  
  158.         sum += pcb[i].useWeightTurnoverTime;  
  159.     }  
  160.     return sum / JOBNUMBER;  
  161. }  
  162.   
  163. //计算平均周转时间   
  164. float turnOverTimeCount(struct PCB* pcb){  
  165.     float sum = 0.0;  
  166.     for(int i = 0; i < JOBNUMBER; i++){  
  167.         sum += pcb[i].turnoverTime;  
  168.     }  
  169.     return sum / JOBNUMBER;  
  170. }  
  171.    
  172. //开始进程调度   
  173. void start(struct PCB* pcb){  
  174.     compare(pcb);  
  175.     int firstArriveTime = pcb[0].arriveTime;   
  176.     //进程调度位currentTime每次加1,直到进程全部被调度完成为止   
  177.     for(; finishNumber != 5; currentTime++){  
  178.         if(currentTime < firstArriveTime)//当前时间小于第一个节点到来时间时,直接打印   
  179.             printJob(pcb);  
  180.         else if(currentTime == firstArriveTime)//当时间来到第一个进程的到达时间,调度该进程   
  181.             runFirstJob(pcb);     
  182.         else//根据短进程优先开始调度  
  183.             currentTime--;   
  184.             runOtherJob(pcb);     
  185.         }         
  186.     }  
  187.     printf("1、进程调度顺序为:%s, %s, %s, %s, %s\n", pcb[0].jobName, JobArray[1], JobArray[2], JobArray[3], JobArray[4]);  
  188.     printf("2、平均周转时间为:%.2f\n",turnOverTimeCount(pcb));  
  189.     printf("3、平均带权周转时间为:%.2f\n", weightTurnoverTimeCount(pcb));  
  190.     printf("------------------测试完毕---------\n");  
  191. }  
  192.   
  193. //主函数   
  194. int main(){  
  195.     struct PCB pcb[JOBNUMBER];  
  196.     createPCB(pcb);  
  197.     start(pcb);  
  198.     return 0;  
  199. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值