Está en la página 1de 9

Clase 04: Procesos

PROCESOS Y THREADS
El concepto de proceso se origina en el campo de los sistemas operativos, donde comnmente se define
como un programa en ejecucin.
Un thread se puede considerar como la agrupacin de un trozo de programa junto con el
conjunto de registros del procesador que utiliza y una pila de mquina. El conjunto de los registros y de
la pila de cada thread se denomina contexto.
Desde la perspectiva de un sistema operativo, la administracin y programacin temporal de los
procesos es tal vez el aspecto ms crtico. Sin embargo, en los sistemas distribuidos hay otras cuestiones
que son igualmente importantes.
Por ejemplo, para organizar eficientemente sistemas cliente-servidor, frecuentemente resulta
conveniente utilizar tcnicas multithreading (multihilo). La principal contribucin de los threads (hilos)
en los sistemas operativos es que permiten que clientes y servidores sean construidos de tal manera que
la comunicacin y el procesamiento local puedan traslaparse en el tiempo, permitiendo con ello
mayores niveles de desempeo.
Aunque los procesos constituyen el bloque bsico en la implementacin de sistemas distribuidos, la
prctica muestra que el plantear la granularidad (divisin) de un sistema distribuido en diferentes
procesos, tal como lo establecen los sistemas operativos en los que se construyen los sistemas
distribuidos, no es suficiente. Resulta que plantear una granularidad ms fina en la forma de threads
mltiples de control por proceso, hace ms fcil desarrollar aplicaciones distribuidas y obtener un mejor
desempeo.
4.1 Introduccin a Procesos y Threads
Para entender el papel que juegan los threads en los sistemas distribuidos, es importante entender qu
es un proceso, y como se relacionan los procesos y los threads. Al ejecutar programas, el sistema
operativo crea un cierto nmero de procesos virtuales, cada uno para correr un programa diferente. Con
la finalidad de mantener un control y seguimiento de todos estos procesadores virtuales, el sistema
operativo usa una tabla de procesos, la cual contiene entradas para almacenar los valores de los
registros del CPU, mapas de memoria, archivos abiertos, informacin del proceso, privilegios, etc. Un
proceso es frecuentemente definido como un programa en ejecucin, es decir, un programa que est
siendo ejecutado en uno de los procesadores virtuales del sistema operativo. Un asunto importante es
que el sistema operativo tiene mucho cuidado de asegurar que procesos independientes no puedan de
forma maliciosa o inadvertida afectar el comportamiento adecuado de los dems. En pocas palabras,
procesos mltiples puedan compartir concurrentemente el mismo CPU y otros recursos de hardware de
forma transparente. Usualmente, el sistema operativo requiere de hardware que permita esta
separacin.
Esta transparencia de concurrencia tiene un alto costo. Por ejemplo, cada vez que un proceso es
creado, el sistema operativo debe crear un espacio de direcciones independiente y completo. La
Clase 04: Procesos
asignacin de este espacio de memoria puede requerir de la inicializacin de segmentos de memoria,
por ejemplo, poner en ceros todo el segmento de datos, copiar el programa asociado en el segmento de
texto (instrucciones), y preparar un segmento de stack para datos temporales. Tambin resulta costoso
el que el CPU realice un switch (cambio) de contexto (valores de registros, contador de programa,
apuntador de stack, etc.) para cambiar de la ejecucin de un proceso a otro. Aparte de grabar el
contexto del CPU, el sistema operativo debe modificar los registros de una Unidad de Administracin de
Memoria (MMU) e invalidar cachs de traduccin de direcciones, tales como el buffer de traduccin de
direcciones virtuales (TLB Translation Lookaside Buffer). Adems, si el sistema operativo brinda
soporte a ms procesos de los que pueden sostenerse simultneamente en la memoria principal, ste
debe hacer un swap (cambio) de procesos entre la memoria principal y el disco antes de que se realice el
switch de contexto.
Un proceso sencillo puede contener varios programas ejecutables conocidos como threads
(hilos), que trabajan de manera conjunta como un todo coherente, cooperando entre s (ver Figura 4.1).
En un programa o proceso, por ejemplo, un thread podra manejar seales de error, otro podr enviar un
mensaje al usuario sobre ese error, mientras que un tercer thread podra ejecutar la tarea principal del
programa.


Figura 4.1. Diferentes esquemas de uso de threads en procesos.

