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

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

4 ответов


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

with threads: текущий путь выполнения может быть прерван или упрежден в любое время (Примечание: этот оператор является обобщением и не всегда может иметь значение true в зависимости от OS/threading package/etc.). Это означает, что для потоков целостность данных является большой проблемой, поскольку один поток может быть остановлен в середине обновления куска данных, оставляя целостность данных в плохом или неполном состоянии. Это также означает, что операционная система может воспользоваться преимуществами нескольких процессоров и ядер ЦП, запустив более одного потока одновременно и оставив его разработчику для защиты доступа к данным.

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


использовать нити упреждающий планирование, тогда как волокна используют кооператива планирование.

с потоком поток управления может быть прерван в любое время, и другой поток может взять на себя. С несколькими процессорами вы можете иметь несколько потоков, работающих одновременно (одновременно многопоточность, или SMT). В результате, вы должны быть очень осторожно о параллельном доступе к данным, и защитите ваши данные с мьютексы, семафоры, переменные условия и так далее. Это часто очень трудно.

с волокном управление переключается только тогда, когда вы говорите ему, как правило, с вызовом функции с именем что-то вроде yield(). Это упрощает параллельный доступ к данным, так как вам не нужно беспокоиться об атомарности структур данных или мьютексов. До тех пор, пока вы не уступите, нет никакой опасности быть preempted и наличие другого волокна, пытающегося прочитать или изменить данные, которые вы работа с. В результате, однако, если ваше волокно попадает в бесконечную петлю, никакое другое волокно не может работать, так как вы не поддаетесь.

вы также можете смешивать нити и волокна, что приводит к проблемам, с которыми сталкиваются оба. Не рекомендуется, но иногда это может быть правильным, если делать это осторожно.


в Win32 волокно является своего рода управляемым пользователем потоком. Волокно имеет свой собственный стек и свой собственный указатель команд и т. д., но волокна не запланированы ОС: вы должны вызвать SwitchToFiber явно. Потоки, напротив, предварительно планируются операционной системой. Грубо говоря, волокно-это поток, который управляется на уровне приложения / среды выполнения, а не является истинным потоком ОС.

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

(могут быть другие использования для того же термина; как отмечалось, это определение Win32.)


сначала я бы рекомендовал прочитать это объяснение разница между процессами и потоками как справочный материал.

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

  • то, что обычно называется потоком, является потоком выполнения, реализованным в ядре: то, что известно как поток ядра. Планирование потока ядра обрабатывается исключительно ядром, хотя поток ядра может добровольно освободить процессор, если он хочет спать. Преимущество потока ядра в том, что он может использовать блокировку ввода-вывода и позволяет ядру беспокоиться о планировании. Основным недостатком является то, что переключение потоков относительно медленное, так как оно требует захвата в ядро.
  • волокна-это потоки пользовательского пространства, планирование которых обрабатывается в пользовательском пространстве одним или несколькими ядрами потоки в рамках одного процесса. Это делает переключение волокна очень быстрым. Если сгруппировать все волокна, обращающиеся к определенному набору общих данных в контексте одного потока ядра, и их планирование обрабатывается одним потоком ядра, то можно устранить проблемы синхронизации, так как волокна будут эффективно работать в последовательном режиме, и у вас есть полный контроль над их планированием. Группировка связанных волокон под одним потоком ядра важна, так как поток ядра они запуск может быть упрежден ядром. Во многих других ответах этот момент не проясняется. Кроме того, если вы используете блокировку ввода-вывода в волокне, весь поток ядра является частью блоков, включая все волокна, которые являются частью этого потока ядра.

в разделе 11.4 "процессы и потоки в Windows Vista" в современных операционных системах Tanenbaum комментарии:

хотя волокна совместно запланированы, если множественные нити планирование волокон, много тщательной синхронизации требуется убедиться, что волокна не мешают друг другу. К упростите взаимодействие между нитями и волокнами, оно часто полезно создавать только столько потоков, сколько процессоров для запуска их и сродни нитям, чтобы каждый запускался только на отдельном наборе доступные процессоры, или даже только один процессор. Каждый поток может затем запустите определенное подмножество волокон, установив единицу ко многим между нитями и волокнами, что упрощает синхронизация. Тем не менее, есть еще много трудностей с ворсинки. Большинство библиотек Win32 полностью не знают о волокнах, и приложений, которые пытаются использовать волокна как если бы они были потоки возникают различные сбои. Ядро не знает волокон, и когда волокно входит в ядро, поток, который он выполняет в мае блок и ядро будут планировать произвольный поток на процессор, делая его недоступным для запуска другие волокна. Для них причины волокна редко используются, за исключением случаев переноса кода из других системы, которые явно нуждаются в функциональности, предоставляемой волокнами.