Волокно (информатика)
В информатике волокно представляет собой особенно легкую нить исполнения .
Как и потоки, волокна совместно используют адресное пространство . Однако волокна используют кооперативную многозадачность , а потоки — вытесняющую многозадачность . Потоки часто зависят от планировщика потоков ядра, который вытесняет занятый поток и возобновляет другой поток; волокна уступают место другому волокну во время выполнения.
Потоки, волокна и сопрограммы [ править ]
Ключевое различие между волокнами и потоками ядра заключается в том, что волокна используют совместное переключение контекста вместо упреждающего квантования времени. По сути, волокна расширяют таксономию параллелизма:
- на одном компьютере может выполняться несколько процессов
- в одном процессе может выполняться несколько потоков
- в одном потоке может работать несколько волокон [1]
Волокна (иногда называемые стековыми сопрограммами или кооперативно запланированными потоками пользовательского режима) и бесстековые сопрограммы (конечные автоматы, синтезируемые компилятором) представляют собой два различных средства программирования с огромными различиями в производительности и функциональности. [2]
Преимущества и недостатки [ править ]
Поскольку волокна работают совместно, безопасность потоков представляет собой меньшую проблему, чем при упреждающем планировании потоков, а конструкции синхронизации, включая спин-блокировки и атомарные операции, не нужны при написании многозадачного кода, поскольку они синхронизируются неявно. Однако многие библиотеки неявно предоставляют волокно как метод проведения неблокирующего ввода-вывода ; поэтому рекомендуется соблюдать некоторую осторожность и читать документацию. Недостатком является то, что волокна не могут использовать многопроцессорные машины без использования вытесняющих потоков; однако модель потоков M:N, в которой число вытесняющих потоков превышает количество ядер ЦП, может быть более эффективной, чем чистые волокна или чистая вытесняющая обработка потоков.
В некоторых серверных программах волокна используются для мягкой блокировки, позволяющей однопоточным родительским программам продолжать работу. В этой конструкции волокна используются в основном для доступа к вводу-выводу, который не требует обработки ЦП. Это позволяет основной программе продолжать то, что она делает. Волокна передают управление однопоточной основной программе, и после завершения операции ввода-вывода волокна продолжают работу с того места, где они остановились.
Поддержка операционной системы [ править ]
меньшая поддержка со стороны операционной системы Для волокон требуется , чем для потоков. Их можно реализовать в современных системах Unix с помощью библиотечных функций getcontext, setcontext и swapcontext в ucontext.h
, как в GNU Portable Threads , или в ассемблере как boost.fiber .
В Microsoft Windows волокна создаются с помощью ConvertThreadToFiber
и CreateFiber
звонки; волокно, которое в данный момент приостановлено, может быть возобновлено в любом потоке. Локальное хранилище по волокну, аналогичное локальному хранилищу потока , может использоваться для создания уникальных копий переменных. [3]
Symbian OS использовала концепцию, аналогичную оптоволокну, в своем Active Scheduler. Активный объект содержал одно волокно, которое должно было выполняться активным планировщиком после завершения одного из нескольких ожидающих асинхронных вызовов. Несколько активных объектов могли ожидать выполнения (в зависимости от приоритета), и каждый из них должен был ограничить свое время выполнения.
Примеры реализации оптоволокна [ править ]
Волокна могут быть реализованы без поддержки операционной системы, хотя некоторые операционные системы или библиотеки предоставляют им явную поддержку.
- Win32 предоставляет оптоволоконный API [4] (Windows NT 3.51 SP3 и более поздние версии)
- Библиотеки C++ Boost имеют класс волокна , начиная с версии Boost 1.62.
- У Ruby были зеленые потоки (до версии 1.9).
- Netscape Portable Runtime (включает реализацию волокон в пользовательском пространстве)
- ребра2
- PHP начиная с версии 8.1 [5]
- ржавчины Волокна , использующие фьючерсы под капотом
- Crystal предоставляет волокна как часть языка и стандартной библиотеки.
См. также [ править ]
- библиотечные процедуры setcontext/getcontext
- Зеленые потоки и виртуальные потоки
- вызов с текущим продолжением
Ссылки [ править ]
Внешние ссылки [ править ]
- Портативные потоки GNU
- «Портативная библиотека сопрограмм» . Бесплатный код .
- Пул волокон Многоядерная платформа C++ на основе волокон для Microsoft Windows.
- Государственные потоки
- Протопотоки
- ребра2
- boost.fiber