短作業優先調度算法(SJF)


假設有n項作業位於就緒隊列中,這些作業的提交時間用數組requestTimes按照提交時間的先后順序存儲,對應的作業服務時間(持續時間)用數組durations存儲。采用SJF算法,計算n項作業的平均等待時間。當存在多個相同長度的短作業時,按照提交時間的先后順序進行調度。假設0<= n <= 100。求出所有作業的平均等待時間。

函數原型:void minWaitingTime(int requestTimes[],int durations[],int n)

測試用例:

輸入 

4
0 2 4 5
7 4 1 4

輸出:

4.0

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 #define MAX 0x7FFFFFFF
 6 
 7 void minWaitingTime(int requestTimes[],int durations[],int n)
 8 {
 9     int i,time,j,k;
10     float res;
11     int index,arriveTime,indextemp;
12     int *done = (int *)malloc(sizeof(int) * n);  //表示作業是否執行過,1表示執行完畢,0表示未執行
13     int *wait = (int *)malloc(sizeof(int) * n);  //表示等待時間
14     for(i = 0; i < n; ++i){
15         wait[i] = 0;
16         done[i] = 0;
17     }        
18 
19     time = 0;  //time表示總作業執行時間
20     for(i = 0; i < n; i++){
21         if(i == 0){  //執行第一個作業
22             time += durations[i];
23             done[i] = 1;
24             for(j = 1; j < n; j++){
25                 if(requestTimes[j] < time)
26                     wait[j] = time - requestTimes[j];
27             }
28         }
29         else{
30             index = GetMin(durations,done,n);
31             //判斷是否有多個最短作業,如有選擇其中先到達的
32             arriveTime = requestTimes[index];
33             for(indextemp = index + 1; indextemp < n; indextemp++){
34                 if(done[indextemp] == 0 && durations[indextemp] == durations[index] &&
35                     requestTimes[indextemp] < arriveTime)
36                     index = indextemp;
37             }
38 
39             time += durations[index];
40             done[index] = 1;
41             //執行選出的最短作業,並更新其它作業的等待時間
42             for(indextemp = 0; indextemp < n && i < n-1; indextemp++)
43                 if(done[indextemp] == 0 &&requestTimes[indextemp] < time)
44                     wait[indextemp] = time - requestTimes[indextemp];
45         }
46     }
47 
48     res = 0.0;
49     for(i = 0; i < n; i++)
50         res += wait[i];
51 
52     printf("%f\n",res / n);
53 
54 }
55 //每次取出服務時間最短且示執行過的作業
56 int GetMin(int durations[],int done[],int n)
57 {
58     int i,j,min = MAX;
59     for(i = 0; i < n; i++)
60         if(durations[i] < min && done[i] == 0){
61             min = durations[i];
62             j = i;
63         }
64     return j;
65 }
66 
67 int main()
68 {
69     int requestTimes[100];
70     int durations[100];
71     int i,n;
72     scanf("%d",&n);
73     for(i = 0; i < n; i++)
74         scanf("%d",&requestTimes[i]);
75     for(i = 0; i < n; i++)
76         scanf("%d",&durations[i]);
77 
78     minWaitingTime(requestTimes,durations,n);
79 
80     system("pause");
81     return 0;
82 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM