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

В чем разница между вилкой и потоком?

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

4b9b3361

Ответ 1

Вилка дает вам совершенно новый процесс, который является копией текущего процесса с теми же сегментами кода. По мере изменения образа памяти (как правило, это связано с различным поведением двух процессов) вы получаете разделение образов памяти (Copy On Write), однако исполняемый код остается неизменным. Задачи не разделяют память, если они не используют примитив Inter Process Communication (IPC).

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

Ответ 2

Вилка:

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

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

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

Несколько вещей, которые следует обратить внимание на форкировку, следующие:

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

Темы:

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

Потоки одного и того же ресурса процесса:

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

  • Темы разделяют адресное пространство процесса, который его создал; процессы имеют свой собственный адрес  пространство.
  • Темы имеют прямой доступ к сегменту данных его процесса; процессы имеют свою собственную копию  сегмент данных родительского процесса.
  • Темы могут напрямую взаимодействовать с другими потоками своего процесса; процессы должны использовать  межпроцессное общение для связи с процессами родства.
  • В потоках почти нет накладных расходов; процессы имеют значительные накладные расходы.
  • Новые потоки легко создаются; новые процессы требуют дублирования родительского процесса.
  • Нитки могут осуществлять значительный контроль над потоками одного и того же процесса; процессы могут  осуществлять контроль над дочерними процессами.
  • Изменения основного потока (аннулирование, изменение приоритета и т.д.) могут повлиять на поведение другого  потоки процесса; изменения родительского процесса не влияют на дочерние процессы.