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