Учебная версия на русском. Код и его вывод сохранены в исходном виде.
Планирование Round Robin на C
Моделируйте очередность работы процессора с квантом времени и вычисляйте ожидание.

Round Robin даёт каждому готовому процессу не более одного кванта. Незавершённый процесс возвращается в конец очереди с оставшимся временем. Квант должен быть положительным, иначе симуляция не продвинется.
В каждом ходе выполняйте минимум из кванта и оставшейся длительности. Запишите время завершения. Время оборота равно завершению минус прибытие; ожидание — обороту минус процессорное время при принятых предположениях модели.
Проверьте, предполагается ли прибытие всех процессов в момент ноль. Для разных времён прибытия нужно учитывать очередь готовых и простои. Учебная модель может не учитывать реальную стоимость переключения контекста.
Код C
#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;
}Открыть в компилятореОжидаемый вывод
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
Частые вопросы
Почему код и вывод остаются на английском?
Ключевые слова, идентификаторы и строки, проверяемые тестами, сохранены, чтобы не менять программу. Объяснения и элементы управления переведены.