Методы взаимодействия процессов. Парадигма (шаблон) взаимодействия процессов: производитель – потребитель.



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

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

1) Схема с неограниченным буфером (unbounded buffer) подразумевает, что на размер используемого буфера теоретически нет ограничений.

2) Схема с ограниченным буфером (bounded buffer) предполагается определенное ограничение размера буфера, например, константой BUFFER_SIZE.

При реализации следует учесть, что схема с ограниченным буфером, с точки зрения принципов надежных и безопасных вычислений, представляет опасность атаки "переполнение буфера"(buffer overrun) – ошибочного или преднамеренного превышения размера буфера. Чтобы избежать этой уязвимости, при заполнении буфера необходимо проверять его размер.

Реализация представления буфера на языке Си может иметь вид:

#define BUFFER_SIZE 1000 /* или другое конкретное значение */

typedef struct {

   . . .

} item;

item buffer[BUFFER_SIZE];

int in = 0;

int out = 0;

 

Реализация схемы алгоритма процесса-производителя имеет вид:

item nextProduced; /* следующий генерируемый элемент */

   while (1) { /* бесконечный цикл */

   while (((in + 1) % BUFFER_SIZE) == out)

            ; /* ждать, пока буфер переполнен */

   buffer[in] = nextProduced; /* генерация элемента */

   in = (in + 1) % BUFFER_SIZE;

}

 

Реализация процесса-потребителя будет иметь вид:

item nextConsumed; /* следующий используемый элемент */

while (1) { /* бесконечный цикл */

   while (in == out)

            ; /* ждать, пока буфер пуст */

   nextConsumed = buffer[out]; /* использование элемента */

   out = (out + 1) % BUFFER_SIZE;

}


Методы взаимодействия процессов. Коммуникация процессов.

Рассмотрим теперь возможные механизмы для непосредственной коммуникации процессов и синхронизации их действий.

Наиболее распространенный из них - система сообщений ; при этом процессы взаимодействуют между собой без обращений к общим переменным.

Средства коммуникации между процессами обеспечивают две операции вида:

1) send (message ) – отправка сообщения message ; размер сообщения может быть постоянным или переменным;

2) receive (message ) – получение сообщения в буфер message.

Если процессам P и Q требуется взаимодействовать между собой, им необходимо:

- Установить связь (communication link) друг с другом

- Обменяться сообщениями вида send/receive.

Реализация связи может быть физической (общая память, аппаратная шина) или логической (например, логические свойства).

При реализации коммуникационного механизма между процессами необходимо решить следующие вопросы:

1) Как устанавливается связь?

2) Можно ли установить связь более чем двух процессов?

3) Сколько связей может быть установлено между двумя заданными процессами?

4) Какова пропускная способность линии связи?

5) Является ли длина сообщения по линии связи постоянной или переменной?

6) Является ли связь ненаправленной или двунаправленной (дуплексной)?
30. Методы взаимодействия процессов. Непосредственная коммуникация процессов. Косвенная коммуникация процессов.

При непосредственной коммуникации (direct communication) процессы именуют друг друга явно – по именам или по адресам (указателям), которые указываются в вызовах коммуникационных примитивов, например:

send (P, message ) – послать сообщение процессу P ;

receive (Q, message ) – получить сообщение от процесса Q.

 

При данном способе коммуникации свойства линии связи следующие:

1) Связь устанавливается автоматически (ее реализуют операционная система или отдельные коммуникационные инструменты).

2) Связь ассоциируется только с одной парой взаимодействующих процессов.

3) Между каждой парой процессов всегда только одна связь.

4) Связь может быть ненаправленной, но, как правило, она двунаправленная (процесс может получить сообщение от другого явно заданного процесса и принять от него сообщение).

При косвенной коммуникации (indirect communication) сообщения направляются и получаются через почтовые ящики ( mailboxes ), или порты ( ports ) – системные структуры, предназначенные для приема, хранения и передачи сообщений. Для определенности будем использовать термин почтовый ящик.

Каждый почтовый ящик имеет уникальный идентификатор.

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

Свойства линии связи в этом случае следующие:

1)Связь устанавливается, только если процессы имеют общий почтовый ящик.

2) Связь одного процесса может быть установлена со многими процессами (которым доступен тот же почтовый ящик).

3) Каждая пара процессов может иметь несколько линий связи (так как сообщения могут посылаться через различные почтовые ящики).

4) Связь может быть ненаправленной или двунаправленной.

При косвенном способе коммуникации процессы используют набор операций вида:

- Создать новый почтовый ящик.

- Отправить (принять) сообщение через почтовый ящик.

- Удалить почтовый ящик

Основные операции коммуникации принимают вид:

1) send (A, message ) – послать сообщение в почтовый ящик A.

2) receive (A, message ) – получить сообщение из почтового ящика A.


Дата добавления: 2018-05-09; просмотров: 487; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!