Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС_лекции.doc
Скачиваний:
2
Добавлен:
15.04.2019
Размер:
370.69 Кб
Скачать

Средство межпроцессорных взаимодействий ipc

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

  1. средства передачи данных: файлы, общие сегменты, каналы, очереди

  2. средства синхронизации: события, сигналы, мютексы, семафоры, критические секции

Общие сегменты – сегменты памяти, в которых все взаимодействующие процессы имеют доступ ???

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

Каналы

Канал представляет из себя область памяти, используемую в качестве циклического буфера (рис)

И на эту область есть 2 указателя: указатель чтения и указатель записи.

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

Существует 2 случая, когда УЧ=УЗ:

  1. канал пустой

  2. канал переполнен. При попытке записи фиксируется ошибка.

FIFO

Каналы могут быть именованные и не именованные. Именованному каналу при создании присваивается уникальное имя, по которому к нему могут получить доступ потоки других процессов. Неименованным каналам имя не присваивается, поэтому доступ к ним могут получить только дочерние процессы, унаследовавшие описатель от своего родителя.

Именованный канал создается с помощью функции p=CreateNPipe(имя, размер области отводимой под канал). Получить доступ к именованному каналу из других процессов можно с помощью функции p=OpenMPipe(имя), в которой указывается имя существующего канала. Функция также возвращает описатель канала - пару р=(УЧ, УЗ).

Неименованный канал создается с помощью функции p=MakePipe(e), в котором указывается размер области, выделяемый под неименованный канал. Функция также возвращает описатель канала.

Операции чтения и записи в каналах осуществляются с помощью операторов функций ввода-вывода для последовательности файлов Read (УЧ), Write(УЗ).

При записи по УЗ осуществляется запись, после чего УЗ передвигается на начало свободного пространства.

Для завершения работы с каналом необходимо закрыть указатели связи с каналом Close(УЧ, УЗ).

Очередь

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

  1. очередь содержит не сами данные, а ссылки на данные – сообщения. Помимо ссылкии на сами данные, сообщения также содержат идентификатор процесса, поместившего сообщение в очередь и в некоторых случаях приоритет сообщения.

  2. Очередь поддерживает 3 дисциплины: FIFO, LIFO, приоритет

  3. Дисциплина задается при создании очереди и в середине работы изменяться не может.

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

Сервер может:

  1. создать очередь q=CreateQueue(имя, l –размер, D-дисциплина)

  2. ReadQueue(q)

  3. PeekQueue(q) – просмотреть сообщения без удаления

  4. QuergQueue(q) – подсчитать количество сообщений

  5. PurgeQueue(q) – очистить очередь

  6. Close(q) – очистить очередь (уничтожение)

Клиент может:

  1. получить доступ к очереди по заданному имени q=OpenQueue(имя)

  2. записать сообщения в очередь WriteQueue(q)

  3. подсчитать количество элементов в очереди QueryQueue(q)

  4. закрыть очередь (но не уничтожать данные) Close(q)

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