Разница между pthread и fork в gnu / Linux

В чем принципиальная разница между pthread и fork w.r.t. linux с точки зрения различий в реализации и того, как меняется расписание (различается ли оно?)

Я запускал strace в двух похожих программах, одна с использованием pthreads, а другая с использованием fork, обе в конце концов сделали системный вызов clone () с разными аргументами, поэтому я предполагаю, что они по существу одинаковы в системе Linux, но с pthreads, которые легче обрабатывать в коде.

Может кто-нибудь дать подробное объяснение?

РЕДАКТИРОВАТЬ: см. Также связанный вопрос


person srinathhs    schedule 01.04.2011    source источник
comment
Я перечислил некоторые полезные отличия: stackoverflow.com/questions/3609469/   -  person Matt Joiner    schedule 02.04.2011


Ответы (3)


Однако в C есть некоторые отличия:

fork ()

  • Цель состоит в том, чтобы создать новый процесс, который станет дочерним процессом вызывающего.

  • Оба процесса выполнят следующую инструкцию после системного вызова fork ().

  • Создаются две идентичные копии адресного пространства, кода и стека компьютера, одна для родительского и дочернего.

Думая о вилке, как о человеке; Разветвление вызывает клонирование вашей программы (процесса), на котором выполняется скопированный код.


pthread_create ()

  • Цель состоит в том, чтобы создать новый поток в программе, которому задан тот же процесс, что и вызывающий

  • Потоки в одном процессе могут обмениваться данными с использованием общей памяти. (Будь осторожен!)

  • Второй поток будет делиться данными, открытыми файлами, обработчиками сигналов и их расположениями, текущим рабочим каталогом, идентификаторами пользователей и групп. Однако новый поток получит свой собственный стек, идентификатор потока и регистры.

Продолжая аналогию; ваша программа (процесс) получает вторую руку, когда создает новый поток, связанный с тем же мозгом.

person Gabriel Fair    schedule 15.12.2011
comment
+1 за указание на самое важное, на мой взгляд, различие: память используется совместно с процессом, тогда как fork будет жить своей собственной жизнью. - person Matthieu; 26.06.2014
comment
Выращивание второй руки - отличная аналогия! - person Sid Sahay; 05.02.2018

В Linux системный вызов clone клонирует задачу с настраиваемым уровнем совместного использования. fork() вызывает clone(least sharing) и pthread_create() вызывает clone(most sharing). разветвление стоит немного дороже, чем pthread_createing, из-за копирования таблиц и создания сопоставлений COW для памяти.

person Davood Hanifi    schedule 25.02.2012

Вам следует посмотреть справочную страницу clone.

В частности, в нем перечислены все возможные режимы клонирования и их влияние на процесс / поток, пространство виртуальной памяти и т. Д.

Вы говорите, что «потоки легче обрабатывать в коде»: это очень спорно. Написание многопоточного кода без ошибок и без взаимоблокировок может оказаться довольно сложной задачей. Иногда наличие двух отдельных процессов значительно упрощает работу.

person Mat    schedule 01.04.2011
comment
Итак, в конце концов, Linux обрабатывает и pthreads, и fork одинаково и планирует их одинаково? - person srinathhs; 01.04.2011
comment
да в общем. это не означает, что у вас не может быть разных политик планирования или что конкретный планировщик может применять разные настройки к группам потоков по сравнению с обычными старыми процессами. (fork реализуется через системный вызов clone, кстати.) - person Mat; 01.04.2011
comment
Вот почему Бог создал Эрланг. - person Farshid Ashouri; 08.05.2019