Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 63
Текст из файла (страница 63)
В системе с одним процессоромпосылающий и получающий процессы не могут работать одновременно. В мультипроцессорных системах также нет никакой гарантии их одновременного исполнения. Следовательно, для хранения посланного, но еще не полученного сообщения необходимо место. Оно называется буфером сообщений, или почтовымящиком1.Если процесс Р1 хочет общаться с процессом Р2, то Р1 просит систему предоставить или образовать почтовый ящик, который свяжет эти два процесса так, чтобыони могли передавать друг другу сообщения. Для того чтобы послать процессу Р2какое-то сообщение, процесс Р1 просто помещает это сообщение в почтовый ящик,откуда процесс Р2 может его в любое время получить.
При применении почтовогоящика процесс Р2 в конце концов обязательно получит сообщение, когда обратится за ним (если вообще обратится). Естественно, что процесс Р2 должен знать осуществовании почтового ящика. Поскольку в системе может быть много почтовых ящиков, необходимо обеспечить доступ процессу к конкретному почтовомуящику. Почтовые ящики являются системными объектами, и для пользования таким объектом необходимо получить его у операционной системы, что осуществляется с помощью соответствующих запросов.Если объем передаваемых данных велик, то эффективнее не передавать их непосредственно, а отправлять в почтовый ящик сообщение, информирующее процессполучатель о том, где можно их найти.Почтовый ящик может быть связан с парой процессов, только с отправителем, только с получателем, или его можно получить из множества почтовых ящиков, которые используют все или несколько процессов.
Почтовый ящик, связанный с процессом-получателем, облегчает посылку сообщений от нескольких процессов вфиксированный пункт назначения. Если почтовый ящик не связан жестко с процессами, то сообщение должно содержать идентификаторы и процесса-отправителя, и процесса-получателя.Название «почтовый ящик» происходит от обычного приспособления для отправки почты.рпчтовые ящикигч!Итак, почтовый ящик — это информационная структура, поддерживаемая операционной системой. Она состоит из головного элемента, в котором находится информация о данном почтовом ящике, и нескольких буферов (гнезд), в которыепомещают сообщения.
Размер каждого буфера и их количество обычно задаютсяпри образовании почтового ящика.Правила работы почтового ящика могут быть различными в зависимости от егосложности [17]. В простейшем случае сообщения передаются только в одном направлении. Процесс Р1 может посылать сообщения до тех пор, пока имеются свободные гнезда. Если все гнезда заполнены, то Р1 может либо ждать, либо занятьсядругими делами и попытаться послать сообщение позже.
Аналогично процесс Р2может получать сообщения до тех пор, пока имеются заполненные гнезда. Еслисообщений нет, то он может либо ждать сообщений, либо продолжать свою работу.Эту простую схему работы почтового ящика можно усложнять в нескольких направлениях и получать более хитроумные системы общения — двунаправленныеи миоговходовые почтовые ящики.Двунаправленный почтовый ящик, связанный с парой процессов, позволяет подтверждать прием сообщений. При наличии множества гнезд каждое из них хранитлибо сообщение, либо подтверждение. Чтобы гарантировать передачу подтверждений, когда все гнезда заняты, подтверждение на сообщение помещается в то жегнездо, в котором находится сообщение, и это гнездо уже не используется дл? другого сообщения до тех пор, пока подтверждение не будет получено. Из-за того, чтонекоторые процессы не забрали свои сообщения, связь может быть приостановлена.
Если каждое сообщение снабдить пометкой времени, то управляющая программа может периодически удалять старые сообщения.Процессы могут быть также остановлены в связи с тем, что другие процессы несмогли послать им сообщения. Если время поступления каждого остановленногопроцесса в очередь заблокированных процессов регистрируется, то управляющаяпрограмма может периодически посылать им пустые сообщения, чтобы они неждали чересчур долго.Реализация почтовых ящиков требует использования примитивных операторовнизкого уровня, таких как операции Р и V или каких-либо других, но пользователям может дать средства более высокого уровня (наподобие мониторов Хоара),например, такие, как представлены ниже.SEND_MESSAGE ( Получатель, Сообщение.
Буфер )Эта операция переписывает сообщение в некоторый буфер, помещает егоадрес в переменную Буфер и добавляет буфер к очереди Получатель. Процесс,выдавший операцию SEND_MESSAGE, продолжит свое исполнение.WAITJCSSAGE ( Отправитель. Сообщение. Буфер )Эта операция блокирует процесс, выдавший операцию, до тех пор, пока в егоочереди не появится какое-либо сообщение. Когда процесс передается напроцессор, он получает имя отправителя с помощью переменной Отправитель,текст сообщения через переменную Сообщение и адрес буфера в переменнойБуфер. Затем буфер удаляется из очереди, и процесс может записать в негоответ отправителю.242Глава 7, Организация параллельных взаимодействующих вычисленийSEND_ANSWER ( Результат, Ответ, Буфер )Эта операция записывает информацию, определяемую через переменную Ответв тот буфер, номер которого указывается переменной Буфер (из этого буферабыло получено сообщение), и добавляет буфер к очереди отправителя.
Еслиотправитель ждет ответ, он деблокируется.WAIT_ANSWER ( Результат, Ответ, Буфер ) .Эта операция блокирует процесс, выдавший операцию, до тех пор, пока в буферне поступит ответ; доступ к нему возможен через переменную Буфер. После тогокак ответ поступил и процесс передан на процессор, ответ, доступ к которомуопределяется через переменную Ответ, переписывается в память процессу, абуфер освобождается. Значение переменной Результат указывает, является лиответ пустым, то есть выданным операционной системой, так как сообщениебыло адресовано несуществующему (или так и не ставшему активным) процессу.Основные достоинства почтовых ящиков:•процессу не нужно знать о существовании других процессов до тех пор, пока онне получит сообщения от них;Q два процесса могут обменяться более чем одним сообщением за один раз;а операционная система может гарантировать, что никакой иной процесс не вмешается во взаимодействие процессов, ведущих между собой «переписку»;•очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимания на получателя.Основным недостатком буферизации сообщений является появление еще одногоресурса, которым нужно управлять.
Этим ресурсом являются сами почтовые ящики.К другому недостатку можно отнести статический характер этого ресурса: количествобуферов для передачи сообщений через почтовый ящик фиксировано. Поэтому естественным стало появление механизмов, подобных почтовым ящикам, но реализованных на принципах динамического выделения памяти под передаваемые сообщения.В операционных системах компании Microsoft тоже имеются почтовые ящики(mailslots). В частности, они достаточно часто используются при создании распределенных приложений для сети.
При работе с ними в приложении, которое должно отправить сообщение другому приложению, необходимо указывать класс доставки сообщений. Различают два класса доставки. Первый класс (first-class delivery)гарантирует доставку сообщений; он ориентирован на сеансовое взаимодействиемежду процессами и позволяет организовать посылки типа «один к одному» и «одинко многим». Второй класс (second-class delivery) основан на механизме датаграмм,и он уже не гарантирует доставку сообщений получателю.Конвейеры и очереди сообщенийКонвейерыПрограммный канал связи (pipe), или, как его иногда называют, конвейер, транспортер, является средством, с помощью которого можно обмениваться даннымежду процессами. Принцип работы конвейера основан на механизме ввода-выяода файлов в UNIX, то есть задача, передающая информацию, действует так, какбудто она записывает данные в файл, в то время как задача, для которой предназначается эта информация, читает ее из этого файла.
Операции записи и чтенияосуществляются не записями, как это делается в обычных файлах, а потоком байтов, как это принято в UNIX-системах. Таким образом, функции, с помощью которых выполняется запись в канал и чтение из него, являются теми же самыми, что ипри работе с файлами. По сути, канал представляет собой поток данных междудвумя (или более) процессами. Это упрощает программирование и избавляет программистов от использования каких-то новых механизмов. На самом деле конвейеры не являются файлами на диске, а представляют собой буферную память, работающую по принципу FIFO, то есть по принципу обычной очереди.