RoundRobin线程调度算法

今天做了一道关于线程调度的题,采用的roundrobin调度算法,求出每个线程的等待时间

输入arrive代表着线程到达时间,run代表每个任务执行完所需要的时间,n代表线程数量,q代表了每个时间片最大的耗时

当时也没什么想法,就想直接模拟这个cpu调度策略,等待所有任务执行完后求出等待时间

 1 #include<iostream>
 2 #include <queue>
 3 using namespace std;
 4 int a[]={0,1,3,9};
 5 int run[] = {2,1,7,5};
 6 float waitingTimeRobin(int *arrival, int *run, int n, int q)
 7 {
 8  // WRITE YOUR CODE HERE
 9  int i=0;
10  queue<int> qq;
11  int j=0;
12  int task = -1;
13  int *wt = new int[n];
14  int *lst = new int[n];
15  for(int tt=0;tt<n;tt++){
16      wt[tt] = 0;
17      lst[tt] = arrival[tt];
18  }
19  while(1){
20      for(;j<n&&arrival[j]<=i;++j){
21          if(arrival[j]==i){
22              qq.push(j++);
23              break;
24          }
25      }
26      if(task == -1 && !qq.empty()){
27          task = qq.front();
28          qq.pop();
29      }
30      if(task!= -1){
31          int tmp = i+q;
32          wt[task] += (i-lst[task]);
33          
34          while(i<tmp&&run[task]>0){
35              i++;
36              run[task]--;
37          }
38          lst[task] = i;
39          for(;j<n&&arrival[j]<=i;j++){
40              qq.push(j);
41          }
42          if(run[task]>0)
43              qq.push(task);
44          task = -1;
45      }else{
46          i++;
47      }
48      if(qq.empty()&&j>=n)
49          break;
50  }
51  int total = 0;
52  for(int kk=0;kk<n;++kk)
53      total += wt[kk];
54  float ans = (float)total/(float)n;
55  return ans;
56 }
57 int main(int argc, _TCHAR* argv[])
58 {
59  float ans = waitingTimeRobin(a,run,4,2);
60  cout<<ans<<endl;
61  return 0;
62 }

如果有更好的想法欢迎拍砖指正呐~ 代码当时写的很糙……后来也没有改了…… 样例1:
arrival = [0,1,4] run = [5,2,3] n = 3, q = 3
output = 2.3333333
样例2:
arrival = [0,1,3,9] run = [2,1,7,5] n =4, q = 2
output = 1.0000000



Previous     Next
SureD /
Published under (CC) BY-NC-SA in categories c++  tagged with C++ 
分享到: 更多
>