В чем разница между вилкой и резьбой? - PullRequest
86 голосов
/ 20 марта 2010

Может кто-нибудь объяснить разницу между вилкой и веткой?

Ответы [ 5 ]

81 голосов
/ 20 марта 2010

Форк дает вам совершенно новый процесс, который является копией текущего процесса, с теми же сегментами кода. При изменении образа памяти (обычно это происходит из-за разного поведения двух процессов) вы получаете разделение образов памяти (копирование при записи), однако исполняемый код остается тем же. Задачи не разделяют память, если они не используют какой-либо примитив Межпроцессное взаимодействие (IPC) .

Один процесс может иметь несколько потоков, каждый из которых выполняется параллельно в одном и том же контексте процесса. Память и другие ресурсы распределяются между потоками, поэтому доступ к общим данным должен осуществляться через некоторые примитивы и объекты синхронизации (например, мьютексы , переменные условия и семафоры ), которые позволяют вам, чтобы избежать повреждения данных.

69 голосов
/ 13 января 2013

Вилка:

Fork - это не что иное, как новый процесс, который выглядит точно так же, как старый или родительский процесс, но все же это другой процесс с другим идентификатором процесса и собственной памятью. Родительский процесс создает отдельное адресное пространство для дочернего. И родительский, и дочерний процессы обладают одинаковым сегментом кода, но выполняются независимо друг от друга.

Самый простой пример разветвления - это когда вы запускаете команду на оболочке в unix / linux. Каждый раз, когда пользователь вводит команду, оболочка разветвляет дочерний процесс, и задача выполняется.

Когда выполняется системный вызов fork, создается копия всех страниц, соответствующих родительскому процессу, загружаемая ОС в отдельную область памяти для дочернего процесса, но в некоторых случаях это не требуется. Как и в системных вызовах «exec», нет необходимости копировать страницы родительского процесса, поскольку execv заменяет адресное пространство самого родительского процесса.

Несколько замечаний по поводу разветвления:

  • Дочерний процесс будет иметь собственный уникальный идентификатор процесса.
  • Дочерний процесс должен иметь собственную копию дескриптора файла родителя.
  • Блокировки файлов, установленные родительским процессом, не должны наследоваться дочерним процессом.
  • Любые семафоры, открытые в родительском процессе, также должны быть открыты в дочернем процессе.
  • Дочерний процесс должен иметь собственную копию дескрипторов очереди сообщений родителей.
  • У ребенка будет свое адресное пространство и память.

Тема:

Потоки - это легковесные процессы (LWP). Традиционно поток - это просто состояние ЦП (и некоторого другого минимального состояния) с процессом, содержащим остатки (данные, стек, ввод-вывод, сигналы). Потоки требуют меньше накладных расходов, чем «разветвление» или порождение нового процесса, поскольку система не инициализирует новое пространство виртуальной памяти системы и среду для этого процесса. Хотя это наиболее эффективно в многопроцессорной системе, где поток процесса может быть запланирован для запуска на другом процессоре, что позволяет повысить скорость за счет параллельной или распределенной обработки, выигрыши также обнаруживаются в однопроцессорных системах, которые используют задержку ввода-вывода и другие системные функции, которые могут остановить процесс. выполнение.

Потоки в одном и том же процессе:

  • Технологические инструкции
  • Большинство данных
  • открытые файлы (дескрипторы)
  • сигналы и обработчики сигналов
  • текущий рабочий каталог
  • Идентификатор пользователя и группы

Более подробную информацию можно найти здесь .

28 голосов
/ 20 марта 2010

Ответ Dacav превосходен, я просто хотел добавить, что не все модели многопоточности дают вам истинную мультиобработку.

Например, реализация потоков в Ruby по умолчанию не использует настоящие потоки ОС / ядра. Вместо этого он имитирует наличие нескольких потоков, переключаясь между объектами Thread внутри одного потока / процесса ядра.

Это важно в многопроцессорных / многоядерных системах, поскольку легкие потоки такого типа могут работать только на одном ядре - вы не получите большого выигрыша в производительности от наличия нескольких потоков.

Другое место, где это имеет значение, - когда один поток блокирует (ожидание ввода-вывода или вызов IOCTL драйвера), все потоки блокируются.

В настоящее время это не очень распространено - большинство реализаций потоков используют потоки ядра, которые не страдают от этих проблем, но их стоит отметить для полноты.

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

Удачи и веселья! Многопоточность - сложная и полезная работа.

6 голосов
/ 20 июля 2014
  1. Потоки разделяют адресное пространство процесса, который его создал; процессы имеют свой собственный адрес пространство.
  2. Потоки имеют прямой доступ к сегменту данных своего процесса; процессы имеют свою собственную копию сегмент данных родительского процесса.
  3. Потоки могут напрямую связываться с другими потоками своего процесса; процессы должны использовать межпроцессное взаимодействие для связи с одноуровневыми процессами.
  4. У потоков почти нет накладных расходов; процессы имеют значительные накладные расходы.
  5. Новые темы легко создаются; новые процессы требуют дублирования родительского процесса.
  6. Потоки могут осуществлять значительный контроль над потоками одного и того же процесса; процессы могут только осуществлять контроль над дочерними процессами.
  7. Изменения в основном потоке (отмена, изменение приоритета и т. Д.) Могут повлиять на поведение другого потока. темы процесса; изменения родительского процесса не влияют на дочерние процессы
5 голосов
/ 04 августа 2012

Потоки - это функции, выполняемые параллельно, fork - это новый процесс с наследованием родителей. Потоки хороши для параллельного выполнения задачи, тогда как вилки являются независимым процессом, который также выполняется одновременно. У потоков есть условия гонки, и они управляют семафорами и замками или мьютексами, трубы могут использоваться как в форках, так и в нитях.

...