В мире компьютерного программирования алгоритмы планирования играют решающую роль в управлении системными ресурсами и обеспечении справедливого выполнения задач. Одним из таких алгоритмов является 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;
}