Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СистПриклПрогЗабез(Хихловская).doc
Скачиваний:
25
Добавлен:
10.02.2016
Размер:
961.02 Кб
Скачать

Взаимодействие между процессами

С одной стороны процессы изолированы друг от друга, находясь в разных адресных пространствах. С другой стороны, они должны взаимодействовать:

  1. Передавать данные

  2. Совместно использовать данные

  3. Извещать друг друга о наступлении какого-либо события

Механизмы взаимодействия сводятся к использованию:

  1. Сигналов

  2. Каналов,

например, Catmyfilewcоба процесса создаютсяshell

Стандартный вывод программы cat(1), которая выводит содержимое файлаmyfile, передается на стандартный ввод программыwc(1), которая подсчитывает количество строк, строк и символов. В результате получим

12 45 260

строк слов символов

Каналы могут использоваться для взаимодействия только родственных процессов.

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

  1. FIFO – очень похож на каналы, но это именованный канал , как файл, например, программа“сервер”.

$mknodnamep– созданиеFIFOиз командной строки.

где pпрограмммаlsпокажет в первой позиции.

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

Организация каналов

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

int pipe(int*fildes); или int pipe(int filedes[2]);

fildes– переменная, может бытьfiledes.

Системный вызов pipe(2) возвращает два файловых дескриптора:fildes[0] для записи в канал,fildes[1] – для чтения из канала. Если один процесс записывает данные вfildes[0], то другой процесс может получить эти данные изfildes[1]. Сложность в том, как второй процесс сможет получить сам файловый дескрипторfildes[1].В случае неудачи возвращение – 1.

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

Рис. Создане канала между задачами cat(1) иwc(1)

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

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

Буферизация данных в канале стандартно осуществляется путем выделения дискового пространства в структуре файловой системы. Таким образом, запись и чтение связаны с дисковым вводом/ выводом, что сказывается на его производительности. Современные ОС (серверные) обеспечивают работу каналов через специальную файловую систему HPPS(HighPerformancePipeSystem). С ее помощью данные буферизуются в ОЗУ, что ускоряет запись/ чтение.

Взаимодействие между процессами

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

  1. Обеспечение средств взаимодействия

  2. Исключить нежелательные влияния между ними

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

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

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

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

Задача взаимодействия между процессами решается силами ОС. В UNIXэто следующие средства:

  1. Сигналы

  2. Каналы

  3. FIFO – именованные каналы

  4. Сообщения (очереди сообщений)

  5. Семафоры

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

  7. Сокеты

  1. Сигналы могут уведомлять об ошибках, для синхронизации процессов, для передачи простейших команд от одного процесса к другому, например, для сервераDNSnamed(1M) таким образом используется сигналSIGHUP, являющийся сигналом обновления базы данных.Сигналыочень ресурсоемки. Отправка сигнала требует системного вызова, а доставка – прерывания процесса-получателя и операций со стеком ( работа с подпрограммой). Сигналы малоинформативны и их число ограничено.

  2. Каналы.На примере команды в командной строкеshellрассмотрим синтаксис организации программных каналов:

catmyfilewc

Стандартный вывод команды cat(1), которая выводит содержимое файлаmyfile, передается на стандартный ввод программыwc(1), которая подсчитывает количество строк,слов и символов. В результате получается:

12 45 260 –

количество строк, слов, символов в myfile

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

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

int pipe( int * fildes), иначе int pipe(int filedes[2]);

который возвращает два файловых дискриптора – fildes[0] для записи в канал и fildes[1] для чтения из канала( если неудача, вызов pipe вернет – 1). Теперь один процесс записывает данные в fildes[0], другой может получить эти данные изfildes[1]. Как получает файловый дескрипторfildes[1] другой процесс? При создании процесса наследующие атрибуты дочерний процесс наследует и разделяет все назначенные файловые дескрипторы процесса родительского. Доступ к дескрипторамfiledesканала может получить сам процесс, вызвавшийpipe(2), и его дочерние процессы. Серьезный недостаток каналов в том, что они могут быть использованы для передачи данных только между родственными процессами и не могут быть использованы для передачи данных между независимыми процессами. В приведенном примере оба процессаcat(1) иwc(1) создаютсяshellи поэтому являются родственными.

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

3. FIFO

Название каналов FIFO ( FirstInFirstOut, 1-м-вошел, 1-м-вышел). FIFO являются однонаправленными средствами передачи данных, причем чтение данных происходит в порядке их записи. FIFO имеют имена, которые позволяют взаимодействовать независимым процессам (именованные каналы).ВBSDне используются.FIFOявляется типом файлов (ls-lпокажет в первой позицииp). Для созданияFIFOиспользуется системный вызовmknod(2):

intmknod(char*pachname,intmode,intdev),

где pathname– имя файла в Ф.С.( имяFIFO),

mod– флаги владения прав доступа и тд.( полеmode).Например, 0666 –для всех права доступа на запись и чтение.

dev– при создании файла игнорируется.

FIFOможет быть создан и из командной строкиshell:

$ mkmodenamep

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

Каналы FIFOи обычные каналы работают по следующим правилам:

  1. При чтении меньшего числа байтов, чем находятся в канале или FIFO, возвращается требуемое число байтов, остаток сохраняется для последующих чтений.

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

  3. Если канал пуст и ни один процесс не открыл его на запись, при чтении из канала будет получено 0 байтов. Если канал открывали для записи, но не записали, то вызов read(2) будет заблокирован до появления данных, если в канале не установлен флаг отсутствия блокировки O_NDELAY.

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

  5. При записи большего числа байтов, чем это позволяет канал или FIFO, вызов write(2) блокируется до освобождения места. Атомарность при этом не гарантируется. Если процесс пытается записать данные в канал, не открытый ни одним процессом на чтение, процессу гарантируется сигнал SIGPIPE, а вызов write(2) возвращает 0 с установкой ошибки (errno=EPIPE), если процесс не установил обработки сигнала SIGPIPE, производится обработка по умолчанию – процесс завершается.