В чем разница между вилкой и нитью?
может ли кто-нибудь объяснить разницу между вилкой и нитью?
5 ответов:
вилка дает вам совершенно новый процесс, который является копией текущего процесса, с теми же сегментами кода. По мере изменения образа памяти (как правило, это связано с различным поведением двух процессов) вы получаете разделение образов памяти (копирование при записи), однако исполняемый код остается тем же. Задачи не разделяют память, если они не используют некоторые Inter Process Communication (IPC) примитивно.
один процесс может иметь несколько потоков, каждый из которых выполняет в параллельно в том же контексте процесса. Память и другие ресурсы совместно используются потоками, поэтому доступ к общим данным должен осуществляться через некоторые примитивные объекты и объекты синхронизации (например,мьютексы,переменные условие и семафоры), которые позволяют избежать повреждения данных.
вилка:
Fork-это не что иное, как новый процесс, который выглядит точно так же, как старый или родительский процесс, но все же это другой процесс с другим идентификатором процесса и имеющий собственную память. Родительский процесс создает отдельное адресное пространство для ребенка. Как родительский, так и дочерний процесс имеют один и тот же сегмент кода, но выполняются независимо друг от друга.
самый простой пример разветвления-это когда вы запускаете команду в оболочке в unix / linux. Каждый раз, когда пользователь выдает команду, оболочка порождает дочерний процесс, и задача выполнена.
при выполнении системного вызова fork создается копия всех страниц, соответствующих родительскому процессу, загружается ОС в отдельную ячейку памяти для дочернего процесса, но в некоторых случаях это не требуется. Как и в системных вызовах "exec", нет необходимости копировать страницы родительского процесса, так как execv заменяет адресное пространство самого родительского процесса.
несколько вещей, чтобы отметить о разветвления являются:
- дочерний процесс будет иметь свой собственный уникальный идентификатор процесса.
- дочерний процесс должен иметь собственную копию дескриптора родительского файла.
- блокировки файлов, установленные родительским процессом, не должны наследоваться дочерним процессом.
- все семафоры, открытые в Родительском процессе, также должны быть открыты в дочернем процессе.
- дочерний процесс должен иметь свою собственную копию дескрипторов очереди сообщений родители.
- ребенок будет иметь свое собственное адресное пространство и память.
темы:
потоки облегченные процессы (подпроцессы). Традиционно поток-это просто состояние процессора (и некоторого другого минимального состояния) с процессом, содержащим остатки (данные, стек, ввод-вывод, сигналы). Потоки требуют меньше накладных расходов, чем" разветвление " или создание нового процесса, поскольку система не инициализирует новое системное пространство виртуальной памяти и среду для процесса. В то время как наиболее эффективно в многопроцессорной системе, где поток процесса может быть запланирован для запуска на другом процессоре, таким образом, набирая скорость за счет параллельной или распределенной обработки, выигрыши также обнаруживаются в однопроцессорных системах, которые используют задержку в вводе/выводе и других системных функциях, которые могут остановить выполнение процесса.
потоки в одном и том же процессе разделяют:
- процесса
- большинство данных
- открытые файлы (дескрипторы)
- сигналы и обработчики сигналов
- текущий рабочий каталог
- идентификатор пользователя и группы
более подробную информацию можно найти здесь.
ответ Dacav превосходен, я просто хотел добавить, что не все модели резьбы дают вам истинную мульти-обработку.
например, реализация потоков по умолчанию Ruby не использует истинные потоки ОС / ядра. Вместо этого он имитирует наличие нескольких потоков, переключаясь между объектами потока в пределах одного потока / процесса ядра.
Это важно для многопроцессорных / многоядерных систем, потому что эти типы легких потоков могут работать только на одном ядро-вы не получаете много на пути повышения производительности от наличия нескольких потоков.
другое место, где это имеет значение, - это когда один поток блокируется (ожидание ввода-вывода или вызов ioctl драйвера), все потоки блокируются.
Это не очень распространено в настоящее время - большинство реализаций потоков используют потоки ядра, которые не страдают от этих проблем, но их стоит упомянуть для полноты.
напротив, fork дает вам другой процесс, который можно запустить одновременно на другом физическом процессоре во время выполнения исходного процесса. Некоторые люди находят IPC более подходящим для своего приложения, другие предпочитают резьбу.
удачи и получайте удовольствие! Многопоточность является одновременно сложной и полезной.
потоки - это функции, выполняемые параллельно, fork-это новый процесс с наследованием родителей. Потоки хороши для выполнения задачи параллельно, в то время как вилки являются независимым процессом, который также выполняется одновременно. Потоки имеют условия гонки и там управляют семафорами и замками или мьютексами, трубы могут использоваться как в вилке, так и в резьбе.
- потоки разделяют адресное пространство процесса, который его создал; процессы имеют свой собственный адрес пространство.
- потоки имеют прямой доступ к сегменту данных своего процесса; процессы имеют свою собственную копию сегмент данных родительского процесса.
- потоки могут напрямую общаться с другими потоками своего процесса; процессы должны использовать межпроцессное взаимодействие для взаимодействия с одноуровневыми процессами.
- потоки почти не имеют накладных расходов; процессы имеют значительные накладные расходы.
- новые потоки легко создаются; новые процессы требуют дублирования родительского процесса.
- потоки могут осуществлять значительный контроль над потоками того же процесса; процессы могут только осуществлять контроль над дочерними процессами.
- изменения в основной поток (Отмена, изменение приоритета и т. д.) может повлиять на поведение другого потоки процесса; изменения в Родительском процессе не влияют на дочерний процессы