ВУЗ:
Составители:
15
New (P1);
{Выделяем элемент очереди}
P1^. адрес дискриптора := текущий процесс;
Включить в очередь (S. начало очереди, P1);
Передать контекст процесса (текущий процесс ^. адрес стека);
Переключить (процесс);
{Выбираем из списка СГП очередной процесс}
end;
Разрешить прерывания;
end;
Procedure Освободить (S: семафор);
begin
Запретить прерывания;
if S.начало очереди <> nil
then
begin
Перенести (S.начало очереди^. адрес дескриптора, начало СБП, начало СГП);
Удалить из очереди (S. начало очереди);
end else S.счётчик := 1;
Разрешить прерывания;
end;
Приведённая процедура предназначена для работы с двоичными семафорами и простой оче-
редью (FIFO).
Лекция 6. Задача “поставщик – потребитель”
Допустим, что процесс “Поставщик” заносит записи в буфер, из которого эти записи
выбирает другой процесс – “Потребитель”. Буфер имеет ограниченный объём, например, n.
Требуется организовать совместную работу процессов с буфером.
Необходимо решить следующие проблемы:
1) Если запись состоит из нескольких слов, то процесс “Поставщик” будет достаточно
долго производить операцию записи, в то время как процесс “Потребитель” будет обращать-
ся к буферу для чтения, т.е. необходимо предусмотреть взаимное исключение.
2) Поставщик не должен записывать в заполненный буфер.
3) Потребитель не должен читать из пустого буфера.
Решение задачи “поставщик – потребитель” с помощью семафора
План решения:
1) Необходимо ввести семафор «взаимное исключение» для защиты буфера от одно-
временного обращения «Поставщика» и «Потребителя».
2) Введём два семафора, которые не являются двоичными и поэтому используются
для подсчёта числа записей, контроля пустоты буфера.
Семафор «полный» показывает количество занятых мест в буфере, семафор «пустой»
показывает количество свободных мест в буфере.
Если пустые места есть в буфере, то необходима проверка условия “полный=0”.
Алгоритм решения будет выглядеть так:
Var
взаимное исключение: семафор двоичный;
пустой, полный: семафор двоичный;
begin
New (P1); {Выделяем элемент очереди} P1^. адрес дискриптора := текущий процесс; Включить в очередь (S. начало очереди, P1); Передать контекст процесса (текущий процесс ^. адрес стека); Переключить (процесс); {Выбираем из списка СГП очередной процесс} end; Разрешить прерывания; end; Procedure Освободить (S: семафор); begin Запретить прерывания; if S.начало очереди <> nil then begin Перенести (S.начало очереди^. адрес дескриптора, начало СБП, начало СГП); Удалить из очереди (S. начало очереди); end else S.счётчик := 1; Разрешить прерывания; end; Приведённая процедура предназначена для работы с двоичными семафорами и простой оче- редью (FIFO). Лекция 6. Задача “поставщик – потребитель” Допустим, что процесс “Поставщик” заносит записи в буфер, из которого эти записи выбирает другой процесс – “Потребитель”. Буфер имеет ограниченный объём, например, n. Требуется организовать совместную работу процессов с буфером. Необходимо решить следующие проблемы: 1) Если запись состоит из нескольких слов, то процесс “Поставщик” будет достаточно долго производить операцию записи, в то время как процесс “Потребитель” будет обращать- ся к буферу для чтения, т.е. необходимо предусмотреть взаимное исключение. 2) Поставщик не должен записывать в заполненный буфер. 3) Потребитель не должен читать из пустого буфера. Решение задачи “поставщик – потребитель” с помощью семафора План решения: 1) Необходимо ввести семафор «взаимное исключение» для защиты буфера от одно- временного обращения «Поставщика» и «Потребителя». 2) Введём два семафора, которые не являются двоичными и поэтому используются для подсчёта числа записей, контроля пустоты буфера. Семафор «полный» показывает количество занятых мест в буфере, семафор «пустой» показывает количество свободных мест в буфере. Если пустые места есть в буфере, то необходима проверка условия “полный=0”. Алгоритм решения будет выглядеть так: Var взаимное исключение: семафор двоичный; пустой, полный: семафор двоичный; begin 15
Страницы
- « первая
- ‹ предыдущая
- …
- 13
- 14
- 15
- 16
- 17
- …
- следующая ›
- последняя »