En informática , una fibra es un hilo de ejecución particularmente ligero .
Al igual que los hilos, las fibras comparten el espacio de direcciones . Sin embargo, las fibras utilizan la multitarea cooperativa, mientras que los subprocesos utilizan la multitarea preventiva . Los subprocesos a menudo dependen del programador de subprocesos del kernel para adelantarse a un subproceso ocupado y reanudar otro subproceso; las fibras se rinden para ejecutar otra fibra mientras se ejecutan.
Fibras y corutinas
Las fibras describen esencialmente el mismo concepto que las corrutinas . La distinción, si la hay, es que las corrutinas son una construcción a nivel de lenguaje, una forma de flujo de control , mientras que las fibras son una construcción a nivel de sistemas, vistas como subprocesos que no se ejecutan en paralelo. Es controvertido cuál de los dos conceptos tiene prioridad: las fibras pueden verse como una implementación de corrutinas, [1] o como un sustrato sobre el cual implementar corrutinas. [2]
Ventajas y desventajas
Debido a que las fibras realizan múltiples tareas de manera cooperativa, la seguridad de los subprocesos es un problema menor que con los subprocesos programados de forma preventiva, y las construcciones de sincronización, incluidos los spinlocks y las operaciones atómicas, son innecesarias al escribir código con fibra, ya que están sincronizados implícitamente. Sin embargo, muchas bibliotecas producen una fibra implícitamente como método para realizar E / S sin bloqueo ; como tal, se recomienda cierta precaución y lectura de documentación. Una desventaja es que las fibras no pueden utilizar máquinas multiprocesador sin utilizar también hilos preventivos; sin embargo, un modelo de subprocesos M: N sin más subprocesos preventivos que núcleos de CPU puede ser más eficiente que las fibras puras o el subproceso preventivo puro.
En algunos programas de servidor, las fibras se utilizan para bloquearse suavemente para permitir que sus programas principales de un solo subproceso continúen funcionando. En este diseño, las fibras se utilizan principalmente para el acceso de E / S que no necesita procesamiento de CPU. Esto permite que el programa principal continúe con lo que está haciendo. Las fibras ceden el control al programa principal de un solo subproceso, y cuando se completa la operación de E / S, las fibras continúan donde lo dejaron.
Soporte del sistema operativo
Se necesita menos soporte del sistema operativo para las fibras que para los hilos. Ellos pueden ser implementadas en los modernos Unix sistemas que utilizan las funciones de biblioteca getContext, setcontext y swapcontext en ucontext.h
, como en GNU Hilos portátiles , o en ensamblador como boost.fiber .
En Microsoft Windows , las fibras se crean utilizando las llamadas ConvertThreadToFiber
y CreateFiber
; una fibra que está actualmente suspendida se puede reanudar en cualquier hilo. El almacenamiento local de fibra, análogo al almacenamiento local de subprocesos , se puede utilizar para crear copias únicas de variables. [3]
Symbian OS utilizó un concepto similar al de las fibras en su Active Scheduler. Un objeto activo contenía una fibra para ser ejecutada por Active Scheduler cuando se completaba una de varias llamadas asincrónicas pendientes. Varios objetos activos podrían estar esperando para ejecutarse (según la prioridad) y cada uno tenía que restringir su propio tiempo de ejecución.
Ejemplos de implementación de fibra
Las fibras se pueden implementar sin soporte del sistema operativo, aunque algunos sistemas operativos o bibliotecas brindan soporte explícito para ellas.
- Win32 proporciona una API de fibra [4] (Windows NT 3.51 SP3 y posterior)
- Ruby as Green threads (antes de la versión 1.9)
- Netscape Portable Runtime (incluye una implementación de fibras de espacio de usuario)
- costillas2
Ver también
Referencias
- ^ Una clase de fibra
- ^ Shankar, Ajai (septiembre de 2003). "Implementación de corrutinas para .NET envolviendo la API de fibra no administrada" . Revista MSDN . Microsoft. Archivado desde el original el 19 de agosto de 2003 . Consultado el 24 de diciembre de 2006 .
Este artículo muestra cómo se pueden implementar corrutinas para .NET Framework mediante el uso de la API de fibra y las extensiones administradas para C ++, y cómo se pueden usar fácilmente con otros lenguajes compatibles con .NET.
- ^ Fibras , MSDN Library
- ^ CreateFiber, MSDN
enlaces externos
- Hilos portátiles GNU
- "Biblioteca de Coroutine Portátil" . Código libre .
- Fiber Pool Un marco C ++ con capacidad para múltiples núcleos basado en fibras para Microsoft Windows.
- Hilos de estado
- Protothreads
- costillas2
- boost.fiber