まず、ラウンドロビンスケジューリングアルゴリズムは、複数のタスクやプロセスを順番に処理するためのスケジューリング手法です。各タスクは一定の時間(タイムスライスまたはクォンタムと呼ばれます)だけ実行され、その後、次のタスクに切り替わります。この手法は、公平性と優先度の均等性を重視する場合に利用されます。
以下に、C++でのラウンドロビンスケジューリングアルゴリズムの実装例を示します。
#include <iostream>
#include <queue>
using namespace std;
// タスクの構造体
struct Task {
string name;
int burstTime;
};
// ラウンドロビンスケジューリング関数
void roundRobinScheduling(queue<Task>& taskQueue, int timeSlice) {
while (!taskQueue.empty()) {
Task currentTask = taskQueue.front();
taskQueue.pop();
// タスクの処理
cout << "実行中のタスク: " << currentTask.name << endl;
// タイムスライスを消費するか、タスクの実行完了までの時間の短い方を選択
int executionTime = min(timeSlice, currentTask.burstTime);
// タスクの残り実行時間を更新
currentTask.burstTime -= executionTime;
if (currentTask.burstTime > 0) {
// タスクがまだ完了していない場合は、再度キューに追加
taskQueue.push(currentTask);
}
// タスクの実行結果を出力
cout << "実行結果: " << currentTask.name << " (実行時間: " << executionTime << ")" << endl;
// タスクが完了した場合
if (currentTask.burstTime == 0) {
cout << "タスク " << currentTask.name << " の実行が完了しました。" << endl;
}
}
}
int main() {
// タスクキューの作成
queue<Task> taskQueue;
// タスクの追加
taskQueue.push({"タスク1", 10});
taskQueue.push({"タスク2", 5});
taskQueue.push({"タスク3", 8});
// タイムスライスの設定
int timeSlice = 4;
// ラウンドロビンスケジューリングの実行
roundRobinScheduling(taskQueue, timeSlice);
return 0;
}
この例では、Task
という構造体を定義し、name
とburstTime
というメンバ変数を持っています。name
はタスクの名前を表し、burstTime
はタスクの実行に必要な時間を表します。
roundRobinScheduling
関数では、与えられたタスクキューとタイムスライスを元に、ラウンドロビンスケジューリングを実行しています。各タスクの実行結果は出力され、タスクが完了した場合にはその旨が表示されます。
メイン関数では、タスクキューにいくつかのタスクを追加し、タイムスライスを設定しています。最後に、roundRobinScheduling
関数を呼び出してラウンドロビンスケジューリングを実行しています。
このコード例では、3つのタスクを順番に実行し、タイムスライスが4となっています。各タスクは実行時間が長い順に処理されます。タスクの実行結果や完了時のメッセージは、標準出力に表示されます。
以上が、C++でのラウンドロビンスケジューリングアルゴリズムの実装例です。このコードを参考にして、自分自身でさまざまな方法で実装してみることができます。