Un thread resulta de la divisin de un programa en dos o ms tareas que pueden correr
concurrentemente. Mltiples threads pueden existir dentro de un mismo proceso y, por lo tanto,
comparten entre s los mismos recursos, tales como el espacio de memoria del proceso al que
pertenecen. Las diferencias principales entre procesos y threads son las siguientes:
Los procesos son tpicamente independientes, mientras los threads existen como subconjuntos
de los procesos.
Clase 04: Procesos
Los procesos contienen una cantidad considerable de informacin de estatus o contexto,
mientras los threads mltiples dentro de un proceso comparte este estatus al igual que la
memoria y otros recursos (ver Figura 4.2).
Los procesos tienen espacios de direcciones separados entre s, son independientes. Los threads
comparten el mismo espacio de direcciones (ver Figura 4.2).
Los procesos interactan entre s solo mediante mecanismos de comunicacin interproceso
(IPC), lo cual se explicar con mayor detalle ms adelante.
El cambio de contexto (context switching) entre threads en el mismo proceso es tpicamente
ms rpido que el cambio de contexto entre procesos. Al igual que un proceso, un thread
ejecuta su propia parte de cdigo, independientemente de los otros threads. Sin embargo, en
contraste con un proceso, el thread no intenta obtener un alto grado de transparencia de
concurrencia si esto implica una degradacin de desempeo. Por lo tanto, un sistema de threads
generalmente mantiene solo el mnimo de informacin para que un CPU pueda ser compartido
por varios threads. En particular, un contexto de thread comnmente consiste simplemente de
un contexto de CPU y de informacin para la administracin de threads.


Figura 4.2. Informacin de los contextos de un proceso y un thread (hilo).

Hay dos implicaciones importantes del uso de threads al momento de implementar una
aplicacin. Primero que todo, el desempeo de una aplicacin multithread difcilmente es peor que su
contraparte de thread sencillo (proceso simple). De hecho, en muchos casos, el uso de thread mltiples
permite obtener mejores niveles de desempeo. Segundo, ya que los threads no son protegidos
automticamente unos de otros como en el caso de los procesos, el desarrollo de aplicaciones
multithread requiere de un esfuerzo intelectual adicional.
4.2 Niveles de Threads
Existen dos categoras bsicas de threads:
Clase 04: Procesos
Threads de Nivel-Usuario: implementados generalmente por medio de libreras de threads.
Threads de Nivel-Kernel: implementados mediante llamadas a sistema.
De la combinacin de ambas categoras se deriva una tercera conocida como
Threads de Nivel-Hibrido o Combinados.
La Figura 4.3 muestra el esquema de cada uno de estas tres categoras de threads.


Figura 4.3. (a) Threads Nivel-Usuario, (b) Threads Nivel-Kernel, (c) Threads Hibridos o Combinados.

Thread Nivel-Usuario (ULT)
En este nivel, el Kernel no tiene la nocin de la existencia de los threads. Toda la administracin
de los threads es realizada por la aplicacin usando una librera de threads. El cambio de contexto de
threads no requiere de privilegios para el modo kernel (no hay cambio de modo) y la calendarizacin o
programacin en tiempo depende especficamente de la aplicacin.
Actividad del Kernel en threads de nivel-usuario:
El Kernel no sabe de la actividad de los threads pero an administra la actividad de procesos.
Cuando un thread hace una llamada a sistema (system call), el proceso por completo ser
bloqueado (*), pero para la librera de threads ese thread an est corriendo (en estado de
correr - running).
Los estados de los threads son independientes de los estados de los procesos.
Clase 04: Procesos
NOTA (*): Recuerde que un proceso puede estar en distintos estados dentro de su vida (mientras existe). Uno de estos estados
es el de bloqueado, lo cual significa que se encuentra en espera de que ocurra un evento especfico para poder continuar su
procesamiento.

Ventajas:
El cambio de contexto de los threads no involucra al kernel, no se requiere cambio de modo.
La calendarizacin puede ser especfica a la aplicacin, se puede seleccionar el mejor algoritmo.
Los threads nivel-usuario pueden correr en cualquier sistema operativo, solo se requiere una
librera de threads.
Desventajas:
La mayora de las llamadas a sistema son de bloqueo y el Kernel bloquea a los procesos,
entonces todos los threads dentro del proceso tambin sern bloqueados.
El Kernel solo puede asignar procesos a procesadores, por lo que dos threads dentro del mismo
proceso no pueden correr simultneamente en dos procesadores.
Thread Nivel-Kernel (KLT)
En este nivel, toda la administracin de los threads se efecta en el Kernel, no se usa librera de
threads pero s debe existir llamadas a sistema dirigidas a los servicios de threads que provee el Kernel.
El Kernel mantiene la informacin de contexto tanto de procesos como de threads, y el cambio de
contexto de threads requiere que la calendarizacin que establece el Kernel sea basada en threads.
Ventajas:
El Kernel puede calendarizar simultneamente varios threads del mismo proceso en varios
procesadores, el bloqueo se efecta a nivel thread y no a nivel proceso.
Las rutinas del Kernel pueden ser multithread.
Desventajas:
El cambio de contexto entre threads del mismo proceso involucra al Kernel. Si se tienen dos
cambios de modo por cambio de contexto de switch, se aletarga la respuesta del sistema.
Thread Hibrido o Combinado
La idea es combinar lo mejor de cada categora anterior.
El sistema operativo solaris, UNIX de Sun Microsystems, es un buen ejemplo de sistema
operativo que da soporte a threads hibridos.
La creacin de threads tiene lugar en el espacio de usuario (modo de usuario).
Las tareas de calendarizacin y sincronizacin de threads se realiza en el espacio de usuario.
Clase 04: Procesos
El programador puede ajustar el nmero de KLTs.
El Proceso incluye el espacio de direcciones de usuario, stack y bloqueo de control de proceso.
Los ULTs (libreras de threads) invisibles al sistema operativo son la interfaz para el paralelismo
de la aplicacin.
Los KLTs son la unidad que puede ser despachada (asignada) a un procesador.
Cada proceso de peso ligero (LWP Lightweight Process) (**) soporta uno o ms ULTs y es
mapeado a solo un KLT.
NOTA (**): Un proceso de peso ligero (LWP) es un tipo especfico de thread nivel-kernel (KLT) que comparte el mismo estado e
informacin.Un LWP es un medio para implementar el multitasking. Un LWP corre arriba de un thread nivel-kernel sencillo y
comparte su espacio de direcciones y recursos de sistema con otros LWPs que pertenecen al mismo proceso. El LWP puede
generar mltiples threads de nivel-usuario (ULTs), permitiendo con ello el multitasking a nivel usuario, lo cual puede traer
algunos benecifios de desempeo.

