Skip to main content

Що таке IPC (inter-process communication)?

Що таке IPC

IPC (Inter-Process Communication) - це механізм, який дозволяє процесам обмінюватися даними між собою.

Простіше кажучи:

якщо в тебе є два (чи більше) процеси, IPC дає їм "канал зв'язку", щоб вони могли надсилати й отримувати повідомлення (наче "розмовляють" через провід).

1. Навіщо потрібен IPC

Кожен процес:

  • працює у своєму адресному просторі (своя пам'ять, своє середовище),
  • ізольований від інших (з міркувань безпеки).

Тому вони не можуть напряму ділити змінні чи пам'ять. Щоб взаємодіяти - потрібен канал зв'язку.

IPC вирішує це, дозволяючи:

  • передавати дані (текст, JSON, буфери),
  • координувати роботу (сигнали, події),
  • синхронізувати стани між процесами.

2. Види IPC (у загальному сенсі, не лише в Node.js)

Тип IPCОписПриклад
Pipe (канал)Послідовна передача даних (один пише, інший читає)stdin/stdout
Message PassingПередача повідомлень (об'єктів) через системні сокети чи каналиNode.js process.send()
Shared MemoryСпільна пам'ять для швидкого обмінуSharedArrayBuffer
SocketsУніверсальний мережевий обмін між процесамиTCP/UDP
SignalsПрості сигнали ОС (SIGINT, SIGTERM)process.kill(pid, 'SIGINT')
Files / Named PipesОбмін через тимчасові файли / іменовані каналиUNIX socket, FIFO

3. IPC у контексті Node.js

У Node.js IPC вбудований у модулі:

  • child_process
  • cluster

Коли ти створюєш процес через:

javascript
const { fork } = require('child_process');

Node.js автоматично створює IPC-канал між батьком і дочірнім процесом.

Це дозволяє:

  • надсилати повідомлення (child.send(data));
  • отримувати їх (process.on('message', handler)).

4. Приклад IPC у Node.js

main.js

javascript
const { fork } = require('child_process'); // Створюємо дочірній процес const child = fork('worker.js'); // Надсилаємо повідомлення child.send({ task: 'compute', number: 5 }); // Отримуємо відповідь child.on('message', (msg) => { console.log('Відповідь від дочірнього процесу:', msg); });

worker.js

javascript
process.on('message', (msg) => { if (msg.task === 'compute') { const result = msg.number ** 2; process.send({ result }); } });

Що відбувається:

  • fork() створює IPC-канал між батьком і дочірнім процесом.
  • Батько надсилає об'єкт { task, number }.
  • Дочірній процес отримує його через process.on('message').
  • Після обробки - надсилає результат назад через process.send().

Це і є Inter-Process Communication у дії.

5. IPC у модулі cluster

Модуль cluster теж використовує IPC під капотом:

  • masterworker спілкуються через той самий механізм.
  • Можна передавати повідомлення вручну:
javascript
// master worker.send({ msg: 'ping' }); // worker process.on('message', (data) => { console.log('Повідомлення від майстра:', data); process.send({ reply: 'pong' }); });

Отже, cluster використовує IPC для обміну службовими подіями та даними користувача.

6. Як влаштований IPC під капотом у Node.js

Node.js реалізує IPC через Unix Domain Sockets (на Linux/macOS) чи Named Pipes (на Windows).

Тобто:

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

Ці повідомлення:

  • серіалізуються (наприклад, у JSON чи бінарний формат),
  • передаються внутрішнім каналом (pipe),
  • десеріалізуються на приймальній стороні.

7. IPC і серіалізація даних

Через IPC можна передавати:

  • об'єкти ({name: 'Tim'}),
  • рядки, числа, буфери,
  • навіть посилання на сокети чи файлові дескриптори.

Node.js автоматично серіалізує об'єкти під час передачі:

javascript
child.send({ user: 'Alice', age: 25 });

Але важливо:

  • не можна передавати функції чи посилання на контекст;
  • дані передаються за значенням, а не за посиланням.

8. Переваги IPC

ПеревагаОпис
Двосторонній зв'язокБатько й дочірній процес можуть обмінюватися даними
БезпекаКожен процес ізольований, тільки через канал
ПродуктивністьIPC усередині одного вузла швидший за HTTP
УніверсальністьПрацює між будь-якими Node.js процесами (fork, cluster)
Fault-toleranceПомилка в одному процесі не ламає інші

9. Недоліки IPC

НедолікОпис
Серіалізація/десеріалізаціяДодає затримку під час передачі великих об'єктів
Ізоляція пам'ятіНе можна напряму ділити дані (лише через копії)
Складність синхронізаціїЗа великої кількості процесів потрібно керувати чергами
Не для великих потоків данихКраще використовувати сокети чи стріми

Підсумок

КритерійОпис
ПризначенняЗв'язок між процесами
Реалізація в Node.jsЧерез fork() і cluster
НапрямокДвосторонній (parent ↔ child)
Тип данихJSON, рядки, буфери
Під капотомUnix Socket / Named Pipe
ПеревагиБезпечно, ізольовано, ефективно
НедолікиНе можна ділити пам'ять напряму

Висновок:

IPC (Inter-Process Communication) - це механізм, який дозволяє процесам у Node.js (чи ОС загалом) спілкуватися й передавати дані одне одному без спільного використання пам'яті.

У Node.js IPC використовується в модулях child_process і cluster, де процеси обмінюються повідомленнями через вбудований канал зв'язку.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.