ラウンドロビンスケジューリングアルゴリズムをシミュレートする
JavaScriptでラウンドロビンスケジューリングアルゴリズムをシミュレートする例を示します。この例では、タスク(またはプロセス)の簡単なセットと、それらのタスクを順番に処理するためのタイムクォンタム(時間割り当て)を使用します。
各タスクは、実行に必要な合計時間を持っており、ラウンドロビンアルゴリズムは各タスクに一定の時間(タイムクォンタム)を割り当て、順番に実行します。
// タスクのセットを表す配列。各タスクはIDと必要な実行時間(duration)を持つ
const tasks = [
{ id: "Task 1", duration: 5 },
{ id: "Task 2", duration: 3 },
{ id: "Task 3", duration: 8 },
{ id: "Task 4", duration: 6 }
];
// タイムクォンタム(各タスクに割り当てられる時間)
const timeQuantum = 2;
// ラウンドロビンスケジューリングをシミュレートする関数
function roundRobinScheduling(tasks, timeQuantum) {
// 各タスクの残り実行時間を追跡する配列
let remainingDurations = tasks.map(task => task.duration);
let currentTime = 0; // 現在の時間
// すべてのタスクが完了するまでループ
while (remainingDurations.some(duration => duration > 0)) {
tasks.forEach((task, index) => {
if (remainingDurations[index] > 0) {
// 実行時間とタイムクォンタムの小さい方を選択
let timeSpent = Math.min(remainingDurations[index], timeQuantum);
remainingDurations[index] -= timeSpent;
currentTime += timeSpent;
console.log(`${task.id} executed for ${timeSpent} unit(s). Remaining: ${remainingDurations[index]} unit(s). Current time: ${currentTime}`);
}
});
}
console.log("All tasks have been completed.");
}
// ラウンドロビンスケジューリングの実行
roundRobinScheduling(tasks, timeQuantum);
タスクの定義
const tasks = [
{ id: "Task 1", duration: 5 },
{ id: "Task 2", duration: 3 },
{ id: "Task 3", duration: 8 },
{ id: "Task 4", duration: 6 }
];
ここでは、4つのタスクを定義しています。各タスクにはユニークなIDと、そのタスクが完了するのに必要な実行時間(duration
)が設定されています。
タイムクォンタムの設定
const timeQuantum = 2;
タイムクォンタムは、各タスクに一度に割り当てることができる最大時間です。この例では、2ユニットの時間が各タスクに割り当てられます。
スケジューリング関数
function roundRobinScheduling(tasks, timeQuantum) {
let remainingDurations = tasks.map(task => task.duration);
let currentTime = 0;
while (remainingDurations.some(duration => duration > 0)) {
tasks.forEach((task, index) => {
if (remainingDurations[index] > 0) {
let timeSpent = Math.min(remainingDurations[index], timeQuantum);
remainingDurations[index] -= timeSpent;
currentTime += timeSpent;
console.log(`${task.id} executed for ${timeSpent} unit(s). Remaining: ${remainingDurations[index]} unit(s). Current time: ${currentTime}`);
}
});
}
console.log("All tasks have been completed.");
}
この関数は、すべてのタスクが完了するまで実行されます。主な処理は次の通りです。
- タスクの残り実行時間の初期化:
remainingDurations
配列は、各タスクの残り実行時間を保持します。
- 実行ループ:
while
ループは、すべてのタスクが完了する(すなわち、remainingDurations
の全要素が0になる)まで続きます。forEach
ループを使用して、各タスクに対して次の処理を行います。
- タスクの実行:
- タスクがまだ完了していない(残り時間が0より大きい)場合、タイムクォンタムと残り時間のうち小さい方の値をそのタスクの実行時間として使用します。
- タスクの残り実行時間を更新し、
currentTime
(現在の合計実行時間)に実行時間を加算します。
- 結果の出力:
- 各タスクの実行状況(実行時間、残り時間、現在の合計時間)をログに出力します。
- すべてのタスクが完了したら、終了メッセージを出力します。
このコードにより、ラウンドロビンアルゴリズムの基本原則—すべてのタスクに公平に時間が割り当てられること—が実現されます。
まとめ
このコードは、各タスクをタイムクォンタムに基づいて順番に実行し、各タスクが完了するまでこのプロセスを繰り返します。実行結果は、タスクが実行される順序と各タスクに割り当てられた時間、現在の合計時間をコンソールに表示します。
このシンプルな例を通じて、JavaScriptで基本的なラウンドロビンスケジューリングの概念をシミュレートする方法を理解できます。