Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що таке IPC (inter-process communication)?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**IPC (Inter-Process Communication)** - механізм, що дозволяє ізольованим процесам обмінюватися даними; у Node.js він вбудований у `child_process`/`fork()` та `cluster` й реалізований через Unix Domain Sockets (Linux/macOS) чи Named Pipes (Windows). **Ключове:** через IPC не можна передавати функції чи посилання на контекст - лише серіалізовані дані (об'єкти, рядки, буфери).Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Що таке 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 під капотом: - **master** ↔ **worker** спілкуються через той самий механізм. - Можна передавати повідомлення вручну: ```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`, > де процеси обмінюються повідомленнями через вбудований канал зв'язку.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.