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

Вопрос 10. Понятие семафора, семафорные примитивы. Примеры объектов диспетчеризации в ms Windows, которые могут использоваться как «семафоры».

Семафор - это защищенная переменная, значение которой можно опрашивать и менять только при помощи специальных операций (семафорных примитивов) P и V и операции инициализации.

Двоичные (бинарные) семафоры -только значения 0 или 1 ( закрыт и открыт)

Считающие семафоры (семафоры со счетчиками) - целые значения. Считающий семафор открыт, если значение счетчика больше 0.

Примитив P - процедура, сбрасывающая или уменьшающая значение семафора на 1, эта процедура заключает в себе потенциальное ожидание вызывающих процессов в том случае, если к моменту выполнения этой процедуры процессом соответствующий семафор закрыт. Если s > 0 то s:=s-1 иначе (ожидать на s).Процедура V отрывает семафор или увеличивает значение счетчика на 1. Таким образом, вызов этой процедуры может активизировать некоторый ожидающий открытия семафора процесс. если (имеются процессы, которые ожидают на s), то (разрешить одному из них продолжить работу), иначе s:=s+1

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

  • Если счетчик может принимать и отрицательные целые значения, то отрицательное значение семафора означает длину очереди процессов, попытавшихся пройти через семафор (запросивших соответствующий ему ресурс).

Семафор

Применение

Mutex

Используется как классические семафоры с примитивами P() и V() для реализации взаимного исключения и синхронизации задач

Событие

Применяется для передачи управляющих сигналов между процессами о выполнении той или иной активности

MuxWait

Используются для того, чтобы процесс или нить могли ожидать на нескольких семафорах сразу

Вопрос 11. Применение бинарных семафоров для реализации взаимного исключения и синхронизации процессов.

Двоичные (бинарные) семафоры могут принимать значения 0 или 1 (могут находиться в двух состояниях: закрыт и открыт).

Операции выборки значения семафорной переменной S, ее изменения и сохранения не могут быть прерваны. Во время выполнения последовательности этих операций в процедурах P и V, вызванных одним процессом, над каким-либо семафором он недоступен для других процессов. hold(S) - означает перевод процесса в состояние ожидания на семафоре S и выход из P. Это ожидание не должно быть “занятым” (то есть нельзя зациклить процедуру P на проверке состояния семафора, так как в этом случае ни один другой процесс не смог бы получить доступ к этой защищенной переменной даже для выполнения операции открытия этого семафора). Для устранения занятого ожидания с каждым семафором связывается список блокирования (список процессов, ожидающих открытия семафора). Процесс, который не может продолжиться после выполнения P(S), будет заблокирован с сохранением его состояния в соответствующем S списке блокирования.

release(S) - выполняет проверку списка блокирования, связанного с семафором S, если этот список не пуст, то активизируется некоторый процесс из этого списка, пропускается через семафор, а значение семафора изменяется при этом соответствующим образом (бинарный семафор снова закрывается, а для семафора со счетчиком возвращенная процессом, выполнившем операцию V(S), единица ресурса передается очередному процессу из списка).

Ниже приведено описание семафорных примитивов для бинарных и считающих семафоров. Алгоритмы выполнения семафорных операций можно представить так:

S

Бинарный семафор

Считающий семафор

с неотрицательными

значениями счетчика

Общий

считающий семафор

P(S)

if S = 0 then Hold(S)

else S := 0

if S = 0 then Hold(S)

else S := S - 1

S := S - 1;

if S < 0 then Hold(S)

V(S)

if not Empty(S)

then Release (S)

else S := 1 ;

if not Empty(S)

then Release (S)

else S := S + 1 ;

S := S + 1 ;

if S<= 0 then Release (S)

Процедура инициализации

Первый процесс

Второй процесс

procedure INIT;

binary semaphore B ;

begin

B := 1 ; {Открыт}

start(P1) ;

start(P2)

end INIT .

process P1;

binary semaphore B ;

begin

while true do

begin

BEFORE1 ;

P(B) ;

CS1 ;

V(B) ;

AFTER1 ;

end

end P1 .

process P2;

binary semaphore B ;

begin

while true do

begin

BEFORE2 ;

P(B) ;

CS2 ;

V(B) ;

AFTER2 ;

end

end P2 .

Когда какой-либо процесс подходит к выполнению своей критической секции, он пытается пройти через семафор. Процедура P позволяет продолжить выполнение процесса только в том случае, когда семафор открыт. Причем до выполнения процедуры V семафор оказывается закрытым. Любой процесс, пытающийся выполнить P в то время, как семафор закрыт, будет заблокирован и не сможет продолжить выполнение и попасть в свою критическую секцию. Открыть же семафор может только тот процесс, который выходит из своей критической секции, освобождая разделяемые ресурсы.

Семафоры могут использоваться не только для решения проблемы взаимного исключения, но и как средство синхронизации выполнения процессов, определенные функции которых должны быть согласованы, упорядочены во времени. Например, существуют два процесса P1 и P2.. Первый процесс должен выполнить процедуру BEFORE до того как второй процесс сможет выполнить процедуру AFTER. Если второй процесс подойдет к выполнению процедуры AFTER раньше, чем первый процесс завершит выполнение процедуры BEFORE, он должен ждать ее завершения.

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

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

Процедура инициализации

Первый процесс

Второй процесс

procedure INIT;

binary semaphore B ;

begin

B := 0 ; {Закрыт}

start(P1) ;

start(P2)

end INIT .

process P1;

binary semaphore B ;

begin

...

BEFORE ;

V(B); {Разрешение для P2 }

{выполнить AFTER}

...

end P1 .

process P2;

binary semaphore B ;

begin

...

P(B) ; {Ожидание от P1}

{разрешения на выполнение}

AFTER ;

...

end P2 .