martes, 23 de agosto de 2011

Threads

En los sistemas operativos tradicionales, cada proceso tiene su propio espacio de direcciones y un único flujo (hilo) de control. Sin embargo, hay situaciones en las que es deseable contar con múltiples hilos de control (threads) en el mismo espacio de direcciones ejecutándose quasi-paralelamente, como si fueran procesos separados.

El Modelo de los Threads
Se basa en dos conceptos: el agrupamiento de los recursos y la ejecución secuencial de un programa.

Una forma de ver un proceso es que es una manera de agrupar juntos recursos relacionados.
Un proceso tiene un espacio de direcciones conteniendo código y datos del programa, así como otros recursos. Poniendo juntos todos esos recursos en la forma de un proceso, es posible gestionarlos más fácilmente.
El otro concepto que incluye un proceso es el de hilo de ejecución (thread). Aunque un thread debe ejecutarse en algún proceso, el thread y su proceso son conceptos diferentes y pueden tratarse de forma separada. Los procesos se utilizan para agrupar recursos juntos; los threads son las entidades planificadas para su ejecución en la CPU.

Lo que los threads añaden al modelo de los procesos es que permiten que haya múltiples ejecuciones en un mismo entorno determinado por un proceso, y esto con un alto grado de independencia de esas ejecuciones. Tener múltiples threads ejecutándose en paralelo dentro de un proceso es análogo a tener múltiples procesos ejecutándose en paralelo dentro de un ordenador.
Debido a que los threads tienen algunas de las propiedades de los procesos, a veces reciben la denominación de procesos ligeros (lightweight process). También se utiliza el término de multihilo (multithreaded) para describir la situación en la cual se permite que haya múltiples threads en el mismo proceso.

Cuando un proceso multihilo se ejecuta sobre un sistema con una única CPU, los threads deber hacer turnos para ejecutarse. La CPU va conmutándose rápidamente de unos threads a otros proporcionando la ilusión de que los threads se están ejecutando en paralelo, aunque sobre una CPU virtual más lenta que la real.
Los diferentes threads de un proceso no son tan independientes como si fueran diferentes procesos. Todos los threads tienen exactamente el mismo espacio de direcciones, lo que significa en particular que comparten las mismas variables globales. No existe ninguna protección entre los threads debido a que es imposible establecer ninguna medida protección, y es innecesario que haya protección.
Todos los threads comparten, además del espacio de direcciones, el mismo conjunto de ficheros abiertos, procesos hijos, alarmas y señales, etc.
El proceso es la unidad de gestión de recursos, y no el thread. Si cada thread tuviera su propio espacio de direcciones, ficheros abiertos, alarmas pendientes, etc. se trataría de un proceso separado.
Igual que un proceso tradicional (es decir un proceso con un único thread), un thread puede estar en cualquiera de los estados: en ejecución, bloqueado, preparado o terminado.
Cada thread tiene su propia pila, que contiene una trama (o registro de activación) por cada procedimiento al que se ha llamado pero del que todavía no se ha retornado.

No hay comentarios:

Publicar un comentario