В чем разница между ниткой и волокном? - PullRequest
161 голосов
/ 28 апреля 2009

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

Ответы [ 9 ]

141 голосов
/ 28 апреля 2009

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

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

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

51 голосов
/ 28 апреля 2009

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

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

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

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

42 голосов
/ 28 апреля 2009

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

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

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

35 голосов
/ 08 ноября 2013

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

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

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

В разделе 11.4 «Процессы и потоки в Windows Vista» в современных операционных системах Таненбаум комментирует:

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

12 голосов
/ 28 апреля 2009

Обратите внимание, что в дополнение к потокам и волокнам Windows 7 представляет Планирование в пользовательском режиме :

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

Дополнительную информацию о потоках, волокнах и UMS можно получить, просмотрев Дейв Проберт: Внутри Windows 7 - Планировщик пользовательских режимов (UMS) .

7 голосов
/ 28 апреля 2009

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

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

7 голосов
/ 28 апреля 2009

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

6 голосов
/ 28 апреля 2009

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

Некоторые полезные ссылки, объясняющие это лучше, чем я, вероятно, сделали:

3 голосов
/ 09 марта 2015

Определение волокна Win32 на самом деле является определением «Зеленой нити», установленным в Sun Microsystems. Нет необходимости тратить термин fiber на какой-то поток, то есть на поток, выполняющийся в пространстве пользователя под управлением пользовательского кода / библиотеки потоков.

Для уточнения аргумента посмотрите следующие комментарии:

  • Благодаря гиперпоточности многоядерный ЦП может принимать несколько потоков и распределять их по одному на каждое ядро.
  • Суперскалярный конвейерный ЦП принимает один поток для выполнения и использует параллелизм на уровне инструкций (ILP), чтобы ускорить выполнение потока. Можно предположить, что один поток разбит на параллельные волокна, идущие в параллельных трубопроводах.
  • ЦП SMT может принимать несколько потоков и разбивать их на волокна инструкций для параллельное выполнение на нескольких конвейерах, более эффективное использование конвейеров.

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

...