Skip to main content

Чим потоки відрізняються від процесів?

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.jscluster, child_processworker_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.jscluster, child_processworker_threads
Підходить дляІзольованих задач, API, мікросервісівCPU-важких задач усередині одного застосунку

Висновок:

Потоки - це "легкі" одиниці виконання всередині одного процесу. Процеси - це "важкі", повністю ізольовані екземпляри програми.

У Node.js потоки (worker_threads) застосовуються для паралельних обчислень, а процеси (cluster, child_process) - для масштабування й ізоляції.

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

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

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