5.6. OTROS SISTEMAS OPERATIVOS.

  1. LINUX.

Lo cierto es, que la mayoría de los sistemas operativos comerciales y no comerciales de mayor difusión que existen están subiéndose al tren de los hilos. Esto se debe a que cada vez es necesario que las computadores trabajen más rápido, y no forma de hacerlo es aprovecharse de las arquitecturas multiprocesador, cada vez más comunes. Pero para ello es necesario que el sistema operativo esté implicado en las tareas de planificación de procesos. Pero además si en vez de procesos son entidades más veloces, como los hilos, la ganancia es mucho mayor. Por ello casi todos los sistemas operativos incorporan o incorporarán hilos, adoptando como API de programación el estándar POSIX 1003.1c en la mayoría de los casos (al menos en sistemas UNIX).

A continuación se presenta un cuadro que resume los distintos sistemas operativos actuales, indicando el tipo de hilos que implementan, la versión de hilos POSIX que soportan, el nivel de implementación (kernel o no) y el modelo de planificación de los hilos : 2 niveles, indica que varios hilos de usuario se enlazan con uno o más hilos de nivel kernel ; o bien, 1 a 1, indica que cada hilo de nivel usuario se enlaza con un hilo exclusivo de nivel kernel (sistemas puros).

Sistema Operativo Hilos preferidosVersión POSIX Soporte KernelModelo de planificación
SunOS 4.xLWPNo No
Solaris 2.3UI-Threads No2 niveles
Solaris 2.4UI-Threads Draft 82 niveles
Solaris 2.5UI-Threads 1003.1.c-19952 niveles
SVR4.2MP/UW 2.0UI-Threads No
IRIX 6.1.sproc()No
IRIX 6.2sproc()1003.1c-1995
Digital UNIX 3.2cma Draft 41 a 1
Digital UNIX 4.01003.1c-1995 1003.1c-1995 2 niveles
DGUX 5.4?Draft 6
NeXTStepC-ThreadsNo
AIX 3.5.xDCE Threads DCE ThreadsNo
AIX 4.1 y 4.2Draft 7 Draft 71 a 1
Plan 9rfork()No
OpenVMS 6.2cmaDraft 4 No
OpenVMS Alpha 7.01003.1c-1995 1003.1c-1995 2 niveles
OpenVMS VAX 7.01003.1c-1995 1003.1c-1995No
HP-UX 10.10Draft 4Draft 4 No
WinNTWin32 ThreadsNo
OS/2DosCreateThread Draft 4
Win32Win32 ThreadsNo 1 a 1
Linux 1.2.13 - 2.0Draft 4 1003.1c-1995No
Linux 2.xclone()No

Figura 5-15 Sistemas operativos con gestión de hilos.

También existen otros sistemas operativos que en sus últimas implementaciones han incorporado hilos a nivel kernel, como es el caso de HP-UX 10.20, Chorus, etc. En general la tendencia es que en breve plazo todos los sistemas operativos soportarán hilos a nivel kernel, con el objetivo de exprimir las ventajas de las arquitecturas multiprocesador, que cada vez son más habituales.

LINUX.

Linux soporta hilos a nivel kernel a partir de la versión 1.3.56, pero es en las versiones 2.x del kernel donde el soporte es más robusto. Sin embargo, existen bibliotecas que implementan hilos a nivel usuario desde la versión 1.0.9. Actualmente se está trabajando en hacer el kernel más seguro y reentrante. Con la introducción de las versiones 2.1.x, el espacio de memoria ha sido revisado, gracias a lo cual se puede acceder de forma más rápida a la memoria de usuario.

La implementación de los hilos a nivel kernel que realiza Linux es muy particular, en concepto, a la presentada habitualmente por el resto de sistemas operativos que implementan hilos en su núcleo. Normalmente se define un hilo de forma independiente respecto de un proceso, en el sentido de que son entidades distintas. En Linux se ha definido un hilo como un contexto de ejecución (COE), lo que significa que solo se necesita una tabla de procesos/hilos y un solo planificador.

Normalmente un hilo posee el estado de la CPU (y alguna otra información mínima de estado) mientras que el proceso contenía el resto de información (datos, E/S, señales) compartida por los hilos del proceso. Con esto se consigue una rápida conmutación entre hilos, pero ocasiona algunos problemas, como qué hacer cuando un hilo realiza llamadas del tipo fork() o execve(). Se puede ver a los hilos de Linux como un superconjunto de esta funcionalidad, ya que todavía pueden conmutar de forma rápida y compartir partes del proceso, pero se puede especificar qué partes se desean compartir, y además no tienen problemas con llamadas del tipo exec() o fork(). Existen cuatro "flags" para indicar la forma de compartir información entre hilos que se pueden especificar en la nueva llamada al sistema clone() que implementa Linux :

La llamada clone(), que es una llamada de bajo nivel, es una extensión de la clásica llamada fork(). De hecho, clone(0) es equivalente a fork(). Sin embargo, clone() combinada con los flags proporciona una mayor funcionalidad. Esta llamada es implementada en las últimas versiones de la librería glibc de la siguiente forma :

int clone( int (*fn)(), void **stack, int flags, int argc, ...
/* args */ );

Cada PID es de 32 bits. Si el flag CLONE_PID no es empleado, cada hilo obtiene su propio PID como cualquier otro proceso. Pero si el PID va a ser compartido, el kernel emplea los 16 bits superiores para asignar el identificador del hilo TID. Además, cada proceso tiene al menos un hilo. A cada nuevo hilo del proceso se le asignará un TID comenzando con 1, pues el 0 está reservado para referirse a todos los hilos del proceso.

Los hilos kernel de Linux son en realidad procesos, con lo cual la planificación es idéntica a la que se hace con el resto de procesos, y además la cancelación o suspensión de los hilos se hace mediante señales.

Por otro lado, el soporte de hilos a nivel kernel de Linux todavía sigue en desarrollo. Aún existe una parte de código del kernel que no es reentrante, sobre todo en el caso de los gestores de dispositivo, y se sigue trabajando en el desarrollo de una librería libc segura y reentrante.

Existen extensiones de Linux para tiempo real en las versiones 2.x del kernel, que permiten establecer políticas de planificación mediante la llamada sched_setscheduler().