Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS.DOC
Скачиваний:
18
Добавлен:
28.10.2018
Размер:
653.82 Кб
Скачать
    1. Очереди сообщений

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

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

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

Ядро никак не интерпретирует содержания сообщений, а только обеспечивает размещение и выборку в соответствии с указанным типом. Шаблон сообщения хранится в файле <sys/msg.h>.

struct msgbuf {

long mtype; /* тип сообщения */

char mtext[1] /* данные */

}

Для работы с очередями в UNIX System V существуют следующие системные вызовы:

msggct - создание очереди;

msgetl - установка параметров;

msgsnd - посылка сообщений в очередь;

msgrcv - получение сообщений из очереди.

Очереди имеют свои преимущества; по сравнению, например, с программными каналами.

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

Кроме того, имеется возможность извлекать сообщения из очереди не только по дисциплине FIFO, по и в произвольном порядке. Эта особенность открывает перспективу построения систем с приоритетным обслуживанием клиентов.

    1. Разделяемая память

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

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

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

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

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

Для разделяемых сегментов используются следующие системные вызовы и управляющие файлы:

#include <sys/types.h>

#include <sys/ipc.h>

Системные вызовы:

shmget - создание сегмента;

shmetl - установка параметров;

shmat - подсоединение сегмента

shmdt - отсоединение сегмента.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]