В чем разница между ниткой и волокном? Я слышал о волокнах от ruby и читал, что они доступны на других языках, может кто-нибудь объяснить мне в простых терминах, в чем разница между нитью и волокном.
источник
В чем разница между ниткой и волокном? Я слышал о волокнах от ruby и читал, что они доступны на других языках, может кто-нибудь объяснить мне в простых терминах, в чем разница между нитью и волокном.
В самых простых терминах нити, как правило, считаются вытесняющими (хотя это не всегда может быть правдой, в зависимости от операционной системы), в то время как волокна считаются легкими совместными нитями. Оба являются отдельными путями выполнения для вашего приложения.
С потоками: текущий путь выполнения может быть прерван или прерван в любое время (примечание: этот оператор является обобщением и может не всегда выполняться в зависимости от ОС / пакета потоков / и т. Д.). Это означает, что для потоков целостность данных является большой проблемой, потому что один поток может быть остановлен в процессе обновления фрагмента данных, что оставляет целостность данных в плохом или неполном состоянии. Это также означает, что операционная система может использовать преимущества нескольких ЦП и ядер ЦП, выполняя более одного потока одновременно и предоставляя разработчику возможность защищать доступ к данным.
С волокнами: текущий путь выполнения прерывается только тогда, когда волокно приводит к выполнению (то же примечание, что и выше). Это означает, что волокна всегда запускаются и останавливаются в четко определенных местах, поэтому целостность данных представляет собой гораздо меньшую проблему. Кроме того, поскольку волокнами часто управляют в пользовательском пространстве, дорогостоящие переключатели контекста и изменения состояния ЦП не требуется, что делает переход от одного волокна к другому чрезвычайно эффективным. С другой стороны, поскольку никакие два волокна не могут работать в одно и то же время, простое использование одних волокон не будет использовать преимущества нескольких процессоров или нескольких процессорных ядер.
Потоки используют упреждающее планирование, тогда как волокна используют совместное планирование.
С потоком поток управления может быть прерван в любое время, и другой поток может вступить во владение. При наличии нескольких процессоров, вы можете иметь несколько потоков все запущенные одновременно ( одновременная многопоточность, или SMT). В результате вы должны быть очень осторожны с одновременным доступом к данным и защищать свои данные с помощью мьютексов, семафоров, переменных условий и так далее. Часто очень сложно получить права.
При использовании оптоволокна управление переключается только тогда, когда вы указываете это, обычно с вызовом функции с именем что-то вроде
yield()
. Это облегчает одновременный доступ к данным, поскольку вам не нужно беспокоиться об атомарности структур данных или мьютексов. Пока вы не уступите, нет опасности быть вытесненным и иметь другое волокно, пытающееся прочитать или изменить данные, с которыми вы работаете. В результате, однако, если ваше волокно попадает в бесконечный цикл, никакое другое волокно не может работать, так как вы не уступаете.Вы также можете смешивать нити и волокна, что порождает проблемы, с которыми сталкиваются оба. Не рекомендуется, но иногда это может быть правильным, если все сделано осторожно.
источник
В Win32 волокно является своего рода потоком, управляемым пользователем. Волокно имеет свой собственный стек и свой собственный указатель инструкций и т. Д., Но ОС не планирует расписание: вы должны явно вызывать SwitchToFiber. Потоки, напротив, предварительно планируются операционной системой. Грубо говоря, волокно - это поток, который управляется на уровне приложения / среды выполнения, а не настоящий поток ОС.
Это приводит к тому, что оптоволокно дешевле, а приложение имеет больший контроль над расписанием. Это может быть важно, если приложение создает много параллельных задач и / или хочет тесно оптимизировать их выполнение. Например, сервер базы данных может использовать волокна, а не потоки.
(Там могут быть другие использования для того же термина; как отмечено, это определение Win32.)
источник
Сначала я бы рекомендовал прочитать это объяснение разницы между процессами и потоками в качестве справочного материала.
Как только вы прочитали, это довольно просто. Потоки могут быть реализованы либо в ядре, в пользовательском пространстве, либо они могут быть смешаны. Волокна - это в основном потоки, реализованные в пространстве пользователя.
В разделе 11.4 «Процессы и потоки в Windows Vista» в современных операционных системах Таненбаум комментирует:
источник
Обратите внимание, что в дополнение к потокам и волокнам в Windows 7 вводится планирование в режиме пользователя :
Дополнительную информацию о потоках, волокнах и UMS можно найти в Dave Probert: Внутри Windows 7 - Планировщик пользовательских режимов (UMS) .
источник
Потоки планируются ОС (приоритетные). ОС может в любой момент остановить или возобновить поток, но волокна более или менее управляются сами (кооперативно) и уступают друг другу. То есть программист контролирует, когда волокна выполняют свою обработку и когда эта обработка переключается на другое волокно.
источник
Потоки, как правило, полагаются на ядро для прерывания потока, чтобы он или другой поток могли работать (что более известно как многозадачность с упреждающим действием), тогда как волокна используют кооперативную многозадачность, когда это волокно само по себе отдает время работы, так что другие волокна могут работать.
Некоторые полезные ссылки, объясняющие это лучше, чем я, вероятно, сделали:
источник
Потоки изначально создавались как облегченные процессы. Аналогичным образом волокна представляют собой легкую нить, полагаясь (упрощенно) на сами волокна, чтобы планировать друг друга, уступая контроль.
Я предполагаю, что следующим шагом будут нити, где вы должны отправлять им сигнал каждый раз, когда вы хотите, чтобы они выполнили инструкцию (в отличие от моего 5-летнего сына :-). В старые времена (и даже сейчас на некоторых встраиваемых платформах) все потоки были оптоволоконными, не было приоритета, и вам приходилось писать свои потоки, чтобы они вели себя хорошо.
источник
Определение волокна Win32 на самом деле является определением «Зеленой нити», установленным в Sun Microsystems. Нет необходимости тратить термин «волокно» на некоторый поток, то есть поток, выполняющийся в пространстве пользователя под управлением пользовательского кода / библиотеки потоков.
Чтобы уточнить аргумент, посмотрите на следующие комментарии:
Мы должны предположить, что процессы состоят из нитей, а нитки - из волокон. Учитывая эту логику, использование волокон для других типов потоков является неправильным.
источник