操作系统 RR轮转调度算法(C++实现)

2021-01-05 19:28

阅读:680

标签:bin   color   ali   队列   order   list   cpu   width   div   

1. 基本原理

  在轮转(RR)法中,系统根据FCFS策略,将所有的就绪进程排成一个就绪队列,并可设置每隔一定时间间隔(即时间片)即产生一次中断,激活系统中的进程调度程序,完成一次调度,将CPU分配给队首进程,令其执行。

  进程切换时机:

  • 若一个时间片尚未用完,进程就已经结束,则立即激活调度程序,将其从队列中删除,并启动一个新的时间片。
  • 在一个时间片用完时,进程尚未结束,则将其送往队尾。

2. 代码实现

  2.1 初始化数据

作业情况

\

时间片

进程名 0  1 2 3 4 平均
到达时间 0 1 2 3 4  
服务时间 4 3 4 2 4  

RR

q = 4

完成时间 4 7 11 13 17  
周转时间 4 6 9 10 13 8.4
带权周转时间 1 2 2.25 5 3.25 2.5

  2.2 RR实现函数

 1 //RR轮转调度算法
 2 void RoundRobin( vectorint> T, vectordouble> S, vectorint> &FT, vectorint> &WT 
 3             , vectordouble> &WWT){
 4     int q , CurTime = 0, count = 0;
 5     printf("Please enter the number of piece:\n");
 6     cin >> q;
 7     queueint> list;
 8     vectordouble> _S = S; //用来存储服务时间
 9     while(CurTime 17){
10         while( T[count]  T.size())
11             list.push(count ++);
12         // 利用队列完成时间片轮转
13         if( ! list.empty() ){
14             int temp = list.front();
15             list.pop();
16             for( int i = 0; i ){
17                 if( S[temp] > 0)
18                     printf("Time %d : Program %d is Running.\n",CurTime ,temp);
19                 else break;
20             }
21             //先判断是否有新的就绪进程可以入队
22             while( T[count]  T.size())
23                 list.push(count ++);
24             //再将之前未完成的进程入队
25             if(S[temp] > 0)
26                 list.push(temp);
27             else{
28                 printf("Time %d : Program %d is over.\n", CurTime ,temp);
29                 FT[temp] = CurTime; WT[temp] = FT[temp] - T[temp]; WWT[temp] = WT[temp] / _S[temp];
30             }
31         }
32         else
33             printf( "Time %d : No Program is Running.\n", CurTime ++);
34     }
35 
36 }

操作系统 RR轮转调度算法(C++实现)

标签:bin   color   ali   队列   order   list   cpu   width   div   

原文地址:https://www.cnblogs.com/john1015/p/12980008.html


评论


亲,登录后才可以留言!