Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Межпроцессорное взаимодействие

 

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

1. Сигнальные средства обмена информацией – взаимодействие процессов осуществляется путем передачи сигнала посредством специального системного вызова. Степень воздействия на поведение процесса, получившего информацию, минимальна. Процесс может посылать сигналы (табл. 3.4.) только членам своей группы, состоящей из родителя и предков или всей группе за один системный вызов. Сигналы используются и для других целей. Например, если процесс выполняет вычисления с плавающей точкой и непреднамеренно делит число на 0, он получает сигнал SIGFPE (Floating-Point Exception SIGnal – сигнал исключения при выполнении операции с плавающей точкой). Большинство операционных систем кроме сигналов, требуемых стандартом POSIX, используют дополнительные сигналы.

Таблица 3.4.

Сигналы, требуемые стандартом POSIX

 

№п/п Сигнал Причина
  SIGABRT Посылается, чтобы прервать процесс и создать дамп памяти (memory dump) – снимок оперативной памяти
  SIGALRM Истекло время будильника
  SIGFPE Произошла ошибка при выполнении операции с плавающей точкой (например, деление на 0)
  SIGHUP Модем повесил трубку на телефонной линии, использовавшейся процессом
  SIGILL Пользователь нажал клавишу DEL, чтобы прервать процесс
  SIGQUIT Пользователь нажал клавишу, требуя прекращения работы процесса с созданием дампа памяти
  SIGKILL Посылается, чтобы уничтожить процесс (не может игнорироваться или перехватываться)
  SIGPIPE Процесс пишет в канал, из которого никто не читает
  SIGSEGV Процесс обратился к неверному адресу памяти
  SIGTERM Вежливая просьба процессу завершить свою работу
  SIGUSR1 Может быть определено приложением
  SIGUSR2 Может быть определено приложением

 

Типы сигналов (принято задавать номерами в диапазоне от 1 до 31 включительно или специальными символьными обозначениями, которые начинаются с приставки SIG) и способы их возникновения в системе жестко регламентированы. Процесс может получить сигнал:

- от аппаратного обеспечения (hardware) при возникновении исключительной ситуации;

- от процесса, выполнившего системный вызов передачи сигнала;

- от операционной системы при наступлении некоторых событий;

- от терминала при нажатии определенной комбинации клавиш;

- от системы управления заданиями;

- при выполнении команды kill.

Например, в Linux существуют несколько причин генерации сигналов или ситуаций, в которых отправляются сигналы:

- терминальные прерывания – нажатие пользователем определенной комбинации клавиш вызывают отправку сигнала процессу, связанному с текущим терминалом;

- особые ситуации – при выполнении процесса возникает особая ситуация, например, деление на ноль и процесс получает от ядра соответствующий сигнал;

- межпроцессорное взаимодействие – процесс отправляет специальный сигнал другому процессу с помощью системного вызова kill;

- управление заданиями – командные интерпретаторы, поддерживающие управление заданиями, используют сигналы для манипулирования текущими и фоновыми заданиями;

- установка квот – процесс превышает установленную для него квоту на использования ресурсов и ему отправляется соответствующий сигнал;

- уведомления – процессам посылаются уведомления о готовности устройств или наступлении других событий;

- установка таймера – процессу будет послан сигнал, когда значение таймера станет равным нулю.

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

- принудительно проигнорировать сигнал;

- произвести обработку по умолчанию: проигнорировать, остановить процесс (перевести в состояние ожидания до получения другого специального сигнала), либо завершить работу;

- выполнить обработку сигнала, специфицированную пользователем.

Изменить реакцию процесса на сигнал можно с помощью специальных системных вызовов. Реакция на некоторые сигналы не допускает изменения, поэтому они могут быть обработаны только по умолчанию, например, сигнал SIGKILL обрабатывается только по умолчанию и приводит к завершению процесса. В операционной системе UNIX при системном вызове fork() все установленные реакции на сигналы наследуется порожденным процессом. При системном вызове exec() сохраняются реакции только для тех сигналов, которые игнорировались или обрабатывались по умолчанию. Получение любого сигнала, который до вызова exec() обрабатывался пользователем, приведет к завершению процесса.

2. Разделяемая память (shared memory) – взаимодействие процессов осуществляется посредством совместного использования некоторой области (сегмента) адресного пространства. Созданием разделяемой памяти занимается операционная система, а ее использование для передачи/получения информации осуществляется с помощью средств языков программирования. Проблема совместного обращения двух процессов к одним и тем же данным (синхронизация доступа) решается с помощью семафоров[3].

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

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

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

int shmget(key_t key, size_t size, int flag)

Аргументы:

key – уникальный ключ, необходимый для создания идентификатора;

size – указывает требуемый размер сегмента в байтах;

flag – комбинация флагов доступа на чтение и запись.

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

void * shmat(int shmid, void *shmaddr, int flag),

Аргументы:

shmid – идентификатор разделяемой памяти, возвращенный shmget;

shmaddr – определяет желаемый адрес привязки сегмента (в большинстве случаев система сама выбирает начальный адрес для вызвавшего процесса);

