¿Cuál es la diferencia entre un hilo y una fibra? He oído hablar de fibras de rubí y he leído que están disponibles en otros idiomas, ¿podría alguien explicarme en términos simples cuál es la diferencia entre un hilo y una fibra?
fuente
¿Cuál es la diferencia entre un hilo y una fibra? He oído hablar de fibras de rubí y he leído que están disponibles en otros idiomas, ¿podría alguien explicarme en términos simples cuál es la diferencia entre un hilo y una fibra?
En los términos más simples, los hilos generalmente se consideran preventivos (aunque esto no siempre es cierto, dependiendo del sistema operativo), mientras que las fibras se consideran hilos ligeros y cooperativos. Ambas son rutas de ejecución separadas para su aplicación.
Con subprocesos: la ruta de ejecución actual puede interrumpirse o adelantarse en cualquier momento (nota: esta declaración es una generalización y puede no ser cierta según el sistema operativo / paquete de subprocesos / etc.). Esto significa que para los subprocesos, la integridad de los datos es un gran problema porque un subproceso puede detenerse en medio de la actualización de un fragmento de datos, dejando la integridad de los datos en un estado incorrecto o incompleto. Esto también significa que el sistema operativo puede aprovechar múltiples CPU y núcleos de CPU al ejecutar más de un hilo al mismo tiempo y dejar que el desarrollador se encargue del acceso a los datos.
Con fibras: la ruta de ejecución actual solo se interrumpe cuando la fibra produce ejecución (la misma nota que la anterior). Esto significa que las fibras siempre comienzan y se detienen en lugares bien definidos, por lo que la integridad de los datos es un problema mucho menor. Además, debido a que las fibras a menudo se administran en el espacio del usuario, no es necesario realizar costosos cambios de contexto y cambios de estado de la CPU, lo que hace que el cambio de una fibra a la siguiente sea extremadamente eficiente. Por otro lado, dado que no pueden ejecutarse dos fibras exactamente al mismo tiempo, el solo uso de fibras no aprovechará múltiples CPU o múltiples núcleos de CPU.
Los hilos usan programación preventiva , mientras que las fibras usan programación cooperativa .
Con un subproceso, el flujo de control podría interrumpirse en cualquier momento y otro subproceso puede asumir el control. Con varios procesadores, puede tener varios subprocesos ejecutándose todos al mismo tiempo (subprocesamiento múltiple simultáneo o SMT). Como resultado, debe tener mucho cuidado con el acceso simultáneo a los datos y proteger sus datos con mutexes, semáforos, variables de condición, etc. A menudo es muy difícil hacerlo bien.
Con una fibra, el control solo cambia cuando se lo indica, generalmente con una llamada de función llamada algo así
yield()
. Esto facilita el acceso simultáneo a los datos, ya que no tiene que preocuparse por la atomicidad de las estructuras de datos o mutexes. Siempre y cuando no ceda, no hay peligro de ser reemplazado y tener otra fibra tratando de leer o modificar los datos con los que está trabajando. Como resultado, sin embargo, si su fibra entra en un bucle infinito, no se puede ejecutar ninguna otra fibra, ya que no está cediendo.También puede mezclar hilos y fibras, lo que da lugar a los problemas que enfrentan ambos. No se recomienda, pero a veces puede ser lo correcto si se hace con cuidado.
fuente
En Win32, una fibra es una especie de subproceso administrado por el usuario. Una fibra tiene su propia pila y su propio puntero de instrucciones, etc., pero las fibras no están programadas por el sistema operativo: debe llamar explícitamente a SwitchToFiber. Los hilos, por el contrario, son programados de manera preventiva por el sistema operativo. En términos generales, una fibra es un subproceso que se administra a nivel de aplicación / tiempo de ejecución en lugar de ser un verdadero subproceso del sistema operativo.
Las consecuencias son que las fibras son más baratas y que la aplicación tiene más control sobre la programación. Esto puede ser importante si la aplicación crea muchas tareas concurrentes y / o quiere optimizar de cerca cuando se ejecutan. Por ejemplo, un servidor de base de datos podría optar por utilizar fibras en lugar de hilos.
(Puede haber otros usos para el mismo término; como se señaló, esta es la definición de Win32).
fuente
Primero, recomendaría leer esta explicación de la diferencia entre procesos y subprocesos como material de fondo.
Una vez que hayas leído eso, es bastante sencillo. Los subprocesos se pueden implementar en el núcleo, en el espacio del usuario, o los dos se pueden mezclar. Las fibras son básicamente hilos implementados en el espacio del usuario.
En la sección 11.4 "Procesos y subprocesos en Windows Vista" en sistemas operativos modernos, Tanenbaum comenta:
fuente
Tenga en cuenta que, además de hilos y fibras, Windows 7 presenta la programación en modo de usuario :
Para obtener más información sobre hilos, fibras y UMS, consulte Dave Probert: Inside Windows 7 - User Mode Scheduler (UMS) .
fuente
Los subprocesos son programados por el sistema operativo (preventivo). El sistema operativo puede detener o reanudar un subproceso en cualquier momento, pero las fibras se manejan más o menos por sí mismas (cooperativas) y ceden entre sí. Es decir, el programador controla cuándo las fibras realizan su procesamiento y cuándo ese procesamiento cambia a otra fibra.
fuente
Los subprocesos generalmente dependen del núcleo para interrumpir el subproceso para que este u otro subproceso pueda ejecutarse (lo que se conoce mejor como multitarea preventiva), mientras que las fibras usan multitarea cooperativa donde es la fibra misma la que abandona su tiempo de ejecución para que otras fibras pueden correr.
Algunos enlaces útiles que lo explican mejor de lo que probablemente hice son:
fuente
Los hilos fueron creados originalmente como procesos ligeros. De manera similar, las fibras son un hilo liviano, que se basa (de manera simplista) en las fibras para programarse entre sí, al ceder el control.
Supongo que el siguiente paso serán los hilos donde tendrás que enviarles una señal cada vez que quieras que ejecuten una instrucción (no muy diferente de mi hijo de 5 años :-). En los viejos tiempos (e incluso ahora en algunas plataformas integradas), todos los subprocesos eran fibras, no había preferencia y tenía que escribir sus subprocesos para comportarse bien.
fuente
La definición de fibra Win32 es, de hecho, la definición de "hilo verde" establecida en Sun Microsystems. No hay necesidad de desperdiciar el término fibra en el hilo de algún tipo, es decir, un hilo que se ejecuta en el espacio de usuario bajo el código de usuario / control de biblioteca de hilos.
Para aclarar el argumento, mire los siguientes comentarios:
Debemos suponer que los procesos están hechos de hilos y que los hilos deben estar hechos de fibras. Con esa lógica en mente, usar fibras para otro tipo de hilos está mal.
fuente