Волокно (програмування)

У програмуванні волокно — особливо легковагова нить виконання. Подібно до нитей, волокна використовують спільний адресний простір: але (там де існує різниця) волокна використовують кооперативну багатозадачність, в той час як ниті покладаються на упереджувальну виштовхувальну багатозадачність. Ниті здебільшого залежать від планувальника задач, який призупиняє одну нить і дає виконуватися іншій нитці. Волокна ж самі передають управління іншим волокнам.

Волокна і співпроцедури ред.

По суті, волокна описують ті самі концепції, що і співпроцедура. Різниця, якщо вона є, полягає в тому, що співпроцедури — це конструкції мовного рівня, форма управління потоком інструкцій, в той час як волокна — конструкції системного рівня, які виглядають як ниті, що не виконуються паралельно; взаємне переключення між волокнами виглядає як безадресний перехід між внутрішніми ділянками коду співпроцедур. Таке бачення є суперечним: волокна можуть розглядатися як реалізація співпроцедур[1], або ж як основа, на якій здійснюються співпроцедури[2].

Переваги і недоліки ред.

Оскільки багатозадачність волокон базується на явному переключенні між волокнами, проблем безпеки тут менше, ніж загалом з планованими нитями. Конструкції синхронізації, що включають взаємні блокування і атомарні дії, не потрібні при написанні коду з волокнами, оскільки вони явно синхронізовані. Проте, багато бібліотек використовують волокна явно, наприклад, при виконанні неблокуючого вводу-виводу; тобто, на це треба звертати увагу, дотримуючись певних обережностей і читати документацію.

Непрямим недоліком волокон є те, що вони виконуються в контексті планованих ниток, що їх породили; проте, модель N:M, коли кількість ниток не перевищує кількості ядер процесора, може бути ефективнішою, ніж варіанти тільки з волокнами або тільки з нитями.

Підтримка операційних систем ред.

Волокнам потрібна менша підтримка з боку операційної системи, ніж для ниток. Волокна підтримуються в багатьох сучасних системах Unix, що використовують бібліотечні функції getcontext(), setcontext() і swapcontext() з ucontext.h, як в GNU Portable Threads.

У Microsoft Windows волокна створюються викликами ConvertThreadToFiber() і CreateFiber(). Виконання волокна, що "підвішене" в цей час, можливо поновити з будь-якої ниті. При створенні кожному волокну можна передавати вказівник на пам'ять, призначену для зберігання приватних даних, аналогічно до зберігання приватних даних ниток [3].

Див. також ред.

Примітки ред.

  1. A Fiber Class. Архів оригіналу за 23 жовтня 2017. Процитовано 17 травня 2009.
  2. Implementing Coroutines for .NET by Wrapping the Unmanaged Fiber API [Архівовано 7 вересня 2008 у Wayback Machine.], Ajai Shankar, MSDN Magazine
  3. Fibers [Архівовано 6 квітня 2008 у Wayback Machine.], MSDN Library

Посилання ред.