RoundRobin算法的简单实现
轮询调度算法,也就是设置一个桶的大小,规定每次的执行时间任务,然后执行下一个任务,若是任务小于桶的容量就可以将此任务执行完成,若是任务大小大于桶容量,则最多执行大小为桶容量的任务的一部分,剩下的部分下一次轮到自己再继续执行,以此类推,直到执行完所有任务。
代码如下:
package org.cloudbus.cloudsim.examples;
import java.util.*;
public class RoundRobin
{
static void findWaitingTime(int processes[], int n,
int bt[], float wt[], int quantum)
{
float rem_bt[] = new float[n];
for (int i = 0 ; i < n ; i++)
rem_bt[i] = bt[i];
float t = 0;
while(true)
{
boolean done = true;
for (int i = 0 ; i < n; i++)
{
if (rem_bt[i] > 0)
{
done = false;
if (rem_bt[i] > quantum)
{
t += quantum;
rem_bt[i] -= quantum;
}
else
{
t = t + rem_bt[i];
wt[i] = t - bt[i];
rem_bt[i] = 0;
}
}
}
if (done == true)
break;
}
}
static float findavgTime(int processes[], int n, int bt[],
int quantum)
{
System.out.println("Let's calculate the average waiting time using process_scheduling_algorithm.RoundRobin algorithm");
float wt[] = new float[n], tat[] = new float[n];
float total_wt = 0, total_tat = 0;
findWaitingTime(processes, n, bt, wt, quantum);
for (int i=0; i<n; i++)
{
total_wt = total_wt + wt[i];
total_tat = total_tat + tat[i];
}
float k = total_wt/n;
System.out.println(total_wt+total_tat);
return k;
}
}
结果展示:
任务数组:bt[0]=84; bt[1]=68; bt[2]=2; bt[3]=31
桶的容量:quantum=50
第一轮:rm_bt[0]=34 第二轮:t=133+34=167 wt[0]=167-84=83
rm_bt[1]=18 t=167+18=185 wt[1]=185-68=117
rm_bt[2]=0 wt[2]=50+50=100 t=185 wt[2]=100
rm_bt[3]=0 wt[3]=50+50+2=102 t=185 wt[3]=102
t=50+50+2+31=133
total_wt=83+117+100+102=402
avg_wt=402/4=100.5