Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СППО-Вопросы к экзамену-2014 (Восстановлен).doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
1.16 Mб
Скачать
  1. Общие семафоры, решение задачи «писателей и читателей» при работе с циклическим буфером. Сравнить варианты решения.

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

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

  • Пусть емкость буфера составляет N записей.

  • Для процесса P1 ресурсом являются незаполненные записи в буфере, для их учета можно использовать считающий семафор E, а для процесса P2 необходимым для работы ресурсом являются сформированные процессом P1 записи, для учета их числа можно также использовать считающий семафор F. Кроме того, выполнение операций с буфером, который является разделяемым ресурсом, требует обычно взаимного исключения (последовательность операций над данными в буфере - критическая секция), для реализации которого можно использовать бинарный семафор.

Описание процедуры инициализации и программ, соответствующих процессам P1 и 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 .

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