Презентацию к данной лекции Вы можете скачать здесь.
Взаимодействие процессов – основа для распараллеленного, эффективного решения задач с помощью
С точки зрения взаимосвязи, процессы подразделяются на независимые и взаимодействующие.
Независимый процесс – процесс, никак не связанный с другими процессами, который не может влиять на исполнение других процессов или испытывать их влияние.
Взаимодействующий (совместный) процесс – процесс, который может влиять на исполнение других процессов или испытывать их влияние.
Преимущества взаимодействующих процессов очевидны:
С точки зрения видов взаимосвязи родительского и
Подчиненный процесс – процесс, зависящий от процесса-родителя. Подчиненный процесс уничтожается при уничтожении
Независимый процесс –
Сопроцесс (coprocess, coroutine) – процесс, равноправно взаимодействующий с другими такими же процессами; хранит свое текущее локальное управление (
Классификация процессов, близкая к приведенной в данном разделе, реализована в ОС "Эльбрус".
Реализация взаимодействия процессов может быть основана на одной из классических парадигм (шаблонов), сложившейся за десятилетия развития программирования. В данном разделе рассмотрим одну из наиболее распространенных из парадигм взаимодействия процессов - производитель – потребитель: процесс-производитель ( producer ) генерирует в некотором буфере информацию, которая используется процессом-потребителем ( consumer ).
При реализации данной парадигмы возможны схемы с неограниченным и ограниченным буфером, используемым для связи двух процессов.
При реализации следует учесть, что схема с ограниченным буфером, с точки зрения принципов надежных и безопасных вычислений (
Реализуем ограниченный буфер следующим образом. Информация хранится в массиве с
двумя указателями: in - для считывания и использования очередного элемента
информации процессом-потребителем и out - для записи очередного сгенерированного
элемента информации процессом-производителем. При считывании из буфера очередной элемент
удаляется, и указатель in, соответственно, продвигается. При записи в буфер
продвигается указатель out. Для удобства будем считать буфер циклическим,
т.е. при его заполнении следующим заполняемым элементом будет нулевой (если он освободился),
следующим после него – первый и т.д. Таким образом, процесс-производитель должен вычислять
индекс в буфере, по которому он записывает следующий элемент, по формуле ( out + 1) % BUFFER_SIZE,
где " % " операция взятия остатка от деления. Аналогично, процесс-потребитель
должен вычислять индекс следующего элемента информации в буфере по формуле ( in + 1) % BUFFER_SIZE.
Учтем также две возможных ситуации: переполнение буфера (при генерации
производителем числа элементов, большего длины буфера) и исчерпание буфера
(в случае, если потребитель взял из буфера последний на данный момент сгенерированный элемент).
Чтобы избежать обращения за границы буфера, при переполнении буфера производитель
должен будет ждать, пока в буфере не освободится хотя бы один элемент, а при исчерпании
буфера должен будет ждать потребитель, пока хотя бы один новый элемент не появится в буфере.
#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;
}
Данный код может быть использован как шаблон (
Рассмотрим теперь возможные механизмы для непосредственной коммуникации процессов и синхронизации их действий.
Наиболее распространенный из них - система сообщений ; при этом процессы взаимодействуют между собой без обращений к общим переменным (сравните с алгоритмами производителя и потребителя раздела 9.4).
Средства коммуникации между процессами обеспечивают две операции вида:
Если процессам P и Q требуется взаимодействовать между собой, им необходимо:
Реализация связи может быть физической (
При реализации коммуникационного механизма между процессами необходимо решить следующие вопросы:
Будем использовать данный контрольный список вопросов при анализе различных способов коммуникации процессов.
При непосредственной коммуникации (direct communication) процессы именуют друг друга явно – по именам или по адресам (указателям), которые указываются в вызовах коммуникационных примитивов, например:
При данном способе коммуникации свойства линии связи, согласно
При косвенной коммуникации (indirect communication) сообщения направляются и получаются через почтовые ящики ( mailboxes ), или порты ( ports ) – системные структуры, предназначенные для приема, хранения и передачи сообщений. Для определенности будем использовать термин почтовый ящик.
Каждый почтовый ящик имеет уникальный идентификатор.
Процессы могут взаимодействовать, только если они имеют общий почтовый ящик.
Свойства линии связи, согласно списку раздела 9.4, в этом случае следующие:
При косвенном способе коммуникации процессы используют набор операций вида:
Основные операции коммуникации принимают вид:
Как мы видим, в данном случае не используются адреса или имена процессов-корреспондентов; вместо них задаются имена почтовых ящиков.
Чтобы лучше осознать суть и особенности данного метода коммуникации, проведем следующую аналогию. Представьте себе очень привычную для Вас электронную почту, которой Вы пользуетесь каждый день. Вы имеете один или несколько почтовых ящиков (email-адресов) и можете послать через любой из них электронное письмо Вашему корреспонденту. При приеме электронной почты Вы обычно задаете режим типа " receive all" (принять все сообщения со всех адресов), т.е. устанавливаете последовательно несколько линий связи с корреспондентами. Аналогичным образом и взаимодействуют процессы при косвенном способе коммуникации. Понятны и возможные проблемы, и способы их решения в обоих случаях: например, если один адрес (почтовый ящик) не работает, можно попытаться послать сообщение через другой. Однако есть и отличия: при отправке электронной почты через некоторый почтовый ящик Вы все же явно указываете email-адрес получателя. С процессами дело обстоит иначе, из-за чего могут возникнуть проблемы.
Вот возможная проблема, возникающая при использовании общего почтового ящика. Пусть процессы P1, P2,и P3 используют почтовый ящик A. P1, посылает сообщение; P2 и P3 принимают. Возникает вопрос: кто (какой из процессов) получает сообщение? Выражаясь более научно, возникает недетерминированная ситуация, что создает ненадежность и небезопасность. Как решить данную проблему? Вот возможные решения:
Очевидно, что каждое из решений имеет свои достоинства и недостатки.
При косвенной связи процессов может оказаться необходимой синхронизация.Дело в том, что передача сообщений может выполняться с блокировкой (синхронно) или без блокировки (асинхронно). Соответственно, основные операции send и
С коммуникационной линией связывается очередь сообщений, реализованная одним из трех возможных способов:
Используются, в частности, следующие ее разновидности, которые мы и рассмотрим:
Сокеты – наиболее распространенный способ связи клиента и сервера в сети. Впервые они были реализованы в UNIX BSD 4.2. Сокет можно определить как отправную (конечную) точку для коммуникации - endpoint for communication. Сокет создается клиентом для взаимодействия с сервером. Сокет связан с определенным номером порта,через который клиент и сервер обмениваются информацией, используя числовой или символьный последовательный поток. Сервер, со своей стороны, прослушивает порт с заданным номером и создает для этого серверный сокет. По сути дела, сокет можно представлять как конкатенацию IP-адреса и порта. Например, сокет 161.25.19.8:1625 ссылается на порт 1625 на машине (хосте) 161.25.19.8. Коммуникация осуществляется между парой сокетов – клиентским и серверным. Она изображена на рис 9.1.
(рис 9.1) Взаимодействие с помощью сокетов.
Удаленные вызовы процедур (Remote Procedure Calls – RPC) впервые предложены фирмой Sun и реализованы в ОС Solaris.
Схема организации удаленного вызова процедуры изображена на рис 9.2.
(рис 9.2) Исполнение RPC.
Удаленный вызов метода (Remote Method Invocation, RMI) – механизм в Java-технологии, аналогичный RPC, но в объектно-ориентированной форме.
Схема
(рис 9.3) Удаленный вызов метода в Java.
Схема выстраивания параметров и результатов при удаленных вызовах изображена на рис 9.4.
(рис 9.4) Выстраивание параметров при удаленном вызове.
Send – операция
Receive – операция получения сообщения от другого процесса.
Взаимодействующий (совместный) процесс – процесс, который может влиять на исполнение других процессов или испытывать их влияние.
Выстраивание (marshaling) – механизм преобразования параметров удаленной процедуры (метода) для их передачи по сети в виде последовательного потока.
Косвенная коммуникация (indirect communication) – способ взаимодействия процессов с помощью сообщений, при котором сообщения направляются и получаются через почтовые ящики, или порты.
Независимый процесс – процесс, никак не связанный с другими процессами, который не может влиять на исполнение других процессов или испытывать их влияние.
Непосредственная коммуникация (direct communication) – способ взаимодействия процессов с помощью сообщений, при котором они именуют друг друга явно – по именам или по адресам (указателям), которые указываются в вызовах коммуникационных примитивов.
Очередь сообщений (message queue) – системная структура (буфер) для хранения сообщений между процессами.
Переполнение буфера (buffer overrun) – ошибочное или преднамеренное превышения размера буфера, которое может привести к обращению в чужую область памяти и используется для внешних атак.
Подчиненный процесс – процесс, зависящий от процесса-родителя; уничтожается при уничтожении
Почтовый ящик (порт) – системная структура, предназначенные для приема, хранения и передачи сообщений.
Производитель – потребитель (producer – consumer) - парадигма взаимодействия процессов, при которой процесс-производитель (producer) генерирует в некотором буфере информацию, которая используется процессом-потребителем ( consumer ).
Рандеву (rendezvous) – механизм коммуникации процессов, при котором оба процесса приостанавливаются до момента окончания передачи сообщения.
Сокет (socket) – метод клиент-серверного сетевого взаимодействия процессов, при котором информация передается через последовательный поток через порт с определенным номером.
Сопроцесс (coprocess, coroutine) – процесс, равноправно взаимодействующий с другими такими же процессами по управлению с помощью операций типа resume (Q),возобновляющих приостановленный процесс. Переходит в завершенное состояние операцией detach.
Удаленный вызов метода (Remote Method Invocation – RMI) – разработанный фирмой Sun объектно-ориентированный механизм Java-технологии для вызова метода Java на другом компьютере сети, аналогичный удаленному вызову процедуры.
Удаленный вызов процедуры (Remote Procedure Call – RPC) – разработанный фирмой Sun механизм вызова процедуры на другом компьютере локальной сети с использованием процедур- заглушек на клиенте и на сервере, передающих информацию и выстраивающих параметры и результат удаленной процедуры.
Процессы могут быть независимыми друг от друга и взаимодействующими. Преимущества взаимодействующих процессов – совместное использование данных, модульность, ускорение вычислений.
Парадигма производитель – потребитель – классическая схема взаимодействия процессов: производитель генерирует информационные элементы в буфере, а потребитель использует их и удаляет из буфера. Буфер может быть неограниченным или иметь ограниченную длину.
Коммуникация процессов может осуществляться с помощью сообщений. Коммуникация бывает непосредственная (с явным указанием адресов или имен процессов-адресатов) и косвенная (через почтовые ящики).
При анализе коммуникации процессов весьма важны способ установления связи, число связей между двумя процессами, пропускная способность линии связи, длина сообщений, ненаправленный или
При косвенной связи могут возникнуть проблемы с недетерминизмом при получении сообщений, если несколько процессов используют общий почтовый ящик.
При коммуникации передача сообщений может быть синхронной (с блокировкой) или асинхронной (без блокировки).
С коммуникационной линией связывается
Основные виды клиент-серверной коммуникации процессов – сокеты, удаленные вызовы процедур и методов.
Сокеты предназначены для взаимодействия между клиентом и сервером в сетях TCP/IP через порт с определенным номером, при котором информация передается через последовательные потоки.
Удаленный вызов метода – объектно-ориентированный механизм Java-технологии, аналогичный удаленному вызову процедуры.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.