У чому різниця між виделкою та ниткою?


Відповіді:


94

Форк дає вам абсолютно новий процес, який є копією поточного процесу, з однаковими сегментами коду. У міру зміни образу пам'яті (як правило, це пов'язано з різною поведінкою двох процесів) ви отримуєте розділення зображень пам'яті (Copy On Write), однак виконуваний код залишається незмінним. Завдання не ділять пам’ять, якщо вони не використовують якийсь примітив Inter Process Communication (IPC) .

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


3
Можливо, ви хочете позначати "копію поточного процесу" як дочірній процес.

1
Проте сегмент тексту часто є спільним (віртуально), і навіть сегмент даних можна копіювати на запис.
Jé Queue


76

Виделка

Форк - це не що інше, як новий процес, який виглядає точно так само, як старий або батьківський процес, але все-таки це інший процес з різним ідентифікатором процесу та має власну пам’ять. Батьківський процес створює окремий адресний простір для дитини. І батьківський, і дочірній процеси мають однаковий сегмент коду, але виконуються незалежно один від одного.

Найпростіший приклад форкінгу - це коли ви запускаєте команду на оболонці в Unix / Linux. Щоразу, коли користувач видає команду, оболонка розгалужує дочірній процес і завдання виконується.

Коли видається системний виклик fork, створюється копія всіх сторінок, що відповідають батьківському процесу, завантажується в окреме місце пам'яті ОС для дочірнього процесу, але в певних випадках це не потрібно. Як і в системних викликах 'exec', немає необхідності копіювати сторінки батьківського процесу, оскільки execv замінює адресний простір самого батьківського процесу.

Кілька речей, на які слід звернути увагу при роздвоєнні:

  • Дочірній процес матиме власний унікальний ідентифікатор процесу.
  • Дочірній процес повинен мати власну копію дескриптора батьківського файлу.
  • Блокування файлів, встановлене батьківським процесом, не успадковується дочірнім процесом.
  • Будь-які семафори, відкриті в батьківському процесі, також повинні бути відкриті в дочірньому процесі.
  • Дочірній процес повинен мати власну копію дескрипторів батьківської черги повідомлень.
  • Дитина матиме власний адресний простір та пам’ять.

Нитки

Нитки - це легкі процеси (LWP). Традиційно, потік - це просто стан процесора (і деякий інший мінімальний стан) із процесом, що містить решту (дані, стек, введення / виведення, сигнали). Потоки потребують менших накладних витрат, ніж “розгалуження” або нерестування нового процесу, оскільки система не ініціалізує новий простір віртуальної пам'яті системи та середовище для процесу. Хоча найефективніший у багатопроцесорній системі, де процес планування може виконуватися на іншому процесорі, таким чином набираючи швидкість завдяки паралельній або розподіленій обробці, виграші також виявляються в однопроцесорних системах, які використовують затримку введення / виводу та інші системні функції, які можуть зупинити процес виконання.

Потоки в одному і тому ж процесі діляться:

  • інструкції щодо процесу
  • більшість даних
  • відкриті файли (дескриптори)
  • сигнали та обробники сигналів
  • поточний робочий каталог
  • ідентифікатор користувача та групи

Детальніше тут .


2
Процес може мати декілька потоків. Якщо один із потоків у процесі викликає форк, чи має роздвоєний процес повністю продубльовану пам’ять, але в новому процесі знаходиться лише викличний потік?
Майкл


29

Відповідь Dacav відмінна, я просто хотів додати, що не всі моделі різьблення дають вам справжню багатопроцесорність.

Наприклад, реалізація потоків за замовчуванням Ruby не використовує справжні потоки ОС / ядра. Натомість він імітує наявність декількох потоків, перемикаючись між об’єктами Thread в межах одного потоку / процесу ядра.

Це важливо для багатопроцесорних / багатоядерних систем, оскільки такі типи полегшених потоків можуть працювати лише на одному ядрі - від кількох потоків ви не сильно зашкодите продуктивності.

В іншому місці це має значення, коли один потік блокує (очікування вводу-виводу або виклик IOCTL драйвера), всі потоки блокують.

Сьогодні це не дуже поширене явище - більшість реалізацій потоків використовують потоки ядра, які не страждають від цих проблем, - але це варто згадати про повноту.

На відміну від цього, fork надає вам інший процес, який можна одночасно запускати на іншому фізичному процесорі під час виконання оригінального процесу. Деякі люди вважають, що IPC більше підходить для їхнього додатка, інші воліють створення потоків.

Хай щастить! Багатопотоковість є одночасно складною і корисною.


7
+1 за
вбивство

5

Потоки - це функції, які виконуються паралельно, fork - це новий процес із спадкуванням батьків. Потоки добре виконувати завдання паралельно, тоді як форки - це незалежний процес, який також працює одночасно. Нитки мають умови перегонів, і там контролюються семафори та замки або мьютекси, труби можна використовувати як у виделці, так і в різьбі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.