ラウンドロビンスケジューリングアルゴリズムの実装方法


まず、ラウンドロビンスケジューリングアルゴリズムは、複数のタスクやプロセスを順番に処理するためのスケジューリング手法です。各タスクは一定の時間(タイムスライスまたはクォンタムと呼ばれます)だけ実行され、その後、次のタスクに切り替わります。この手法は、公平性と優先度の均等性を重視する場合に利用されます。

以下に、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という構造体を定義し、nameburstTimeというメンバ変数を持っています。nameはタスクの名前を表し、burstTimeはタスクの実行に必要な時間を表します。

roundRobinScheduling関数では、与えられたタスクキューとタイムスライスを元に、ラウンドロビンスケジューリングを実行しています。各タスクの実行結果は出力され、タスクが完了した場合にはその旨が表示されます。

メイン関数では、タスクキューにいくつかのタスクを追加し、タイムスライスを設定しています。最後に、roundRobinScheduling関数を呼び出してラウンドロビンスケジューリングを実行しています。

このコード例では、3つのタスクを順番に実行し、タイムスライスが4となっています。各タスクは実行時間が長い順に処理されます。タスクの実行結果や完了時のメッセージは、標準出力に表示されます。

以上が、C++でのラウンドロビンスケジューリングアルゴリズムの実装例です。このコードを参考にして、自分自身でさまざまな方法で実装してみることができます。