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

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

Алгоритм булочной (для 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)

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

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

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

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

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

int TSL (int *target) {

int tmp=*target;

*target=1;

return tmp;

}

shared int 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){

int tmp = *a;

*a = *b;

*b = tmp; }

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

shared int lock = 0;

int key;

while (some condition) {

key = 1;

do Swap(&lock,&key);

while (key);

critical section

lock = 0;

remainder section }

35. Семафорные примитивы Дейкстры. Решение задачи производителя и потребителя с помощью семафоров. Семафор – неотрицательная целочисленная переменная, разделяемая несколькими синхронизируемыми процессами для изменения которой определено 2 примитива: P(S) и V(S). P(S) – проверяет, если s=0, то процесс блокируется, после этого S уменьшается (s--). V(S) – S++. P(S) – блокирует процесс, если семафор =0. Процесс находится в состоянии блокировки до тех пор, пока семафор не увеличиться. Ненулевой семафор уменьшается на 1. V(S) – увеличивает семафор на 1. +: отсутствие бесполезных циклов ожидания выполнения какого-либо условия. Процесс блокируется и не занимает процессорное время, разблокируясь только когда семафор становиться ненулевым. Решение задачи производителя-потребителя с помощью семафора. Имеется несколько процессов производителя информации и несколько процессов потребителей. Производитель размещает данные в буфере величины n, потребитель их оттуда забирает. Требуется обеспечить бесперебойную работу системы производитель-потребитель, учитывая следующие ограничения:

  1. Производитель не может писать переполненный буфер.

  2. Потребитель не может читать из пустого буфера.

  3. Никакие 2 процесса не могут одновременно обращаться к буферу.

Производитель

Потребитель

Shared semaphore mutex=1

Shared semaphore full=0

Shared semaphore empty=n

while (true){

produce

p(empty)

p(mutex)

write

v(mutex)

v(full)

}

Shared semaphore mutex=1

Shared semaphore full=0

Shared semaphore empty=n

while (true){

p(full)

p(mutex)

read

v(mutex)

v(empty)

use

}

Мьютекс – двоичный семафор, обычно используется для обеспечения синхронизации доступа к критическим ресурсам, при этом ресурс свободен, то mutex=1, если ресурс занят, то mutex=0.

36. Монитор Хоара как примитив синхронизации высокого уровня. Решение задачи производителя и потребителя с помощью мониторов. Мониторы – механизм синхронизации, представляемый языками высокого уровня. Представляет собой класс, определенные в котором методы могут вызываться одновременно только в 1 процессе, тем самым реализуется взаимоисключения. Внутри монитора в данный момент может находиться только й процесс.

monitor M{

void get(){

}

void put(){

}

}

Компилятор ЯВУ дополняет вызовы методов монитора прологом и эпилогом, формируя тем самым критическую секцию обычно для этого используя семафоры.

Преимущества монитора: 1) программисту не нужно явно определять критическую секцию, отслеживать использование семафоров или алгоритмов синхронизации. Вместо этого достаточно определить критические участки кода методами монитора. 2) монитор представляет возможность объявления переменных состояния, над которыми доступны 2 примитива; wait и signal. Примитив wait произведенный над переменной состояния, заставляет вызвавший процесс перейти в состояние ожидания на данной переменной. Из данного состояния процесс может выйти только получив на этой же переменной signal, который вызван другим процессом - примитивом signal.

Решение задачи производителя-потребителя с помощью монитора. Имеется несколько процессов производителя информации и несколько процессов потребителей. Производитель размещает данные в буфере величины n, потребитель их оттуда забирает. Требуется обеспечить бесперебойную работу системы производитель-потребитель, учитывая следующие ограничения:

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