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



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

816   4  

4 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.