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

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

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

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

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

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

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

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

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

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

Примітки

Посилання


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.