Разберем сегодня алгоритм Петерсона. Посвящается всем начинающим, продолжающим,
прогулявшим пары по операционным системам и тем, до кого не дошло сразу. Алгоритм
Петерсона позволяет добиться взаимного исключения двух процессов. Рассмотрим 3 варианта поведения двух процессов при возникновении прерываний в трех различных точках. Также в каждом из рассмотренных случаев будем допускать прерывание при первом входе в критическую секциию одного из процессов
#define FALSE 0 #define TRUE 1 #define N 2 // количество процессов int turn; // чья очередь int interested[N]; // изначально значения равны 0 void enter_region(int process) // номер процесса - 0 или 1 { int other; other = 1 - process; // точка 1 interested[process] = TRUE; // точка 2 (заинтересованный процесс) turn = process; // точка 3 while(turn == process && interested[other] == TRUE); // активное ожидание } void leave_region(int process) // номер процесса - 0 или 1 { interested[process] = 0; // признак выхода из критической секции }Итак, turn и interested[] являются глобальными переменными, прочие
переменные - локальные.
Случай 1: переключение процессов возникло в точке 1
Процесс 0 | Процесс 1 |
other = 1 | |
Прерывание процесса 0, переключение на процесс 1 | |
other = 0, interested[1] = TRUE, turn = 1 | |
Проверка условий turn == 1 (true) и interested[0] == TRUE (false) | |
Вход в критическую секцию | |
Прерывание процесса 1, переключение на процесс 0 | |
interested[0] = TRUE, turn = 0 | |
Проверка условий turn == 0 (true) и interested[1] == TRUE (true) | |
Вход в бесконечный цикл, переключение на процесс 1 | |
Процесс 1 выходит из критической секции и устанавливает interested[1] = FALSE | |
Прерывание процесса 1, переключение на процесс 0 | |
Проверка условий turn == 0 (true) и interested[1] == TRUE (false) | |
Вход в критическую секцию |
Случай 2: переключение процессов возникло в точке 2
Процесс 0 | Процесс 1 |
other = 1, interested[0] = TRUE | |
Прерывание процесса 0, переключение на процесс 1 | |
other = 0, interested[1] = 1, turn = 1 | |
Проверка условий turn == 1 (true) и interested[0] == TRUE (true) | |
Вход в бесконечный цикл, переключение на процесс 0 | |
turn = 0 | |
Проверка условий turn == 0 (true) и interested[1] == 1 (true) | |
Вход в бесконечный цикл, преключение на процесс 1 | |
Проверка условий turn == 1 (false) и interested[0] == 1 (true) | |
Вход в критическую секцию | |
Прерывание процесса 1, переключение на процесс 0 | |
Проверка условий turn == 0 (true) и interested[1] == 1 (true) | |
Вход в бесконечный цикл, преключение на процесс 1 | |
Процесс 1 выходит из критической секции и устанавливает interested[1] = FALSE | |
Прерывание процесса 1, переключение на процесс 0 | |
Проверка условий turn == 0 (true) и interested[1] == 1 (false) | |
Вход в критическую секцию |
Случай 3: переключение процессов возникло в точке 3
Процесс 0 | Процесс 1 |
other = 1, interested[0] = TRUE, turn = 0 | |
Прерывание процесса 0, переключение на процесс | |
other = 0, interested[1] = TRUE, turn = 1 | |
Проверка условий turn == 1 (true) и interested[0] == TRUE (true) | |
Вход в бесконечный цикл, преключение на процесс 0 | |
Проверка условий turn == 0 (false) и interested[1] == TRUE (true) | |
Вход в критическую секцию | |
Прерывание процесса 0, переключение на процесс | |
Проверка условий turn == 1 (true) and interested[0] == TRUE (true) | |
Вход в бесконечный цикл, преключение на процесс 0 | |
Процесс 0 выходит из критической секции и устанавливает interested[0] = FALSE | |
Прерывание процесса 0, переключение на процесс | |
Проверка условий turn == 1 (true) и interested[0] == TRUE (false) | |
Вход в критическую секцию |
Продолжение следует...
2 комментария :
Очень познавательно! А продолжение есть?
Есть, вторая часть для N процессов. Ну а в целом, времени особо не было писать, думаю скоро продолжу.
Отправить комментарий