Inter-process Communication (IPC) — подробное руководство по механизму/программе

Inter-process Communication (IPC) — подробное руководство по механизму/программе

IPC – это, понятие, связанное с операционной системой, но есть смысл разобраться в том, что это такое, более подробно.

Этим и займемся.

Cодержание:

Теоретическая страничка

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

А теперь представьте, что привычная для нас работа нашей ОС превратилась в своего злого двойника, который не просто не похож на свой оригинал, но еще и выполняет все свои обязанности.

Рис. 1. Если хотя бы одна шестерня перестанет крутиться, то вся система перестанет работать справно

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

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

Рис. 2. Если не будет передачи актуальных данных, то все процессы и вычисления будут неправильны

Хоть «ядро» нашего компьютера запрограммировано искать информацию в каком-то определенном источнике, принцип роботы по сути тот же.

Рис. 3. Активный поиск информации

Читайте также:

Принцип работы

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

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

Такие механизмы или программы носят название «межпроцессорное взаимодействие» – с перевода Inter-process Communication (IPC).

Работает данная программа непосредственно в самой операционной системе, и является основой для передачи любой информации.

Рис. 4. Потоки информации

Примеры работы IPC

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

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

Более старые версии современного IPC присутствовали еще в MS-DOS.

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

В то время решение данного вопроса было очень проблематичным.

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

В современной сети данные проблемы уже давно никого не беспокоят. Вот вам краткий наглядный пример работы в таких сетях.

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

  • браузер у вас в системе;
  • сервер – в любой другой системе или абсолютно в любом месте.

И вы совершенно не задаетесь вопросом, какая у серверов операционная система.

Затрагивая общий принцип работы таких форм как IPC, и не только таких, как она, используется в основном концепция «клиент-сервер».

Понятно, что «клиент» — это приложение, которое запрашивает информацию, а запрос информации идет уже к «серверу» — приложению которое предоставляет нужную информацию.

Рис. 5. Принцип действия сети

Общее положение

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

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

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

Рис. 6. Чем выше уровень технологии, тем больше на него спрос

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

Данные критерии имеют очень высокую важность в роботе нашего компьютера.

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

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

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

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

Три основных вида IPC

  • Локальный

Этот вид IPC полностью привязан к своему компьютеру, работа осуществляется только в пределах одной системы (компьютера).

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

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

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

  • Удаленный

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

  • Высокоуровневый

Последний и, пожалуй, один из самых тяжелых в использовании вид IPC – высокоуровневый.

Данный вид представляет собой пакет программного обеспечения.

Этот пакет данных создает так называемый «промежуточный слой», который предоставляет возможность общения между системной платформой и приложением.

Читайте также:

Обеспечение корректной работы обмена данных

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

Вот примеры их области деятельности:

Рис. 7. Очередь процессов для записи данных

А что насчет тех процессов, которые требуют неотъемлемой скорости своего решения?

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

Также, существует термин, который и в теории, и на практике обоснован своим названием – это тупик.

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

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

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

Также они должны быть построены строго в восходящем порядке номеров.

Рис. 8. Наглядный «тупик»

Современные примеры работы ICP

Чтобы наглядно изобразить взаимодействие программ на одном компьютере, существует знакомый нам ресурс – буфер обмена.

Не удивляйтесь, наш старый добрый буфер обмена также является одной из механизмов IPC.

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

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

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

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

Стоит заметить, что множество из них были реализованы в Windows 9x, а еще большее количество в Windows NT/2000.

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

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

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

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

Средства System V IPC. Организация работы с разделяемой памятью в UNIX. Понятие нитей исполнения (thread)

Преимущества и недостатки потокового обмена данными.

На предыдущем семинаре мы познакомились с механизмами, обеспечивающими потоковую передачу данных между процессами в операционной системе UNIX , а именно с pip ‘ами и FIFO . Потоковые механизмы достаточно просты в реализации и удобны для использования, но имеют ряд существенных недостатков:

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

