Саме запитання більше відноситься до Computer Science, але його досить часто задають на Node.js інтервʼю, тому має сенс розібрати його саме в цій категорії. Для початку розберемося з визначенням процесу і потоку.
Процес - це окремо запущена програма, якій виділяє ресурси операційна система. Ключова ідея процесу полягає в ізоляції, тому проблеми в одному процесі напряму не впливають на інші, а комунікація відбувається через IPC (inter-process communication), наприклад через pipes, sockets…
Потік - це послідовність інструкцій, що виконується в межах процесу і має власний контекст виконання (Thread Execution Context). Так як потоки існують в межах процесу, вони використовують спільну памʼять, що робить їх чудовим рішенням для паралельних задач. Також, через відсутність необхідності в IPC, потоки працюють набагато швидше, ніж процеси.
Нижче наведена схема типового Node.js API, який використовує декілька процесів. Тут чітко видно, що потоки знаходяться в середині процесів, а сам процес - це ізольований контейнер.
Також, зверніть увагу на іконки Libuv - вони є як в процесі, так і в дочірніх потоках. Це означає, що при створенні потоку/процесу буде створено окремий Event Loop.
Підсумуємо основні відмінності
- Процес це так званий top-level контейнер
- Кожен процес має свою памʼять тоді як потоки використовують спільну
- Життєвий цикл процеса незалежний, тоді як потік залежить від процеса
- Комунікація між процесами повільніша і не така ефективна, як між потоками.