предисловие
Способ связи между процессами, собственно, мы им и пользуемся все время, но не будем на него обращать внимание. Если интервьюер спросит вас, сколько методов межпроцессного взаимодействия вы знаете, предполагается, что многие люди будут немного сбиты с толку. Сегодня мы обобщим методы связи между процессами.
трубопровод
Пайп, по-английски это пайп. Это очень важная концепция, с которой мы познакомимся, когда будем изучать командную строку Linux. Его изобретателем является Дуглас Макилрой, изобретатель ранней оболочки UNIX. После изобретения оболочки он обнаружил, что когда система работает для выполнения команд, часто возникает необходимость передать вывод одной программы другой программе для обработки, поэтому и появился конвейер.
Каналы можно разделить на две категории: анонимные каналы и именованные каналы.
Обычная команда Linux «|» на самом деле является анонимным каналом, что означает передачу вывода одного процесса другому процессу, например:
echo "Happyjava" | awk -F 'j' '{print $2}'
# 输出 ava
Кроме того, мы можем создать именованный канал с помощью команды mkfifo
mkfifo pipe
Процесс, который вводит данные в канал, будет заблокирован, ожидая, пока другие процессы прочитают данные из канала:
Если я не выполню команду cat pipe) всегда будет блокироваться.
очередь сообщений
Обратите внимание, что эта очередь сообщений не является нашим обычно используемым MQ, таким как kafka, RabbitMQ, RocketMQ и т. д.
Очереди сообщений предоставляют способ отправки блока данных от одного процесса к другому. Считается, что каждый блок данных содержит тип, и процесс-получатель может независимо получать структуры данных, содержащие разные типы. Мы можем избежать проблем синхронизации и блокировки с именованными каналами, отправляя сообщения. Но у очередей сообщений, как и у именованных каналов, есть предел максимальной длины для каждого блока данных.
Использование очередей сообщений для межпроцессного взаимодействия может иметь ограничения на максимальную длину блоков данных, что также является недостатком этого метода взаимодействия. Если связь между процессами происходит часто, процесс должен часто считывать данные из очереди в память, что эквивалентно косвенному копированию из одного процесса в другой, что требует времени.
Общая память
Общая памятьЭтот метод связи может очень хорошо сократить время, затрачиваемое на копирование. Когда система загружает процесс, память, выделенная для процесса, является не фактической физической памятью, а пространством виртуальной памяти. Затем мы можем позволить каждому из двух процессов взять часть виртуального адресного пространства и отобразить его в одну и ту же физическую память Таким образом, хотя два процесса имеют независимое пространство виртуальной памяти, некоторые из них отображаются в одну и ту же физическую память. На этом механизм разделения памяти завершен.
сигнал
В чем самая большая проблема с общей памятью? Да, это проблема многопроцессорной конкуренции за память, как мы обычно и говорим.потокобезопасностьпроблема. Как решить эту проблему? В это время нашсигнална поле.
Суть семафора — это счетчик, который используется для достижения взаимного исключения и синхронизации между процессами. Например, начальное значение семафора равно 1, а затем процесс для доступапамять 1Когда , мы устанавливаем значение семафора в 0, а затем процесс b также хочет получить доступпамять 1Когда вы видите, что значение семафора равно 0, вы знаете, что уже есть процесс, обращающийся кпамять 1В это время процесс b не сможет получить доступпамять 1. Итак, семафор — это еще и способ связи между процессами.
Socket
Это метод межпроцессного взаимодействия, который мы использовали.Например, когда наше приложение WeChat взаимодействует с сервером WeChat, мы фактически используем сокеты для связи.
Суммировать
Подводя итог, методы связи между процессами (Linux):
1. Трубопровод
2. Очередь сообщений
3. Общая память
4. Семафор
5. Розетка