Понятие о System V IPC

Указанные выше недостатки потоков данных привели к разработке других механизмов передачи информации между процессами. Часть этих механизмов, впервые появившихся в UNIX System V и впоследствии перекочевавших оттуда практически во все современные версии операционной системы UNIX , получила общее название System V IPC (IPC – сокращение от interprocess communications ). В группу System V IPC входят: очереди сообщений, разделяемая память и семафоры. Эти средства организации взаимодействия процессов связаны не только общностью происхождения, но и обладают схожим интерфейсом для выполнения подобных операций, например, для выделения и освобождения соответствующего ресурса в системе. Мы будем рассматривать их в порядке от менее семантически нагруженных с точки зрения операционной системы к более семантически нагруженным. Иными словами, чем позже мы начнем заниматься каким-либо механизмом из System V IPC , тем больше действий по интерпретации передаваемой информации придется выполнять операционной системе при использовании этого механизма. Часть этого семинара мы посвятим изучению разделяемой памяти . Семафоры будут рассматриваться на семинаре 8, а очереди сообщений – на семинаре 9.

Пространство имен. Адресация в System V IPC. Функция ftok()

Все средства связи из System V IPC , как и уже рассмотренные нами pipe и FIFO , являются средствами связи с непрямой адресацией . Как мы установили на предыдущем семинаре, для организации взаимодействия неродственных процессов с помощью средства связи с непрямой адресацией необходимо, чтобы это средство связи имело имя. Отсутствие имен у pip ‘ов позволяет процессам получать информацию о расположении pip ‘а в системе и его состоянии только через родственные связи. Наличие ассоциированного имени у FIFO – имени специализированного файла в файловой системе – позволяет неродственным процессам получать эту информацию через интерфейс файловой системы.

Множество всех возможных имен для объектов какого-либо вида принято называть пространством имен соответствующего вида объектов. Для FIFO пространством имен является множество всех допустимых имен файлов в файловой системе. Для всех объектов из System V IPC таким пространством имен является множество значений некоторого целочисленного типа данных – key_t – ключа. Причем программисту не позволено напрямую присваивать значение ключа, это значение задается опосредованно: через комбинацию имени какого-либо файла, уже существующего в файловой системе, и небольшого целого числа – например, номера экземпляра средства связи.

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

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

Получение значения ключа из двух компонентов осуществляется функцией ftok() .

Функция для генерации ключа System V IPC

Inter-Process Communication Recommendation [closed]

Want to improve this question? Update the question so it’s on-topic for Stack Overflow.

Closed 5 years ago .

I’m searching for a light-weight, fast and easy way to handle Inter Process Communication between some programs on a Linux machine.

Currently, I’m thinking Named Pipe, because it’s provided by the OS itself. Are there any caveats about the performance or usability?

Would Shared Memory be better?

I don’t think I need a super-complex Framework.

Please point me in the right direction, thanks!

Update: I want to build a small program (daemon) that tells other programs (which it itself starts) to pause, report their status back, stop etc.

So the other program should be notified that a new command is waiting for it. A pipe is not ideal for that, is it?

6 Answers 6

Boost has a nice InterProcess library that is cross-platform and quite intuitive.

I have only toyed with it though, so there might be better alternatives out there.

However, if you don’t really need shared memory, I would stick with a messaging approach. You’ll avoid deadlocks and race conditions. The pipe principle is really great, and it even allows for lazy behaviors which may save you a lot of processing depending on the matter at hand!

As you have seen, you can use for inter process communication :

  • Shared memory
  • Named pipes
  • TCP/UDP sockets (eventually local ones)

Shared memory has the advantage of performance, because you do not have any buffer when sending/receiving messages. But you have to synchronise your data exchanges whith another IPC. It can be IPC semaphores or . named pipes or sockets.

When performance is not the main goal, I tend to prefer sockets as their use is simple and can be extended to inter computer communication.

