Linux використовує модель різьблення 1-1, при цьому (до ядра) немає різниці між процесами та потоками - все це просто виконується завдання. *
У Linux системний виклик clone
клонує завдання із налаштованим рівнем спільного доступу, серед яких:
CLONE_FILES
: спільний доступ до тієї ж таблиці дескрипторів файлів (замість створення копії)
CLONE_PARENT
: не встановлюйте стосунки батько-дитина між новим завданням і старим (інакше дитина getppid()
= батько getpid()
)
CLONE_VM
: спільний обсяг пам’яті (замість створення копії COW )
fork()
дзвінки, що мають clone(
найменший обмін, )
і pthread_create()
дзвінки, що надають clone(
більшість )
. **
fork
ing коштує трохи більше, ніж pthread_create
ing через копіювання таблиць та створення відображень COW для пам'яті, але розробники ядра Linux намагалися (і досягли успіху) мінімізувати ці витрати.
Перемикання між завданнями, якщо вони мають один і той же простір пам'яті та різні таблиці, буде трохи дешевше, ніж якщо вони не поділяться, тому що дані вже можуть бути завантажені в кеш. Однак завдання комутації все ще дуже швидко, навіть якщо нічого не ділиться - це щось інше, що розробники Linux ядра намагаються забезпечити (і досягти успіху).
Справді, якщо ви в системі з декількома процесорами, НЕ обмін фактично може бути корисним для виконання: якщо кожна задача виконується на іншому процесорі, синхронізації спільно використовуваної пам'яті є дорогим.
* Спрощена. CLONE_THREAD
спричиняє поділ сигналів для спільного використання (що потрібно CLONE_SIGHAND
, яке розділяє таблицю обробки сигналів).
** Спрощений. Існують SYS_fork
і SYS_clone
sscall, але в ядрі є sys_fork
і sys_clone
обидва дуже тонкі обгортки навколо тієї ж do_fork
функції, яка сама по собі є тонкою обгорткою навколо copy_process
. Так, умови process
, thread
і task
використовуються як взаємозамінні , а в ядрі Linux ...