Подтвердить что ты не робот

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

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

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

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

EDIT: см. также связанный question

4b9b3361

Ответ 1

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

вилка()

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

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

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

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


pthread_create()

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

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

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

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

Ответ 2

Вы должны посмотреть man-страницу clone.

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

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

Ответ 3

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