Online C Compiler
Im Compiler öffnen

Deutsche Lernausgabe

Round-Robin-Scheduling in C

Simulieren Sie CPU-Zeitscheiben und berechnen Sie Wartezeiten.

Im Compiler öffnen

Round-Robin-Scheduling in C
Simulieren Sie CPU-Zeitscheiben und berechnen Sie Wartezeiten.

Round Robin gibt jedem bereiten Prozess höchstens eine Zeitscheibe. Wird er nicht fertig, kommt er mit der Restlaufzeit ans Ende der Warteschlange. Die Zeitscheibe muss positiv sein, damit die Simulation fortschreitet.

Führen Sie in jeder Runde das Minimum aus Zeitscheibe und Restlaufzeit aus. Notieren Sie die Fertigstellung. Die Durchlaufzeit ist Fertigstellung minus Ankunft; Wartezeit ist Durchlaufzeit minus CPU-Zeit unter den Modellannahmen.

Prüfen Sie, ob das Beispiel alle Ankünfte bei null voraussetzt. Andernfalls müssen Bereitschaftswarteschlange und Leerlauf behandelt werden. Das Lehrmodell kann reale Kontextwechselkosten auslassen.

Quellcode

#include <stdio.h>
#include <stdbool.h>

struct Process {
    int id;
    int burst_time;
    int remaining_time;
    int waiting_time;
    int turnaround_time;
};

void calculate_round_robin(struct Process p[], int n, int quantum) {
    int current_time = 0;
    bool done;

    for (int i = 0; i < n; i++) {
        p[i].remaining_time = p[i].burst_time;
    }

    do {
        done = true;
        for (int i = 0; i < n; i++) {
            if (p[i].remaining_time > 0) {
                done = false;

                if (p[i].remaining_time > quantum) {
                    current_time += quantum;
                    p[i].remaining_time -= quantum;
                } else {
                    current_time += p[i].remaining_time;
                    p[i].waiting_time = current_time - p[i].burst_time;
                    p[i].remaining_time = 0;
                }
            }
        }
    } while (!done);

    for (int i = 0; i < n; i++) {
        p[i].turnaround_time = p[i].burst_time + p[i].waiting_time;
    }
}

int main(void) {
    struct Process proc[] = {
        {1, 10, 0, 0, 0},
        {2, 5,  0, 0, 0},
        {3, 8,  0, 0, 0}
    };
    int n = sizeof(proc) / sizeof(proc[0]);
    int time_quantum = 2;

    calculate_round_robin(proc, n, time_quantum);

    printf("PID\tBurst\tWaiting\tTurnaround\n");
    float total_wt = 0, total_tat = 0;
    for (int i = 0; i < n; i++) {
        total_wt += proc[i].waiting_time;
        total_tat += proc[i].turnaround_time;
        printf("P%d\t%d\t%d\t%d\n", proc[i].id, proc[i].burst_time, proc[i].waiting_time, proc[i].turnaround_time);
    }

    printf("\nAverage Waiting Time = %.2f\n", total_wt / n);
    printf("Average Turnaround Time = %.2f\n", total_tat / n);
    return 0;
}
Im Compiler öffnen

Erwartetes Ergebnis

PID	Burst	Waiting	Turnaround
P1	10	13	23
P2	5	10	15
P3	8	13	21

Average Waiting Time = 12.00
Average Turnaround Time = 19.67

Häufige Fragen

Warum bleiben Code und manche Ausgaben englisch?

C-Schlüsselwörter, Bezeichner, Programmkommentare und erwartete Ausgaben bleiben wie im Original, damit der Code ausführbar und die Tests konsistent bleiben. Erklärungen und Aufgabenstellungen sind übersetzt.