Skip to content

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

IPC (Inter-process communication) - механизм, который позволяет процессам обмениваться инфой друг с другом. Это происходит на уровне ядра ОС.
IPC может быть локальным и распределенным (между разными хостами).

Способы/механизмы межпроцессного взаимодействия:

  • Файлы
    Самый простой способ. Один процесс пишет файл, второй (зная имя файла) читает его (может и сам написать что-то для первого процесса)
  • Pipes
    Если не хочется, в случае с файлом, хранить данные на диске, то пайпы - вариант. Могут быть именованными и анонимными.
    Именованный пайп похож на файл тем, что имеет запись в файловой системе, но нигде не хранится. Т.к. его расположение известно, то оба процесса могут получить к нему доступ.
    Но если два процесса как-то связаны, к примеру, parent и child, то они могут использовать для взаимодействия анонимный пайп. Для этого перед тем, как parent форкнется, (чтобы создать child) он создает анонимный пайп, а child унаследует его.
  • Sockets
    Сокеты позволяют передавать данные между процессами через сеть или локально. Используются для реализации клиент-серверных приложений, например.
  • Shared memory (Разделяемая/совместно используемая память)
    Процессы используют общую область памяти. Используется для передачи больших объемов памяти между процессами или для синхронизации работы нескольких процессов, имеющих доступ к общим ресурсам (БД или файлы, к примеру).
  • Сигналы
    Иногда нужно передать процессу не какие-то данные, а управляющую инфу по типу "остановить выполнение", "возобновить выполнение" и т.д. Для этого в linux есть сигналы. Это тот же kill -9 <PID> (как один из примеров), где отправляется сигнал SIGKILL процессу по его PID ^a60d9c
  • Семафоры
    Семафоры позволяют процессам блокировать доступ к ресурсам, которые уже используются, чтобы избежать ошибок. По сути, это способ управления доступом к общим ресурсам (разделяемая память или файлы, доступные для нескольких процессов).
  • Очереди сообщений
    Пример: один процесс помещает сообщение в очередь таких же сообщений, а другой процесс может его прочитать. Такой способ IPC (не он один, а еще и сигналы, сокеты и т.п.) позволяет обмениваться данными асинхронно, то есть, процесс-отправитель дальше может работать, не ожидая ответа от процесса-получателя.
  • Оконные сообщения (в windows)
    Используются в ОС c GUI. Используются для передачи инфы (нажатия кнопок и перемещения мыши, например) между окнами, приложениями и компонентами внутри приложений.

Все эти способы делятся на три группы: виды IPC.👇

Виды IPC

  • Локальные
    Средства локального межпроцессного взаимодействия привязаны к процессору и возможны только в пределах одного ПК. Сюда входят все основные способы IPC.
  • Удаленные
    Сюда входят те механизмы, которые позволяют выполнять IPC по сети, например.
  • Высокоуровневые
    Это, по сути, пакеты ПО, которые реализуют промежуточный слой между механизмами ОС и какими-то приложениями.Чаще всего, предназначены для общения отличающихся друг от друга ОС, либо для переноса существующих протоколов и решений на новую архитектуру.

Пару слов (туда-сюда?😱) о процессах

Процессы создаются только за счет дублирования других процессов (fork). Новый процесс будет называться дочерним, а исходный - родительским. Поэтому каждый процесс имеет как и обычный PID (process ID), так и PPID (parent PID).
Корневой процесс в linux (от которого и создаются другие процессы) - это init , который в современных линухах запускает systemd. Найти его в выводе ps можно по его PID, который, естественно, равен 1:

Bash
ps -p 1
# IPC - Межпроцессное взаимодействие
ps -fp 1

Когда дочерний процесс завершается раньше родительского - последний не сразу узнает об этом и, таким образом, дочерний перейдет в статус Z (zombie). Уже когда parent получит инфу о том, что child завершился, тогда последний и исчезнет окончательно из различных записей ОС. При этом zombie процессы не нагружают никак ОС, просто инфа о них хранится в структурах ядра. ^a25ea4

Статусы процессов

  • R (Run/Running) - Программа исполняется в данный момент

  • T - Приостановлен.
    Находится в режиме трассировки, когда происходит отладка, к примеру.

  • S - Прерываемый сон.
    Процесс ожидает какое-то событие.

  • D - Непрерываемый сон.
    Процесс ожидает очень определенный сигнал от аппаратной части, не реагируя на другие. Например, когда процесс передает данные по USB/записывает что-то на диск и ожидает окончания передачи/записи.

  • Z - Child процесс, выполнение, которого завершилось, но (по каким-то причинам) parent об этом не узнал.
    !! Появление zombie процессов говорит о проблемах в системе или даже в аппаратной части.

А если parent завершился раньше child-а, то такие называются процессами-сиротами и автоматом 'усыновляются' процессом init, который принимает сигналы о завершении этого осиротевшего процесса.


OOM Killer

Out Of Memory Killer - это процесс/механизм ядра linux, убивающий процессы при исчерпании RAM. Освободившаяся память передается ядру, а после перенаправляется тому процессу, которому ее и не хватало.

OOM Killer в первую очередь выбирает для SIGKILL-а юзер-процессы, которые много кушают памяти, а уже в последнюю очередь - системные процессы root. Естественно, без траблов вышеописанное не обходится (при частом срабатывании), ибо сигнал SIGKILL не дает процессам корректно завершаться.


IPC #CS