IPC - Межпроцессное взаимодействие
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. - Удаленные
Сюда входят те механизмы, которые позволяют выполнять IPC по сети, например. - Высокоуровневые
Это, по сути, пакеты ПО, которые реализуют промежуточный слой между механизмами ОС и какими-то приложениями.Чаще всего, предназначены для общения отличающихся друг от друга ОС, либо для переноса существующих протоколов и решений на новую архитектуру.
Пару слов (туда-сюда?😱) о процессах
Процессы создаются только за счет дублирования других процессов (fork). Новый процесс будет называться дочерним, а исходный - родительским. Поэтому каждый процесс имеет как и обычный PID (process ID), так и PPID (parent PID).
Корневой процесс в linux (от которого и создаются другие процессы) - это init , который в современных линухах запускает systemd. Найти его в выводе ps
можно по его PID, который, естественно, равен 1:
Когда дочерний процесс завершается раньше родительского - последний не сразу узнает об этом и, таким образом, дочерний перейдет в статус Z (zombie). Уже когда parent получит инфу о том, что child завершился, тогда последний и исчезнет окончательно из различных записей ОС. При этом zombie процессы не нагружают никак ОС, просто инфа о них хранится в структурах ядра.
Статусы процессов
-
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 не дает процессам корректно завершаться.