Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700363.doc
Скачиваний:
16
Добавлен:
01.05.2022
Размер:
3.69 Mб
Скачать

Алгоритм Деккера

Впервые действительно надежный алгоритм взаимоисключения с активным циклом ожидания был предложен Деккером.

// подготовка – любой процесс // может войти в критическую секцию extern bool flag_1 = false, flag_2 = false; extern int num = 1; // при возникновении // конфликтов, процесс 1 // будет иметь преимущество

// процесс 1 // намерение // процесса 1 войти в // критическую секцию flag_1 = true; // цикл ожидания while(flag_2) { // если преимущество // у процесса 2 – // даем ему работать if(num == 2) { flag_1 = false; while(num == 2); flag_1 = true; } } // код // критической секции // передаем преимущество // процессу 2 num = 2; // освобождение // критической секции flag_1 = false;

// процесс 2 // намерение // процесса 2 войти в // критическую секцию flag_2 = true; // цикл ожидания while(flag_1) { // если преимущество // у процесса 1 – // даем ему работать if(num == 1) { flag_2 = false; while(num == 1); flag_2 = true; } } // код // критической секции // передаем преимущество // процессу 1 num = 1; // освобождение критической секции flag_2 = false;

Этот алгоритм полностью решает проблему взаимоисключения для двух процессов, причем без использования каких-либо специальных машинных команд.

В отличие от алгоритма 5, алгоритм Деккера при возникновении взаимного ожидания, разрешает конфликт не за счет случайных проб доступа, а за счет предоставления преимущества заранее оговоренному процессу (процессу номер num). Это гарантирует быстрое разрешение конфликта без повторных коллизий, возможных в алгоритме 5.

Алгоритм Петерсона

Алгоритм Деккера решает задачу взаимоисключений, однако он излишне сложен и включает вложенные циклы ожиданий. Алгоритм Петерсона также решает проблему взаимоисключений и реализует туже самую идею, что и алгоритм Деккера, но при этом он существенно проще в реализации.

// подготовка – любой процесс // может войти в критическую секцию extern bool flag_1 = false, flag_2 = false; extern int num; // используется для // разрешения конфликтов

// процесс 1 // намерение // процесса 1 войти в // критическую секцию flag_1 = true; // если будет конфликт, // то преимущество // уступаем процессу 2 num = 2; // ожидание while(flag_2 && num == 2); // код // критической секции // освобождение // критической секции flag_1 = false;

// процесс 2 // намерение // процесса 2 войти в // критическую секцию flag_2 = true; // если будет конфликт, // то преимущество // уступаем процессу 1 num = 1; // ожидание while(flag_1 && num == 1); // код // критической секции // освобождение // критической секции flag_2 = false;