Основные задачи параллельного программирования. Конспект лекций. Степанов Б.М. - 15 стр.

UptoLike

Составители: 

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