Сделай Сам Свою Работу на 5

ОС семейства UNIX. Средства IPC. Сообщения. Программные каналы. Каналы.





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

Со временем в разных вариантах ОС UNIX в совокупности появился явно избыточный набор системных средств, предназначенных для обеспечения возможности взаимодействия и синхронизации процессов, которые не обязательно связаны отношением родства (в мире ОС UNIX эти средства обычно называют IPC от Inter-Process Communication Facilities). С появлением UNIX System V Release 4.0 все эти средства вошли в фактический стандарт ОС UNIX современного образца.

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

Для реализации взаимодействия требуется:

- обеспечить средства взаимодействия между процессами



- исключить нежелательное влияние одного процесса на другой.

Взаимодействие между процессами необходимо для решения следующих задач:

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

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

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

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



К средствам межпроцессного взаимодействия, присутствующим во всех современных версиях UNIX, можно отнести:

- сигналы;

- каналы (pipe);

- FIFO (именованные каналы);

- сокеты;

- сообщения (очереди сообщений);

- семафоры

- разделяемую память.

Сообщения.

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

Данная возможность позволяет процессам обмениваться структурированными данными, имеющими следующие атрибуты:

- Тип сообщения (позволяет мультиплексировать сообщения в одной очереди)

- Длина данных сообщения в байтах (может быть нулевой)

- Собственно данные (если длина ненулевая, могут быть структурированными)

Очередь сообщений хранится в виде внутреннего однонаправленного связанного списка в адресном пространстве ядра. Для каждой очереди ядро создает заголовок очереди (msqid_ds), где содержится информация о правах доступа к очереди (msg_perm), ее текущем состоянии (msg_cbytes - число байтов и msg_qnum - число сообщений в очереди), а также указатели на первое (msg_first) и последнее (msg_last) сообщения, хранящиеся в виде связанного списка. Каждый элемент этого списка является отдельным сообщением.




Для создания новой очереди сообщений или для доступа к существующей используется системный вызов msgget(2):

int msgget( key__t key, int msgflag);

Функция возвращает дескриптор объекта-очереди, либо -1 в случае ошибки. Подобно файловому дескриптору, этот идентификатор используется процессом для работы с очередью сообщений. В частности, процесс может:

- Помещать в очередь сообщения с помощью функции msgsnd(2);

- Получать сообщения определенного типа из очереди с помощью функции msgrcv(2);

- Управлять сообщениями с помощью функции msgctl(2).

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

int msgsnd(int msqid, const void *msgp,

size_t msgsz, int msgfig);

int msgrcv(int msqid, void *msgp,

size_t msgsz, long msgtyp, int msgfig);

Здесь msqid является дескриптором объекта, полученного в результате вызова msgget(2). Параметр msgp указывает на буфер, содержащий тип сообщения и его данные, размер которого равен msgsz байт. Буфер имеет следующие поля:

long msgtype тип сообщения

char msgtext[] данные сообщения

Аргумент msgtyp указывает на тип сообщения и используется для их выборочного получения. Если msgtyp равен 0, функция msgrcv(2) получит первое сообщение из очереди. Если величина msgtyp выше 0, будет получено первое сообщение указанного типа. Если msgtyp меньше 0, функция msgrcv(2) получит сообщение с минимальным значением типа, меньше или равного абсолютному значению msgtyp.

Очереди сообщений обладают весьма полезным свойством - в одной очереди можно мультиплексировать сообщения от различных процессов. Для демультиплексирования используется атрибут msgtype, на основании которого любой процесс может фильтровать сообщения с помощью функции msgrcv(2).

Рассмотрим типичную ситуацию взаимодействия процессов, когда серверный процесс обменивается данными с несколькими клиентами. Свойство мультиплексирования позволяет использовать для такого обмена одну очередь сообщений. Для этого сообщениям, направляемым от любого из клиентов серверу, будем присваивать значение типа, скажем, равным 1. Если в теле сообщения клиент каким-либо образом идентифицирует себя (например, передает свой PID), то сервер сможет передать сообщение конкретному клиенту, присваивая тип сообщения равным этому идентификатору. Атрибут msgtype также можно использовать для изменения порядка извлечения сообщений из очереди. Стандартный порядок получения сообщений аналогичен принципу FIFO - сообщения получаются в порядке их записи. Однако используя тип, например, для назначения приоритета сообщений, этот порядок легко изменить.

Каналы

Программные каналы. Рассмотрим синтаксис организации программных каналов при работе в командной строке shell: cat myfile | wс

При этом STDOUT программы cat(1) передается на STDIN программы wc(1).

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

Для создания канала используется системный вызов pipe(2):

int pipe(int *fildes)

который возвращает два файловых дескриптора - fildes [1] для записи в канал и fildes[0] для чтения из канала. Теперь, если один процесс записывает данные в fildes[1], другой сможет получить эти данные из fildes[0]. Вопрос только в том, как другой процесс сможет получить сам файловый дескриптор fildes[0]?

Вспомним наследуемые атрибуты при создании процесса. Дочерний процесс наследует и разделяет все назначенные файловые дескрипторы родительского. То есть доступ к дескрипторам fildes канала может получить сам процесс, вызвавший pipe(2), и его дочерние процессы. В этом заключается серьезный недостаток каналов, поскольку они могут быть использованы для передачи данных только между родственными процессами. Каналы не могут использоваться в качестве средства межпроцессного взаимодействия между независимыми процессами.

Хотя в приведенном примере может показаться, что процессы cat(1) и wc(1) независимы, на самом деле оба этих процесса создаются процессом shell и являются родственными. На рисунке создание канала между cat и wc.

 

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.