La Figura 4.4 muestra lo anteriormente dicho.

Figura 4.4. Implementacin de threads en el sistema operativo Solaris de Sun Microsystems.

4.3 Uso de procesos y threads en sistemas no distribuidos
Clase 04: Procesos
Las aplicaciones grandes son frecuentemente desarrolladas como una coleccin de programas
que colaboran entre s, y cada uno de los cuales es ejecutado por un proceso separado. Este mtodo es
tpico en un ambiente UNIX. La cooperacin entre procesos es comnmente implementada por medio
de mecanismos de comunicacin interproceso (IPC). En los sistemas UNIX, estos mecanismos
tpicamente incluyen pipas, filas de mensaje, segmentos de memoria compartida, sockets, RPCs, etc.
Una de las principales desventajas de todos los mecanismos IPC es que la comunicacin requiere
frecuentemente de una cantidad considerable de cambios de contexto, los cuales se dan en tres puntos
diferentes, tal como se muestra en la Figura 4.5.


Figura 4.5. Cambio de contexto (context switching) como resultado de un IPC.

Ya que un IPC requiere de la intervencin del kernel, un proceso generalmente tiene que cambiar de
modo de usuario a modo de kernel, lo cual se muestra en el punto S1 de la figura anterior. Esto requiere
cambiar el mapa de memoria en el MMU, y tambin desalojar el TLB. Dentro del kernel, se efecta un
cambio de contexto de proceso (punto S2 en la grfica anterior, caso ilustrado tambin en la Figura
4.6a), despus de lo cual el otro proceso puede se activado al cambiar de modo kernel al modo usuario,
de nueva cuenta (punto S3). El ltimo cambio requiere una vez ms el cambiar el mapa del MMU y
desalojar el TLB.
En lugar de usar procesos, una aplicacin puede ser construida de tal manera que partes
diferentes de la misma sean ejecutadas por threads separados. La comunicacin entre estas partes se
implementa completamente con el uso de datos compartidos. El cambio de contexto de threads
(threads switching) puede hacerse frecuentemente en el espacio de usuario, aunque el kernel est al
tanto de los threads y los controle y programe en el tiempo (ver Figura 4.6). El resultado puede ser una
mejora dramtica en el desempeo.
Clase 04: Procesos
Una ventaja de una granulacin ms fina, mediante la divisin de la aplicacin en mltiples
threads (multithreading) es que hace posible el explotar el paralelismo cuando se ejecuta un programa
en un ambiente multitasking, y, an ms, en una mquina multiprocesador (existen sistemas operativos
que dan soporte a ambos ambientes, multitasking y multiprocesador a la vez). En el caso multitasking, el
tiempo de CPU es dividido entre threads y no entre procesos (ver Figura 4.6b). En el caso del sistema
multiprocesador, cada thread es asignado a un CPU diferente mientras que los datos compartidos son
almacenados en memoria principal compartida (ver Figura 4.6c). Cuando el diseo es apropiado, tal
paralelismo puede ser transparente: el proceso correr igualmente bien en un sistema uniprocesador,
aunque un poco ms lento. El uso de multithreading para la implementacin de paralelismo se ha vuelto
cada vez ms importante y extendido, gracias a la disponibilidad de estaciones de trabajo
multiprocesador cuyos precios se han reducido significativamente. Estos sistemas de cmputo son
tpicamente usados para correr servidores en aplicaciones cliente-servidor.


Figura 4.6. (a) Multitasking basado en procesos (procesos con un solo thread), (b) Multitasking basado
en threads (procesos con multithreads), (c) Procesos con multithreads en un ambiente multiprocesador.

Finalmente, hay una razn de la ingeniera de software para usar threads: muchas aplicaciones
son ms sencillas de estructurar como una coleccin de threads cooperativos. Por ejemplo, en el caso de
Clase 04: Procesos
un procesador de palabras (ver Figura 4.7), se pueden usar threads separados para manejar la entrada
de usuario en el teclado, revisar la ortografa y gramtica, grabar el documento en disco, etc.

Figura 4.7. Esquema de un procesador de palabras dividido en threads.

4.4 Uso de threads en sistemas distribuidos

También podría gustarte