В чем разница между нитью и волокном? Я слышал о волокнах из рубина, и я читал, что они доступны на других языках, может кто-нибудь объяснить мне простыми словами, в чем разница между нитью и волокном.
В чем разница между нитью и волокном?
Ответ 1
В самых простых терминах, как правило, считается, что потоки являются превентивными (хотя это может не всегда быть истинным, в зависимости от операционной системы), в то время как волокна считаются легкими, совместными потоками. Оба являются отдельными путями выполнения для вашего приложения.
С потоками: текущий путь выполнения может быть прерван или вытеснен в любое время (примечание: этот оператор является обобщением и может не всегда выполняться в зависимости от пакета OS/threading/etc.). Это означает, что для потоков целостность данных является большой проблемой, поскольку один поток может быть остановлен посередине обновления части данных, что оставляет целостность данных в плохом или неполном состоянии. Это также означает, что операционная система может использовать преимущества нескольких процессоров и процессорных ядер, одновременно запуская более одного потока и оставляя их разработчику для защиты доступа к данным.
С волокнами: текущий путь выполнения прерывается только тогда, когда волокно дает выполнение (то же самое, что и выше). Это означает, что волокна всегда начинают и останавливаются в четко определенных местах, поэтому целостность данных намного меньше. Кроме того, поскольку волокна часто управляются в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния процессора не обязательно должны быть сделаны, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку ни одно из двух волокон не может работать в одно и то же время, просто использование только волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер.
Ответ 2
В Win32 волокно - это своего рода поток, управляемый пользователями. У волокна есть свой собственный стек и его собственный указатель инструкций и т.д., Но волокна не назначаются ОС: вы должны явно вызвать SwitchToFiber. Потоки, напротив, предварительно запланированы системой операций. Так грубо говоря, волокно - это поток, который управляется на уровне приложения/времени выполнения, а не является истинным потоком ОС.
Последствия в том, что волокна дешевле и что приложение имеет больший контроль над планированием. Это может быть важно, если приложение создает множество параллельных задач и/или хочет оптимизировать их при запуске. Например, сервер базы данных может выбрать использование волокон, а не потоков.
(Возможно, существуют другие условия использования для одного и того же термина, как указано, это определение Win32.)
Ответ 3
В потоках используется планирование pre-emptive, тогда как волокна используют совместное планирование.
С потоком поток управления может быть прерван в любой момент, и другой поток может взять верх. С несколькими процессорами вы можете одновременно работать с несколькими потоками (одновременная многопоточность или SMT). В результате вы должны быть очень осторожны в отношении одновременного доступа к данным и защищать свои данные с помощью мьютексов, семафоров, переменных условий и т.д. Часто очень сложно получить право.
С помощью волокна управление переключается только при его передаче, как правило, с вызовом функции с именем вроде yield()
. Это упрощает одновременный доступ к данным, поскольку вам не нужно беспокоиться об атомарности структур данных или мьютексов. Пока вы не уступаете, нет опасности быть выгруженным и иметь другое волокно, пытающееся прочитать или изменить данные, с которыми вы работаете. В результате, если ваше волокно попадает в бесконечный цикл, никакое другое волокно не может работать, поскольку вы не уступаете.
Вы также можете смешивать нити и волокна, что порождает проблемы, с которыми сталкиваются оба. Не рекомендуется, но иногда это может быть правильным, если сделать это тщательно.
Ответ 4
Сначала я бы рекомендовал прочитать это объяснение разницу между процессами и потоками в качестве справочного материала.
Как только вы прочтете, что это довольно прямолинейно. Режимы потоков могут быть реализованы либо в ядре, либо в пользовательском пространстве, либо два могут быть смешаны. Волокна - это в основном потоки, реализованные в пользовательском пространстве.
- То, что обычно называют потоком, представляет собой поток выполнения, реализованный в ядре: то, что известно как поток ядра. Планирование потока ядра обрабатывается исключительно ядром, хотя поток ядра может добровольно освобождать CPU, если он хочет. Преимущество ядра в том, что он может использовать блокирующий ввод-вывод и позволяет ядру беспокоиться о планировании. Основным недостатком является то, что переключение потоков относительно медленное, так как оно требует захвата в ядро.
- Волокна представляют собой потоки пользовательского пространства, планирование которых обрабатывается в пространстве пользователя одним или несколькими потоками ядра в рамках одного процесса. Это делает переключение волокон очень быстрым. Если вы группируете все волокна, получающие доступ к определенному набору общих данных, в контексте одного потока ядра, и их планирование обрабатывается одним потоком ядра, тогда вы можете устранить проблемы синхронизации, так как волокна будут эффективно запускаться в последовательном режиме и у вас есть контролировать их планирование. Группировка связанных волокон под одним потоком ядра важна, так как поток ядра, в котором они запущены, может быть предварительно упущен ядром. Во многих других ответах этот момент не уточняется. Кроме того, если вы используете блокирующий ввод-вывод в волокне, весь поток ядра является частью блоков, включая все волокна, которые являются частью этого потока ядра.
В разделе 11.4 "Процессы и потоки в Windows Vista" в современных операционных системах комментарии Tanenbaum:
Хотя волокна согласованно запланированы, если есть несколько потоки, планирующие волокна, много тщательной синхронизации чтобы волокна не мешали друг другу. к упрощают взаимодействие между нитями и волокнами, часто полезно создавать только столько потоков, сколько есть процессоров для запуска их и аффинитизировать потоки для каждого запуска только на определенном наборе доступных процессоров или даже одного процессора. Каждый поток может затем запустить конкретное подмножество волокон, установив один to-many между нитями и волокнами, что упрощает синхронизации. Тем не менее, есть еще много трудностей с волокна. Большинство библиотек Win32 полностью не знают волокон, и приложения, которые пытаются использовать волокна, как если бы они были потоками, будут сталкиваются с различными сбоями. Ядро не знает волокон, и когда волокно входит в ядро, поток, который он выполняет, может блок и ядро планируют произвольный поток на процессор, что делает его недоступным для запуска других волокон. Для этих причины волокон редко используются, кроме случаев, когда портирование кода из другого системы, которые явно нуждаются в функциональности, предоставляемой волокнами.
Ответ 5
Обратите внимание, что в дополнение к Threads and Fibers Windows 7 вводит Планирование пользовательского режима:
Планирование пользовательского режима (UMS) - это легкий механизм, который приложения могут использовать их собственные потоки. Приложение может переключаться между потоками UMS в пользовательском режиме без привлечения системного планировщика и вернуть управление процессором, если потоки блоков UMS в ядре. UMS нити отличаются от волокон тем, что каждый поток UMS имеет свой собственный поток контекст вместо совместного использования потока контекст одного потока. способность переключаться между потоками в пользовательский режим делает UMS более эффективным чем пулы потоков для управления большими количество коротких рабочих элементов которые требуют нескольких системных вызовов.
Более подробную информацию о потоках, волокнах и UMS можно получить, просмотрев Дэйв Проберт: Внутри Windows 7 - Планировщик пользовательского режима (UMS).
Ответ 6
Потоки запланированы ОС (упреждающее). Нить может быть остановлена или возобновлена в любое время ОС, но волокна более или менее управляются (совместно) и уступают друг другу. То есть программист контролирует, когда волокна выполняют свою обработку, и когда эта обработка переключается на другое волокно.
Ответ 7
Темы изначально были созданы как легкие процессы. Подобным же образом волокна представляют собой легкую нить, которая (упрощенно) опирается на сами волокна, планируя друг друга, получая контроль.
Я предполагаю, что следующий шаг - это пряди, где вы должны посылать им сигнал каждый раз, когда вы хотите, чтобы они выполняли инструкцию (в отличие от моего 5-го сына:-). В старые времена (и даже сейчас на некоторых встроенных платформах) все потоки были волокнами, не было превентивного вмешательства, и вы должны были писать свои потоки, чтобы вести себя хорошо.
Ответ 8
Потоки, как правило, полагаются на ядро, чтобы прервать поток, чтобы он или другой поток мог работать (который более известен как Pre-emptive multitasking), тогда как волокна используют совместную многозадачность, где именно волокно само по себе отказывается от его работы чтобы другие волокна могли работать.
Некоторые полезные ссылки, объясняющие это лучше, чем я, вероятно, были следующими:
Ответ 9
Определение волокна Win32 на самом деле является "зеленой темой", установленной в Sun Microsystems. Нет необходимости тратить термин "волокно" на нить какого-либо типа, т.е. Поток, выполняемый в пользовательском пространстве под управлением пользовательского кода/библиотеки потоков.
Чтобы прояснить аргумент, просмотрите следующие комментарии:
- С гиперпотоком многоядерный процессор может принимать несколько потоков и распределять их по одному на каждом ядре.
- Суперскалярный конвейерный процессор принимает один поток для выполнения и использует уровень обучения Parallelism (ILP) для быстрого запуска потока. Мы можем предположить, что один поток разбит на параллельные волокна, работающие в параллельных трубопроводах.
- Процессор SMT может принимать несколько потоков и тормозить их в волокна инструкций для параллельное выполнение на нескольких конвейерах, более эффективное использование конвейеров.
Мы должны предположить, что процессы сделаны из нитей и что потоки должны быть изготовлены из волокон. С учетом этой логики использование волокон для других видов потоков является неправильным.
Ответ 10
A Fiber - это легкий поток, который использует совместную многозадачность вместо упреждающей многозадачности. Бегущее волокно должно явно "уступать", чтобы позволить другому волокну работать, что делает их реализацию намного проще, чем ядро или пользовательские потоки.
Coroutine - это компонент, который обобщает подпрограмму, позволяющую нескольким точкам входа для приостановки и возобновления выполнения в определенных местах. В отличие от подпрограмм, сопрограммы могут выйти, вызывая другие сопрограммы, которые позже могут вернуться к точке, где они были вызваны в исходной сопрограмме.