The best way is to abstract your communication with a class that can use shared memory when the two processes are on the same computer and sockets if not. Then You have to choose between UDP and TCP 😉

For synchro / buffer exchange, prefer TCP as it more reliable.

I do not use named pipes as I prefer socket for the possibility to use inter computer communicationand of course you can find a lot of portable socket libraries.

For synchronisation, shared mem is perhaps not the best tool. In your case it can be used by sharing a small memory space, with a space for each process that wait for commands. You can either poll for any incomming command or use a shared semaphore. The fastest way is your processes waiting for named semaphores and reading a shared mem space for their commands/parameters. Using named pipes is surely simplier but not that fast. You surely do not need to be that fast ? Anyway abstract that in a class that models your exchange protocol and try the two ways 🙂

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

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

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

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

Во многих операционных системах эти средства называются средствами межпроцессного взаимодействия — 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 становится необходим в том случае, если поток одного процесса должен передать данные потоку другого процесса.

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

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

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

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

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

Во многих операционных системах эти средства называются средствами межпроцессного взаимодействия — 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 становится необходим в том случае, если поток одного процесса должен передать данные потоку другого процесса.

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

Лучшие изречения: Только сон приблежает студента к концу лекции. А чужой храп его отдаляет. 8829 — | 7544 — или читать все.

188.163.64.21 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

Inter-Process Communication (IPC) для ОС Windows с C

У меня есть старая программа, написанная на C с использованием Microsoft Visual C ++, и мне нужно, чтобы реализовать какое-то «KeepAlive», так что я могу получить это думало межпроцессное взаимодействие в новую программу, которая будет убивать и повторно запустить первый, если нет тзда не был получен в течение последних 5 секунд.

Проблема заключается в том, что я искал любой учебник или пример IPC для Windows, на языке C, но почти все, что я нашел для C ++.

Любая помощь или ресурс?

EDIT: Как @Adriano предложил в ответах, я пытаюсь использовать разделяемую память. Но программа запуска в настоящее время завершается Windows, из-за какого-то исключения, я не в состоянии поймать. Случается при вызове CopyMemory.

Код выглядит следующим образом:

Из ОП и различных комментариев, это звучит так, как будто главная цель состоит в том, чтобы определить, если приложение зависло. Несколько довольно простых способов, чтобы создать своего рода «сердечного ритма», который может контролироваться другим приложением будет либо совместно используемой памяти или именованный семафор.

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

С именем семафора ( CreateSemaphore и OpenSemaphore ), вы могли бы сделать в принципе то же самое. Есть отслеживаемое приложение сигнализировать его периодически и иметь монитор ждать на него , чтобы убедиться , что это был сигнал.

Если ваш старый приложение C имеет сообщение насоса (так как он имеет пользовательский интерфейс) может быть самым простым способом проверить , если он жив , или нет, IsHungAppWindow () функции и Windows , будут делать вещи для вас.

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

EDIT
Я думаю , что небольшой пример прояснит гораздо больше , чем тонны слов. В этом примере я буду использовать общую память , но вы можете использовать все , что вы предпочитаете (и вы чувствуете себя более комфортно). Это непроверенное так , пожалуйста , используйте его только в качестве ссылки.

Процесс MONITOR, должен быть запущен первым.

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

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

Функции таймера поддерживаются, начиная с Windows 2000, убедитесь, что _WIN32_WINNT макрос определяется с 0x0500 (или более).

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

KasperskyOS: запрещено все, что не разрешено

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

В 2016 году компания «Лаборатория Касперского» объявила о выводе на рынок своей операционной системы, предназначенной для обеспечения безопасной работы сетевых устройств, защищенных не только от воздействий извне, но и друг от друга.

