Разница между pthread и fork в gnu / Linux - PullRequest
31 голосов
/ 01 апреля 2011

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

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

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

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

Ответы [ 3 ]

58 голосов
/ 15 декабря 2011

В C есть некоторые различия, однако:

вилка ()

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

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

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

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


pthread_create ()

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

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

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

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

5 голосов
/ 25 февраля 2012

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

5 голосов
/ 01 апреля 2011

Вы должны взглянуть на справочную страницу clone.

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

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

...