Чим потоки відрізняються від процесів?
1. Що таке процес (process)
Процес - це окремий екземпляр програми, запущений операційною системою.
Кожен процес має:
- свою пам'ять (heap) і контекст виконання,
- свої глобальні змінні, оточення, файлові дескриптори,
- свій простір адрес, недоступний іншим процесам напряму.
Приклад:
Якщо ти запустиш три команди node app.js у терміналі -
ОС створить три незалежні процеси Node.js, не пов'язані між собою.
2. Що таке потік (thread)
Потік - це одиниця виконання всередині процесу.
Усі потоки одного процесу:
- діляться спільною пам'яттю (heap, ресурси, модулі),
- виконуються паралельно на різних ядрах,
- але мають свій власний стек викликів (call stack).
Приклад:
Коли ти створюєш new Worker() через модуль worker_threads,
- ти не запускаєш новий процес,
- а створюєш новий потік усередині того самого процесу Node.js.
3. Ключова відмінність між процесами й потоками
| Критерій | Процес | Потік |
|---|---|---|
| Пам'ять (heap) | Ізольована, у кожного своя | Спільна між потоками |
| Виконання | Незалежне, ізольоване | У межах одного процесу |
| Взаємодія | Через IPC (повільно) | Через спільну пам'ять (SharedArrayBuffer, Atomics) |
| Безпека | Висока ізоляція (помилка не впливає на інші) | Помилка може пошкодити спільні дані |
| Ресурси ОС | Потребує більше пам'яті й CPU | Легковаговий |
| Запуск | Повільний (новий екземпляр Node.js) | Швидкий (у межах одного процесу) |
| Контекст Node.js | Свій event loop, свої модулі | Спільний процес, але своя ізоляція |
| Приклади в Node.js | cluster, child_process | worker_threads |
4. Приклади в контексті Node.js
Процеси (cluster, child_process)
javascript
const { fork } = require('child_process');
const child = fork('child.js');
child.on('message', msg => console.log('Відповідь від процесу:', msg));
child.send('Привіт');Тут:
- створюється новий процес Node.js,
- у нього своя пам'ять і event loop,
- обмін даними йде через IPC (inter-process communication),
- помилка в дочірньому процесі не "завалить" головний.
Потоки (worker_threads)
javascript
const { Worker } = require('worker_threads');
const worker = new Worker('./task.js', { workerData: 42 });
worker.on('message', result => console.log('Результат:', result));Тут:
- створюється новий потік у межах того самого процесу,
- пам'ять спільна (через SharedArrayBuffer),
- спільні модулі й оточення,
- працює швидше, але помилка може вплинути на весь процес.
5. Аналогія
| Ситуація | Що ілюструє |
|---|---|
| Процеси | Різні квартири в будинку - у кожної свої кімнати, кухня, ванна. Не діляться нічим спільним. |
| Потоки | Кімнати в одній квартирі - спільні стіни й комунікації, але кожен живе окремо. |
6. Коли що використовувати
| Сценарій | Краще використовувати |
|---|---|
| Потрібна ізоляція, стабільність | Процеси (cluster, child_process) |
| Потрібна висока швидкість обміну й спільна пам'ять | Потоки (worker_threads) |
| Багато CPU-ядер, важкі обчислення | Потоки чи процеси - залежно від задачі |
| Потрібна стійкість (помилка в одному не ламає решту) | Процеси |
| Мікросервіси, API, fork-запуск | Процеси |
| Алгоритми, парсинг, шифрування | Потоки |
7. Як Node.js їх використовує під капотом
- Основний JavaScript код у Node.js працює в одному потоці (main thread).
- Усі I/O операції (читання файлів, мережа тощо) виконуються в пулі потоків (libuv thread pool).
- За потреби ти можеш вручну створювати нові потоки (worker_threads) або нові процеси (cluster) для масштабування.
Підсумок
| Параметр | Процес | Потік |
|---|---|---|
| Ізоляція | Повна | Часткова |
| Пам'ять | Окрема | Спільна |
| Взаємодія | Повільна (через IPC) | Швидка (через спільну пам'ять) |
| Помилка одного впливає на інших | Ні | Так, може |
| Продуктивність | Важча | Легша |
| Приклад у Node.js | cluster, child_process | worker_threads |
| Підходить для | Ізольованих задач, API, мікросервісів | CPU-важких задач усередині одного застосунку |
Висновок:
Потоки - це "легкі" одиниці виконання всередині одного процесу. Процеси - це "важкі", повністю ізольовані екземпляри програми.
У Node.js потоки (
worker_threads) застосовуються для паралельних обчислень, а процеси (cluster,child_process) - для масштабування й ізоляції.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.