Осторожно: boring shi

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

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

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

Виды IPC

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

Пару слов о процессах

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

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

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

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

  • R (Run/Running) - Программа исполняется в данный момент
  • TПриостановлен. Находится в режиме трассировки, когда происходит отладка, к примеру.
  • SПрерываемый сон. Процесс ожидает какое-то событие.
  • DНепрерываемый сон. Процесс ожидает очень определенный сигнал от аппаратной части, не реагируя на другие. Например, когда процесс передает данные по USB/записывает что-то на диск и ожидает окончания передачи/записи.
  • ZChild процесс, выполнение, которого завершилось, но (по каким-то причинам) parent об этом не узнал. Появление zombie процессов говорит о проблемах в системе или даже в аппаратной части.

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

OOM Killer

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

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