Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры СПО 2 аттестация.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
77.44 Кб
Скачать

10. Способы реализации взаимного исключения: флаги готовности

shared int ready[] = {0, 0}

while (true) {

ready[id] = 1;

while(ready[1-id])

critical section

ready[id] = 0;

remainder section }

Алгоритм подразумевает, что процессы должны сообщать о том, что им необходимо войти в критическую секцию. Процессы разделяют массив флагов, которые равны 0 если процессу не надо войти в критическую секцию, и 1 если надо. В прологе процесс устанавливает свой флаг готовности и в бесконечном цикле проверяет флаг готовности другого процесса. Если тот установлен, то это значит что другой процесс в критической секции, поэтому продолжается цикл проверки. В эпилоге процесс сбрасывает свой флаг готовности. Алгоритм нарушает условие ограниченного ожидания из-за неатомарности пролога. Поскольку одновременно 2 процесса могут подойти к прологу, оба выполнить установку своего флага и оба бесконечно долго ждать пока не будет сброшен флаг другого процесса. А он сброшен не будет, потому что ни один процесс не выйдет из цикла в критическую секцию и не выполнит эпилог.

11. Способы реализации взаимного исключения: алгоритм Петерсона и алгоритм булочной. Алгоритм Петерсона

Shared int ready [2] = {0,0};

Shared int turn = 0;

While (true) {

ready[id] = 1;

turn = 1 - turn;

While (ready[1-id] && turn == 1-id);

Critical sect.

Ready[id]=0;

Remainder sect }

В прологе процесс устанавливает свой флаг готовности, затем устанавливает turn, равный идентификатору другого процесса, тем самым предлагая ему войти в критическую секцию. После этого процесс ожидает обнуление флага готовности другого процесса или установки переменной turn в свой идентификатор. Первое условие означает, что другой процесс вышел из критической секции, второе – что он только начал выполнение пролога. В обоих случаях критическая секция свободна. Условия взаимоисключения, прогресса и ограниченного ожидания выполняются.

Алгоритм булочной

do {

do {

choosing[i] = true;

number [i] = max (number[0], number[1], …, number[n-1]) + 1;

while (flag[j] and turn == j);

choosing[i] = false;

for (j = 0; j < n; j++) {

while choosing[j];

while ((number[j] != 0) && (number[j] < number[j]));

}

Critical sect.

number [i] = 0;

Remainder sect.

} while (1)

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

12. Аппаратная реализация взаимоисключений.

Наличие аппаратной поддержки взаимоисключений позволяет упростить алгоритмы и повысить их эффективность. Многие вычислительные системы имеют специальные команды процессора, которые позволяют проверить и изменить значение машинного слова или поменять местами значения двух машинных слов в памяти, выполняя эти действия как атомарные операции. Концепции таких команд могут использоваться для реализации взаимоисключений.

  1. алгоритм TSL (Test-and-Set-Lock)

int TSL (int *target) {

int tmp = *target;

*target=1;

return tmp;

}

sharedint lock = 0;

while (true){

while (TSL(lock));

critical sect.

lock=0;

remainder section }

Команда Test-and-Set осуществляет проверку значения логической переменной с одновременной установкой ее значения в 1. Благодаря этому в прологе несколько процессов не смогут одновременно выйти из цикла по значению переменной lock = 0, а значит взаимоисключение будет обеспечено.

  1. Swap.

void Swap (int *a, int *b){

inttmp = *a;

*a = *b;

*b = tmp;

}

shared int lock = 0;

int key = 0;

while(true) {

key = 1;

do Swap (&lock, &key);

while(key)

critical section

lock = 0;

remainder section }

На ряду с разделяемой переменной lock, вводится неразделяемая переменная key и используется команда swap для атомарного обмена значениями двух переменных. В прологе процесс устанавливает ключ в 1, и в цикле меняет местами значение ключа и замка до тех пор, пока ключ не обнулится. Ключ может стать равным 0 только в результате обмена с нулевым замком, что значит что вход в критическую секцию свободен. При этом, два процесса одновременно выйти из цикла не смогут. поскольку только один в локальной переменной ключ получит 0, установив в замок 1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]