Демистификация циклического планирования в C: практическое руководство для начинающих

В мире компьютерного программирования алгоритмы планирования играют решающую роль в управлении системными ресурсами и обеспечении справедливого выполнения задач. Одним из таких алгоритмов является Round Robin, популярный метод планирования процессов в операционной системе. В этой статье блога мы углубимся в концепции циклического планирования и рассмотрим различные методы реализации на языке программирования C. Итак, хватайте чашечку кофе и начнем!

Что такое циклическое планирование.
Радиальное планирование — это упреждающий алгоритм, который назначает фиксированный интервал времени, известный как квант времени, каждому процессу в системе. Операционная система переключается между процессами циклическим образом, предоставляя каждому процессу равные возможности для выполнения в течение определенного периода времени. Это обеспечивает справедливость и предотвращает загрузку процессора каким-либо отдельным процессом в течение длительного периода времени.

Метод 1. Использование массивов для реализации циклического перебора.
Простой подход к реализации циклического планирования в C заключается в использовании массивов для представления процессов и их соответствующего времени пакетной обработки. Вот фрагмент кода, иллюстрирующий этот метод:

#include <stdio.h>
#define MAX_PROCESSES 10
#define TIME_QUANTUM 2
int main() {
    int processes[MAX_PROCESSES];
    int burst_times[MAX_PROCESSES];
    int n, i;
    // Read the number of processes and their burst times
    printf("Enter the number of processes: ");
    scanf("%d", &n);
    printf("Enter burst times for each process:\n");
    for (i = 0; i < n; i++) {
        printf("Process %d: ", i + 1);
        scanf("%d", &burst_times[i]);
        processes[i] = i + 1;
    }
// Implement Round Robin scheduling
    printf("Process execution order:\n");
    while (1) {
        int done = 1;
        for (i = 0; i < n; i++) {
            if (burst_times[i] > 0) {
                printf("Process %d executed.\n", processes[i]);
                burst_times[i] -= TIME_QUANTUM;
                if (burst_times[i] > 0) {
                    done = 0;
                }
            }
        }
        if (done) {
            break;
        }
    }
    return 0;
}

Метод 2. Реализация циклического перебора со связанным списком.
Другой подход к реализации циклического перебора — использование структуры данных связанного списка для ведения списка процессов. Этот метод позволяет динамически вставлять и удалять процессы во время выполнения. Вот пример фрагмента кода:

#include <stdio.h>
#include <stdlib.h>
#define TIME_QUANTUM 2
struct Process {
    int id;
    int burst_time;
    struct Process* next;
};
void enqueue(struct Process head, struct Process tail, int id, int burst_time) {
    struct Process* new_process = (struct Process*)malloc(sizeof(struct Process));
    new_process->id = id;
    new_process->burst_time = burst_time;
    new_process->next = NULL;
    if (*head == NULL) {
        *head = *tail = new_process;
    } else {
        (*tail)->next = new_process;
        *tail = new_process;
    }
}
void dequeue(struct Process head) {
    if (*head == NULL) {
        return;
    }
    struct Process* temp = *head;
    *head = (*head)->next;
    free(temp);
}
int main() {
    struct Process* head = NULL;
    struct Process* tail = NULL;
    // Enqueue processes
    enqueue(&head, &tail, 1, 5);
    enqueue(&head, &tail, 2, 3);
    enqueue(&head, &tail, 3, 4);
    // Implement Round Robin scheduling
    printf("Process execution order:\n");
    while (head != NULL) {
        printf("Process %d executed.\n", head->id);
        head->burst_time -= TIME_QUANTUM;
        if (head->burst_time > 0) {
            enqueue(&head, &tail, head->id, head->burst_time);
        }
        dequeue(&head);
    }
    return 0;
}