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

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

Sharedintready [2]={0,0};

While (true) {

Ready[id]=1;

While (ready[1-id]);

Criticalsect.

Ready[id]=0;

Remaindersect.

}

Разделяемая переменная для каждого процесса указывает, собирается ли этот процесс устанавливать свой флаг готовности, после чего ждёт обнуления флага готовности другого процесса, предполагая, что если тот равен 1, то другой процесс в критической секции. Выйдя из критической секции процесс обнуляет свой флаг готовности, позволяя войти в критическую секцию другому процессу.

Недостатки: условие ограниченного ожидания не выполняется, когда оба процесса из-за неатомарности пролога устанавливают в 1 свои флаги готовности, после чего оба в цикле ожидают обнуление флага готовности другого процесса. Это может произойти только в эпилоге, а поскольку не один из процессов не может войти в критическую секцию, то это не произойдёт никогда.

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

Sharedintready [2]={0,0};

Sharedintturn=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 в свой идентификатор. Первое условие означает, что другой процесс вышел из критической секции, второе – что он только начал выполнение пролога. В обоих случаях критическая секция свободна. Условия взаимоисключения, прогресса и ограниченного ожидания выполняются.

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

Алгоритм булочной (для i-го процесса) имеет вид:

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)

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

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

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

  • Команда Test-and-Set осуществляет проверку значения логической переменной с одновременной установкой ее значения в 1

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

int TSL (int *target) {

inttmp=*target;

*target=1;

returntmp;

}

sharedint lock=0;

while (true){

while (TSL(lock));

critical sect.

lock=0;

remainder sect.

}

Ф-яTSL возвращает значение переменной, причём устанавливает её одновременно в 1. В прологе процесс ожидает обнуления замка, но благодаря ф-иTSL это обнуление увидит только один процесс, поскольку сразу после выполнения TSL замок становится равным 1.

  • Команда Swap (обменять значения) - обменивает два значения, находящихся в памяти:

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

inttmp = *a;

*a = *b;

*b = tmp;

}

Вводится дополнительная логическая переменная key, локальная для каждого процесса:

sharedint lock = 0;

int key;

while (some condition) {

key = 1;

do Swap(&lock,&key);

while (key);

critical section

lock = 0;

remainder section

}

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