Работа над KasperskyOS началась в 2002 году с идеи о том, что индустрии требуется полноценная безопасная операционная система, обеспечивающая превентивную защиту от злоумышленников. На тот момент решения по обеспечению безопасности были в роли догоняющих — сначала «плохие» ребята находили какую-нибудь дыру в системе, а потом «хорошие» парни бросались ее закрывать, и инициатива всегда принадлежала первым. А что, если сделать операционную среду, в которой вообще будет невозможно каким-либо программам выполнять посторонние функции? Например, сегодня никто из разработчиков ПО и оборудования смартфона не может гарантировать, что при выполнении умножения 2 на 2 на калькуляторе мобильного устройства оно не будет параллельно отправлять SMS или связываться с сервером. В большинство существующих ОС изначально не закладывались меры безопасности, поэтому соответствующие инструменты обеспечения надежности интегрировались в них в виде дополнительных модулей и функций, что не решало фундаментальной проблемы уязвимости.

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

В качестве теоретической базы разработчики KasperskyOS использовали книги «Радужной серии», в которых описываются стандарты информационной безопасности, сформулированные в США в период с 1980 по 1990 год и ставшие с тех пор эталонными [1]. В них, в частности, отмечается, что безопасность компьютерных систем никогда не будет идеальной и правильнее говорить не о безопасных, а о доверенных системах. В одной из книг описывается концепция доверенной вычислительной базы (Trusted Computer Base, TCB) — совокупности механизмов, реализующих политику безопасности и определяющих степень доверия к системе. TCB предусматривает «мониторинг обращений» для контроля всех взаимодействий компонентов системы между собой, с системными функциями и с оборудованием. Все без исключения взаимодействия происходят только по указанию и с разрешения TCB, а основное правило — «запрещено все, что не разрешено».

KasperskyOS — микроядерная операционная система, в ядре которой (рис. 1) прописаны диспетчер процессов, механизм межпроцессного взаимодействия (inter-process communication, IPC) и система мониторинга обращений (reference monitor), получившая название Kaspersky Security System (KSS). Все остальные процессы и компоненты: управление памятью и периферийными устройствами, драйверы файловых систем и т. п. — в данном случае работали бы против концепции безопасности.

Рис. 1. Архитектура Kaspersky OS

Процессы в ОС взаимодействуют между собой и с функциями ядра, отправляя и получая IPC-сообщения. Для каждого из этих сообщений KSS решает, разрешить (allow) его или запретить (deny). Применяется принцип default deny «по умолчанию»: если KSS не обнаруживает четкого правила, разрешающего то или иное действие, оно запрещается.

При написании приложений для Kaspersky OS используется особый подход — «компонентная модель», в основе которой лежит понятие «сущности» (entity). Сущностью может быть как целая программа, так и ее отдельная функция. Программа включает в себя набор компонентов со своими сущностями, и, таким образом, выполнение программы в Kaspersky OS превращается в IPC-переписку сущностей.

Чтобы участвовать в переписке, сущность обязана удовлетворять одному важному условию: в ней должен присутствовать код интерфейса доступа к механизму микроядра IPC. Нужно отметить, что разработчик не участвует в создании этой части кода, код автоматически генерируется из описания интерфейса на IDL (Interface Definition Language) — С++-подобном языке спецификации интерфейсов. Cтрогая типизация IDL позволяет проводить формальную верификацию корректности взаимодействия одной сущности с другой и проверять код на безошибочность.

С помощью кода интерфейса формируются две функции: Proxy для клиентских приложений и Dispatch — для серверных. Клиентское приложение вызывает функцию серверного приложения или ядра системы, передает параметры функции Proxy и сериализует их (то есть упаковывает в формат IPC-сообщения). Затем приложение вызывает транспортную функцию IPC в микроядре, передает ей созданное IPC-сообщение, ждет ответного IPC-сообщения, десериализует его (распаковывает параметры для вызываемой функции) и передает сделавшему вызов базовому коду клиента. Функция Dispatch делает обратное: получает IPC-сообщение, десериализует его, передает параметры базовому коду связанного с интерфейсом сервиса и, наконец, сериализует результат в IPC-сообщение.

