Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТОИ 17-32.docx
Скачиваний:
14
Добавлен:
25.09.2019
Размер:
57.84 Кб
Скачать
  1. Приведите примеры использования семафоров (для решения задачи взаимного исключения, синхронизации процессов, решения задачи поддержания отношения предшествования)

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

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

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

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

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 .

Таким образом, семафоры позволяют решить проблему реализации отно-шений предшествования для процессов, выполняя роль сигналов.

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

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

Процесс-производитель

Процесс-потребитель

procedure INIT;

binary semaphore B ;

integer semaphore E, F;

begin

B := 1 ; {Буфер открыт}

E := N ; {Все записи}

{в буфере пусты}

F := 0 ; {В буфере нет}

{ни одной записи}

start(P1) ;

start(P2)

end INIT .

process P1;

binary semaphore B ;

integer semaphore E, F;

begin

while true do

begin

...

produce_next_record ;

P(E) ;

P(B) ;

write_record_to_buffer ;

V(B);

V(F);

...

end

end P1 .

process P2;

binary semaphore B ;

integer semaphore E, F;

begin

while true do

begin

...

P(F) ;

P(B) ;

read_record_from_buffer;

V(B);

V(E);

process_new_record ;

...

end

end P2 .

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