Разберем сегодня алгоритм Петерсона. Посвящается всем начинающим, продолжающим,
прогулявшим пары по операционным системам и тем, до кого не дошло сразу. Алгоритм
Петерсона позволяет добиться взаимного исключения двух процессов. Рассмотрим 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 процессов. Ну а в целом, времени особо не было писать, думаю скоро продолжу.
Отправить комментарий