flag – комбинация флагов доступа на чтение и запись.

По умолчанию сегмент подключается для чтения и записи, но в аргументе flag можно указать константу shm_rdonly, которая позволит установить доступ только на чтение. После завершения работы с сегментом его следует отключить вызовом int shmdt (void *shmaddr), который получает в качестве аргумента адрес, возвращенный функцией shmat. Эта функция не удаляет сегмент разделяемой памяти, а только снимает его привязку к процессу.

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

int shmctl(int shmid, int cmd, struct shmid_ds *buff)

Аргументы:

cmd может принимать следующие значения:

IPC_RMID – удаление сегмента с идентификатором shmid;

IPC_SET – установка значений полей структуры shmid_ds;

IPC_STAT – возвращает вызывающему процессу (через аргумент buff) текущее значение структуры shmid_ds для указанного сегмента разделяемой памяти.

Разделяемые сегменты памяти в Unix/Linux не имеют внешних имен. При получении идентификатора сегмента процесс пользуется числовым ключом. Гарантированно уникальный сегмент можно создать с использованием ключа IPC_PRIVATE, но такой ключ не может быть внешним. Поэтому сегменты используются, как правило, родственными процессами, которые имеют возможность передавать друг другу их идентификаторы, например, через наследуемые ресурсы или через параметры вызова дочерней программы. Таким образом, для создания монитора разделяемой памяти из таблицы системных вызовов следует получить адрес обработчика sys_ipc(), перехватить его, а затем, зная, какой из вышеописанных вызовов совершает система, считать соответствующие данные.

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

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

- симметричная прямая адресация – передающий процесс и процесс, принимающий данные, указывают имена своих партнеров по взаимодействию (посторонний процесс не может вмешаться в процедуру общения двух процессов);

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

Способ непрямой адресации. Передающий процесс помещает данные в промежуточный объект хранения (буфер, имеющий адрес[4]), из которого данные могут быть изъяты другим процессом. При этом передающий процесс не знает об идентификаторе процесса, который получит информацию, а принимающий процесс не знает об идентификаторе процесса, который передал информацию.

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

Однонаправленная связь (симплексная связь) – связь, при которой каждый процесс, ассоциированный с ней, может использовать средство связи только для приема информации или только для ее передачи.

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

- полудуплексная связь – двунаправленная связь с поочередной передачей информации в разных направлениях;

- дуплексная связь – двунаправленная связь с возможностью одновременной передачи информации в разных направлениях.

Для передачи данных по каналам связи используется две модели: поток ввода-вывода и сообщения.

1. Межпроцессное взаимодействие посредством потока ввода-вывода – передача данных через pipe (канал, трубу, конвейер), является одним из наиболее простых способов передачи информации между процессами по линиям связи. Pipe служит для организации однонаправленной или симплексной связи. Для использования одного канала в двух направлениях необходимы специальные средства синхронизации процессов. Более простой способ организации двунаправленной связи между родственными процессами заключается в использовании двух pipe.

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

Для организации потокового взаимодействия любых процессов в операционной системе применяется средство связи FIFO (First Input First Output) или именованный канал (Named pipe). FIFO подобен каналу, за одним исключением: данные о расположении FIFO в адресном пространстве ядра и его состоянии процессы могут получать не через родственные связи, а через файловую систему. Для этого при создании именованного канала на диске заводится файл специального типа, обращаясь к которому процессы могут получить интересующую их информацию. Для создания FIFO в операционной системе UNIX используется системный вызов mknod() или функция mkfifo(). В процессе работы они заводятся файл-метку, которая позволяет осуществить реальную организацию FIFO в памяти при его открытии с помощью системного вызова open().

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

В среде операционной системы Microsoft Windows NT каналы типа pipe используются для передачи данных между параллельно работающими процессами и позволяют организовать передачу данных между локальными процессами и между процессами, запущенными на рабочих станциях в сети. Через канал данные передаются только между двумя процессами. Один из процессов создает канал, другой открывает его. После этого оба процесса могут передавать данные через канал в одну или обе стороны, используя для этого функции, предназначенные для работы с файлами: ReadFile и WriteFile. Приложения могут выполнять над каналами Pipe синхронные или асинхронные операции, аналогично операциям, производимым с файлами. В случае использования асинхронных операций дополнительно реализуются механизм синхронизации процессов. Имена каналов в общем случае имеют следующий вид:

\\ИмяСервера\pipe\ИмяКанала

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

\\.\pipe\ИмяКанала

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

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

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

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

- адрес - набор символов, уникально определяющих процесс-отправитель и процесс-получатель;

- последовательный номер – номер, который является идентификатором сообщения и используется идентификации потерянных сообщений и дубликатов сообщений в случае отказов в сети;

- структурированная информация – информация, состоящая из поля типа данных, поля длины данных и поля значения данных.

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

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

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

 

<== предыдущая лекция | следующая лекция ==>
Потоки. Реализация мультипрограммирования | Механизмы синхронизации
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 3074; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.009 сек.