このテーブルを考えると:
これらはタイムラインです(タイムスライス= 4):
|p1|p1|p2|p3|p4|p5|p1|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p4|p5|p2|p3|p3|
0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 69 72 75 79 80
平均待ち時間を計算する簡単な方法はありますか?
ありがとう
注:各プロセスには複数の終了時間が存在することを示しています!
注2:この質問には、副次的な演習としての優先順位アルゴリズムも含まれています。ラウンドロビンアルゴリズムの優先順位列は無視してください。
最初に、すべてのプロセスが時刻0に到着するこの問題の単純なバージョンを解決してみましょう。実行時間がn
であるei
プロセスがあるとします。タイムスライスをs
とします。各プロセスに必要なタイムスライスの数をNSPi
とします。これでNSPi = ceiling(ei/s)
ができました。プロセスに必要な時間i = _NSPi * s
_。スケジュールの長さ= sum over i from 1 to n (NSPi)
。プロセスiの待機時間= _finish time of i - execution time of i
_。ただし、各プロセスの実行時間は異なるため、各プロセスの終了時間の計算は複雑です。ただし、特定のインスタンスのRRアルゴリズムの平均待機時間が必要なだけなので、_(Length of the schedule - sum of execution time of all processes)/num of processes
_として計算できます。
今では、この式がどのように進化したかがわかると思います。理想的には、スケジュールの長さがすべてのプロセスの実行時間の合計に等しくなるようにする必要があります。ただし、すべての実行時間がタイムスライスの要素であるとは限りません。したがって、いくつかのタイムスライスで、プロセスがスケジュールされていない穴ができます。したがって、実際には、スケジュールの長さは実行時間の合計よりも長くなります。今、私たちは合計待ち時間としてそれらの違いを持っています。
_Gantt chart
_を描画して待機時間を計算できるため、i番目のプロセスの待機時間はCompletion time - (Arrival time + Burst time )
と等しくなります。
RRの場合、待機時間=最終開始時間-到着時間-(プリエンプション*クォンタム)
P1の最後の開始時刻は24です(ガントチャートでP1が3回実行されている場合)P1は、その存続期間中に2回プリエンプトされました。
P1のWaitingTime = 24-0-(2 * 4)= 16 :)
| H | I | J | K | L | H | J | K | L | J | K | L | J | L | L |その長すぎる、あなたの答えは簡単です:0 4 8 12 16 20 24 28 32 36 40 44 48 52 56 60平均待ち時間=((H-到着時間)+(I-到着時間)+(J-到着時間)+(K-到着時間)+(L-到着時間))/ 5 =(24-0)+(8-5)+(52-8)+(44-11)+(60-15)/ 5 = 29.8ミリ秒これは長すぎます。つまり、あなたの答えは次のとおりです。ここに、RRスケジューリングアルゴリズムプロセスのガントチャートプロセス[バースト時間、タイムクォンタム、到着時間] H [8、4、0] I [4、4、 5] J [16、4、8] k [12、4、11] L [20、定数= 4、15]
私はそれをJavaで実装しようとしました:
public static float waitingTimieRobin(int[] arrival, int[] run, int q) {
Queue<Integer> orderQueue = new LinkedList<>();
orderQueue.add(0);
Set<Integer> orderSet = new HashSet<>();
orderSet.add(0);
float sumTime = 0.0f;
int curTime = 0;
while (!isOver(run)) {
int order = orderQueue.poll();
orderSet.remove(order);
int arrTime = arrival[order];
int runtime = run[order];
sumTime += (curTime - arrTime);
if (runtime <= q) {
curTime += runtime;
run[order] = 0;
} else {
curTime += q;
arrival[order] = curTime;
run[order] = runtime - q;
}
for (int i = 0; i < run.length; i++) {
if (arrival[i] > curTime) {
break;
} else if (i != order && run[i] != 0 && !orderSet.contains(i)) {
orderQueue.add(i);
orderSet.add(i);
}
}
if(arrival[order] == curTime && run[order] != 0 && !orderSet.contains(order)) {
orderQueue.add(order);
orderSet.add(order);
}
}
return sumTime / arrival.length;
}
public static boolean isOver(int[] run) {
for (int runtime : run) {
if (runtime > 0) {
return false;
}
}
return true;
}