АкушерствоАнатомияАнестезиологияВакцинопрофилактикаВалеологияВетеринарияГигиенаЗаболеванияИммунологияКардиологияНеврологияНефрологияОнкологияОториноларингологияОфтальмологияПаразитологияПедиатрияПервая помощьПсихиатрияПульмонологияРеанимацияРевматологияСтоматологияТерапияТоксикологияТравматологияУрологияФармакологияФармацевтикаФизиотерапияФтизиатрияХирургияЭндокринологияЭпидемиология

Почтовые ящики

Прочитайте:
  1. Чем плохи почтовые клиенты

Тесное взаимодействие между процессами предполагает не только синхрониза­цию — обмен временными сигналами, но и передачу, и получение произвольных данных — обмен сообщениями. В системе с одним процессором посылающий и получающий процессы не могут работать одновременно. В мультипроцессор­ных системах также нет никакой гарантии их одновременного исполнения. Сле­довательно, для хранения посланного, но еще не полученного сообщения необхо­димо место. Оно называется буфером сообщений или почтовым ящиком1. Если процесс Р1 хочет общаться с процессом Р2, то Р1 просит систему образо­вать или предоставить ему почтовый ящик, который свяжет эти два процесса так, чтобы они могли передавать друг другу сообщения. Для того чтобы послать процессу Р2 какое-то сообщение, процесс Р1 просто помещает это сообщение в почтовый ящик, откуда процесс Р2 может его в любое время взять. При приме­нении почтового ящика процесс Р2 в конце концов обязательно получит сообще­ние, когда обратится за ним, если вообще обратится. Естественно, что процесс Р2 должен знать о существовании почтового ящика. Поскольку в системе может быть много почтовых ящиков, необходимо обеспечить доступ процессу к кон­кретному почтовому ящику. Почтовые ящики являются системными объектами, и для пользования таким объектом необходимо получить его у операционной системы, что осуществляется с помощью соответствующих запросов. Если объем передаваемых данных велик, то эффективнее не передавать их непо­средственно, а отправлять в почтовый ящик сообщение, информирующее про­цесс-получатель о том, где можно их найти.

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

1 Название «почтовый ящик» происходит от обычного приспособления для отправки почты.


сов в фиксированный пункт назначения. Если почтовый ящик не связан жестко с процессами, то сообщение должно содержать идентификаторы и процесса-от­правителя, и процесса-получателя.

Итак, почтовый ящик — это информационная структура, поддерживаемая опера­ционной системой. Она состоит из головного элемента, в котором находится информация о данном почтовом ящике, и из нескольких буферов (гнезд), в кото­рые помещают сообщения. Размер каждого буфера и их количество обычно зада­ются при образовании почтового ящика.

Правила работы почтового ящика могут быть различными в зависимости от его сложности [37]. В простейшем случае сообщения передаются только в одном на­правлении. Процесс Р1 может посылать сообщения до тех пор, пока имеются свободные гнезда. Если все гнезда заполнены, то Р1 может либо ждать, либо заняться другими делами и попытаться послать сообщение позже. Аналогично процесс Р2 может получать сообщения до тех пор, пока имеются заполненные гнезда. Если сообщений нет, то он может либо ждать сообщений, либо продол­жать свою работу. Эту простую схему работы почтового ящика можно услож­нять в нескольких направлениях и получать более хитроумные системы обще­ния — двунаправленные и многовходовые почтовые ящики. Двунаправленный почтовый ящик, связанный с парой процессов, позволяет под­тверждать прием сообщений. Если используется множество гнезд, то каждое из них хранит либо сообщение, либо подтверждение. Чтобы гарантировать переда­чу подтверждений, когда все гнезда заняты, подтверждение на сообщение поме­щается в то же гнездо, которое было использовано для сообщения, и оно уже не используется для другого сообщения до тех пор, пока подтверждение не будет получено. Из-за того, что некоторые процессы не забрали свои сообщения, связь может быть приостановлена. Если каждое сообщение снабдить пометкой времени, то управляющая программа может периодически уничтожать старые сообщения.

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

Реализация почтовых ящиков требует использования примитивных операторов низкого уровня, таких как Р- и V-операции, или каких-либо других средств, но пользователям может дать средства более высокого уровня (наподобие монито­ров Хоара), например, ввести следующие операции:

1. SEND_MESSAGE (Получатель. Сообщение, Буфер)

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

2. WAIT_MESSAGE (Отправитель, Сообщение, Буфер)

блокирует процесс, выдавший операцию, до тех пор, пока в его очереди не появится какое-либо сообщение. Когда процесс устанавливается на процес­сор, он получает имя отправителя в переменной Отправитель, текст сообщения — в Сообщение и адрес буфера — в Буфер. Затем буфер удаляется из очереди, и про­цесс может записать в него ответ отправителю.


3. SEND_ANSWER (Результат, Ответ.-Буфер)

записывает Ответ в тот Буфер, из которого было получено сообщение, и добавляет буфер к очереди отправителя. Если отправитель ждет ответ, он деблокируется.

4. WAIT_ANSWER (Результат. Ответ, Буфер)

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

Основные достоинства почтовых ящиков:

Q процессу не нужно знать о существовании других процессов до тех пор, пока он не получит сообщения от них;

Q два процесса могут обмениваться более чем одним сообщением за один раз;

Q операционная система может гарантировать, что никакой процесс не вмеша­ется в «беседу» других процессов;

Q очереди буферов позволяют процессу-отправителю продолжать работу, не обращая внимания на получателя.

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

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


Дата добавления: 2015-01-18 | Просмотры: 660 | Нарушение авторских прав



1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |



При использовании материала ссылка на сайт medlec.org обязательна! (0.004 сек.)