Разница между pthread и fork на gnu/Linux
В чем основное отличие между pthread и fork w.r.t. Linux в терминах
различия в реализации и то, как меняется расписание (меняется ли оно?)
Я работал с двумя аналогичными программами, используя pthreads, а другой использовал fork,
оба в конце делают clone() syscall с разными аргументами, поэтому я угадываю
они по существу одинаковы в системе linux, но с pthreads проще
для обработки кода.
Может кто-нибудь дать глубокое объяснение?
EDIT: см. также связанный question
Ответы
Ответ 1
В C есть некоторые отличия:
вилка()
-
Цель состоит в том, чтобы создать новый процесс, который становится дочерним процессом вызывающего
-
Оба процесса будут выполнять следующую команду после системного вызова fork()
-
Две идентичные копии адресного пространства, кода и стека компьютера создаются для родительского и дочернего.
Размышление о вилке, как о человеке; Викинг вызывает клонирование вашей программы (процесса), на которой выполняется скопированный код.
pthread_create()
-
Цель состоит в том, чтобы создать новый поток в программе, которому предоставляется тот же процесс вызывающего
-
Потоки одного и того же процесса могут взаимодействовать с использованием общей памяти. (Будьте осторожны!)
-
Второй поток будет делиться данными, открывать файлы, обработчики сигналов и расположение сигналов, текущий рабочий каталог, идентификаторы пользователей и групп. Новый поток получит свой собственный стек, идентификатор потока и регистры.
Продолжая аналогию; ваша программа (процесс) растет второй рукой, когда она создает новый поток, связанный с тем же мозгом.
Ответ 2
Вы должны посмотреть man-страницу clone
.
В частности, в нем перечислены все возможные режимы клонирования и их влияние на процесс/поток, пространство виртуальной памяти и т.д.
Вы говорите, что "нить легче обрабатывать в коде": что очень спорно. Написание безболезненного, безболезненного многопоточного кода может быть довольно сложной задачей. Иногда наличие двух отдельных процессов делает вещи намного проще.
Ответ 3
В Linux системный вызов clone
клонирует задачу с настраиваемым уровнем совместного доступа.
fork()
вызывает clone(least sharing)
и pthread_create()
вызовы clone(most sharing)
.
forking стоит чуть меньше, чем pthread_createing из-за копирования таблиц и создания сопоставлений COW для памяти.