Нити / Волокна - Разъяснение
Я немного сбит с толку относительно понятия "волокон" относительно их отношения к 1) потокам и 2) тому, что они видят как ядро.
Насколько я понимаю, волокно является потоком, который был создан потоком и управляется его создающим потоком (то есть, возможно, планировщиком?). Однако, для всех интенсивных целей, я бы посчитал, что это все еще "поток" и рассматривается ядром как таковое.
Объяснение, которое я получаю от коллеги, состоит в том, что волокна абсолютно невидимы для ядра и работают исключительно в пользовательском пространстве и никоим образом не являются "потоками", как указано в его письме:
Потоки иногда реализуются в библиотеках пользовательского пространства, так называемые пользовательские потоки. Ядро не знает о них, поэтому они управляются и планируются в пользовательском пространстве. Некоторые реализации основывают свои пользовательские потоки поверх нескольких потоков ядра, чтобы использовать преимущества многопроцессорных машин (модель M:N). В этой статье термин "поток" (без ядра или квалификатора пользователя) по умолчанию ссылается на потоки ядра. Пользовательские потоки, реализованные виртуальными машинами, также называются зелеными потоками. Пользовательские потоки, как правило, быстро создаются и управляются, но не могут использовать преимущества многопоточности или многопроцессорности и блокируются, если все связанные с ними потоки ядра блокируются, даже если есть некоторые пользовательские потоки, которые готовы к запуску.
Волокна - это еще более легкая единица планирования, которая запланирована совместно: работающее волокно должно явно "уступать", чтобы позволить другому волокну работать, что делает их реализацию намного проще, чем потоки ядра или пользователя. Волокно может быть запланировано для запуска в любом потоке в том же процессе. Это позволяет приложениям получать улучшения производительности, управляя планированием самостоятельно, вместо того, чтобы полагаться на планировщик ядра (который может не быть настроен для приложения). Среды параллельного программирования, такие как OpenMP, обычно реализуют свои задачи с помощью волокон. С волокнами тесно связаны сопрограммы, с отличием в том, что сопрограммы являются конструкцией уровня языка, а волокна - конструкцией уровня системы.
Я надеюсь получить немного лучшего объяснения с точки зрения того, что конкретно представляет собой волокно (является ли это реальным потоком с точки зрения os/kernel и просто управляется созданным им потоком?).
Я тщательно исследовал его с помощью поисков в Google, но везде, где я искал, нашел только один простой ответ, в том числе здесь: "Волокно - это нить, которая создается и управляется нитью".
Если у кого-то есть что-то более информативное, чем он может поделиться или указать на меня, это будет с благодарностью. Мои коллеги утверждают, что в Gout'ах Golang'а используются "волокна", и эти волокна невидимы для ОС - таким образом, "правильная" реализация волокон. Лично я чувствую, что Goroutines более тесно связаны с сопрограммами и вообще не реализуют сценарий волокно / нить...