Средства межпроцессного обмена данными.

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

СРЕДСТВА МЕЖПРОЦЕССНОГО ВЗАИМОДЕЙСТВИЯ

 

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

Во многих операционных системах эти средства называются средствами межпроцессного взаимодействия — Inter Process Communications (IPC), что отражает историческую первичность понятия "процесс" по отношению к понятию "поток".

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

Средств, обеспечивающих взаимодействие между процессами, создано достаточно много. Огромное их количество было реализовано в Windows 9x, еще больше - в Windows XP. Классифицировать их, в общем случае, можно на два вида (рис.1):

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

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

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

 
 

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

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

− когда нужно уведомлять другие потоки о завершении каких-либо операций.

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

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

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

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

Обычно для синхронизации используются шесть типов объектов (рис.1):

− семафоры;

− критические секции (разделы);

− исключающие семафоры (объекты типа mutex);

− события;

− ожидающие таймеры;

− блокирующие переменные.

Все объекты синхронизации отличаются друг от друга условием установки состояний.

Объект синхронизации обладает двумя состояниями:

- сигнальным (signaled state);

- несигнальным (non signaled state).

Когда объект синхронизации находится в состоянии занятости, или несигнальном состоянии, выполнение ожидающего потока НЕ может быть продолжено. А когда объект синхронизации оказывается в сигнальном состоянии, ожидающий поток может продолжить свое выполнение.

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

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

- оно не станет сигнальным;

- не истечет время ожидания.

 

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

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

Эти средства, так же как и рассмотренные выше средства синхронизации процессов, относятся к классу средств межпроцессного взаимодействия, то есть IPC (Inter Process Communications).

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

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