Волокно (програмування)
У програмуванні волокно — особливо легковагова нить виконання. Подібно до нитей, волокна використовують спільний адресний простір: але (там де існує різниця) волокна використовують кооперативну багатозадачність, в той час як ниті покладаються на упереджувальну виштовхувальну багатозадачність. Ниті здебільшого залежать від планувальника задач, який призупиняє одну нить і дає виконуватися іншій нитці. Волокна ж самі передають управління іншим волокнам.
Волокна і співпроцедури
По суті, волокна описують ті самі концепції, що і співпроцедура. Різниця, якщо вона є, полягає в тому, що співпроцедури — це конструкції мовного рівня, форма управління потоком інструкцій, в той час як волокна — конструкції системного рівня, які виглядають як ниті, що не виконуються паралельно; взаємне переключення між волокнами виглядає як безадресний перехід між внутрішніми ділянками коду співпроцедур. Таке бачення є суперечним: волокна можуть розглядатися як реалізація співпроцедур[1], або ж як основа, на якій здійснюються співпроцедури[2].
Переваги і недоліки
Оскільки багатозадачність волокон базується на явному переключенні між волокнами, проблем безпеки тут менше, ніж загалом з планованими нитями. Конструкції синхронізації, що включають взаємні блокування і атомарні дії, не потрібні при написанні коду з волокнами, оскільки вони явно синхронізовані. Проте, багато бібліотек використовують волокна явно, наприклад, при виконанні неблокуючого вводу-виводу; тобто, на це треба звертати увагу, дотримуючись певних обережностей і читати документацію.
Непрямим недоліком волокон є те, що вони виконуються в контексті планованих ниток, що їх породили; проте, модель N:M, коли кількість ниток не перевищує кількості ядер процесора, може бути ефективнішою, ніж варіанти тільки з волокнами або тільки з нитями.
Підтримка операційних систем
Волокнам потрібна менша підтримка з боку операційної системи, ніж для ниток. Волокна підтримуються в багатьох сучасних системах Unix, що використовують бібліотечні функції getcontext(), setcontext() і swapcontext() з ucontext.h, як в GNU Portable Threads.
У Microsoft Windows волокна створюються викликами ConvertThreadToFiber() і CreateFiber(). Виконання волокна, що "підвішене" в цей час, можливо поновити з будь-якої ниті. При створенні кожному волокну можна передавати вказівник на пам'ять, призначену для зберігання приватних даних, аналогічно до зберігання приватних даних ниток [3].
Примітки
- A Fiber Class
- Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API Архівовано 7 вересня 2008 у Wayback Machine., Ajai Shankar, MSDN Magazine
- Fibers, MSDN Library