Если в сущности имеется много разных функций, то они описываются на языке CDL (Component Definition Language). Специально разработанный компилятор Nk генерирует единый в рамках компонента код с интерфейсом, который на самом деле представляет собой совокупность Dispatch-интерфейсов всех входящих функций.

Для описания многокомпонентных сущностей имеется язык EDL (Entity Definition Language), с помощью которого описываются также и отдельные функции с собственными Dispatch-интерфейсами. При компилировании EDL-файла формируется общий код сущности с единым Dispatch-интерфейсом. Найти адресата для него можно по уникальному идентификатору Runtime Interface ID (RIID), который генерируется на этапе компиляции EDL-описания сущности. Такая вложенность типизированных спецификаций позволяет создавать сложные программы, в которых каждая функция будет снабжена собственным Proxy- или Dispatch-интерфейсом.

IPC-взаимодействие — это дело двух сущностей, в чем-то напоминающее технологию P2P, однако, в отличие от нее, происходящее по принципу рандеву. Чтобы рандеву состоялось, создается канал обмена IPC-сообщениями путем выделения сущностям глобальных системных дескрипторов (указателей, handle), идентифицирующих сущности отправителя и получателя. Как только сущности становятся владельцами своих дескрипторов, открывается IPC-канал. Каждая сущность знает только о выделенном ей дескрипторе, а об их паре знает только механизм IPC. Формирование IPC-канала называется «спариванием дескрипторов» (handles pairing). После спаривания посторонний участник не может вклиниться в диалог, а канал остается открытым до тех пор, пока сущности остаются владельцами дескрипторов. Модель IPC-взаимодействия handles pairing запатентована «Лабораторией Касперского».

Никто не может вклиниться в IPС-диалог, однако система KSS может просматривать проходящие по каналу сообщения. В составе KSS выделяются две основные части:

  • модуль Security Server, принимающий решение о вердикте на основе политики безопасности (рис. 2);
  • структура Decision Cache, хранящая вердикты по отдельным политикам для повышения производительности перлюстрации.
Рис. 2. Принцип работы Kaspersky Security System

Решение разрешать или запрещать IPC-взаимодействие принимается в соответствии с политикой безопасности, которая зависит от свойств и целей системы. Политика безопасности описывается с помощью формального аппарата — например, в терминах темпоральных логик. Чтобы связать конкретные действия сущностей с конкретными политиками безопасности, был разработан декларативный язык конфигураций безопасности CFG. Конфигурация безопасности, составленная на этом языке, в сочетании с IDL-описанием интерфейса сущности позволяет компилятору Nk сгенерировать структуру данных Gate с уникальным идентификатором SID (Security ID). Эта структура связывает сущность с политикой безопасности, и если у сущности нет структуры Gate, то к ней применяется принцип default deny и она отбрасывается.

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

Есть два способа создания приложений, работающих под управлением KasperskyOS:

  • Перенос существующих приложений, использующих POSIX API. После переноса процессы, происходящие внутри такого ПО, не будут контролироваться ОС, однако его внешние связи будут безопасными.
  • Разработка новых приложений. С точки зрения обеспечения безопасности это лучший вариант: функции будут проверены системой, и при написании кода программисту не надо задумываться о безопасности. Писать для операционной системы KasperskyOS не сложнее, чем для Linux, — здесь используется тот же API, а дополнительный инструментарий и языки, поставляемые в KasperskyOS SDK (компилятор Nk, > ***

Система KasperskyOS предназначена для управления индустриальными сетями (PLC-контроллеры, SCADA-системы), телекоммуникационным оборудованием, «умными» автомобилями и устройствами Интернета вещей в целом. В планах развития ОС — разработка дополнительных функциональных моделей, упрощающих как применение системы, так и создание безопасных приложений, работающих под ее управлением.

Ссылка на основную публикацию