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

9. СемафорныепримитивыДейкстры. Решение задачи производителя и потребителя с помощью семафоров.

Семафор – неотрицательная целочисленная переменная, разделяемая несколькими синхронизируемыми процессами, для изменения кот.определено 2 примитива: P(s) и V(s).

P(s) (с дат. probieren) – проверяет, если s=0, то процесс блокируется, после этого s уменьшается (s--)

V(s) (сдат. verfrogen) – 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.

10. Монитор Хоара как примитив синхронизации высокого уровня. Решение задачи производителя и потребителя с помощью мониторов.

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

monitor M{

void get(){

…}

void put(){

} }

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

Преимущества:

  • Программисту не нужно явно определять критические секции, отслеживать использование семафоров или алгоритмов синхронизации, вместо этого достаточно определить критические участки методами монитора

  • Монитор предоставляет возможность объявления переменных состояния, над которыми доступны два примитива wait и signal. Примитив wait произведенный над переменной состояния заставляет вызвавший процесс перейти в состояние ожидания на данной переменной. Из состояния ожидания процесс может выйти только получив на этой же переменной сигнал примитива signal, который вызван другим процессом

monitor M {

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

потребитель

… {

m.empty.wait

m.put()

full.signal

}

… {

m.full.wait

m.get()

empty.signal

}

state full;

state empty;

voidget() {

}

voidput() {

} }

Методы монитора могут использовать в своем коде только свои аргументы и переменные, определенные внутри монитора и недоступные снаружи.

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

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

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