Sunteți pe pagina 1din 7

FUNDAMENTOS BSICOS DE THREADS

ANTES DE COMENZAR En este tutorial nos proponemos brindar una ayuda al alumno para familiarizarse con el concepto de thread, su significado, aspectos tericos y caractersticas. Adems examinaremos aspectos de multiprocesamiento (y multithreading), estudiaremos someramente algunos conceptos bsicos de teora de threads y observaremos cmo los threads pueden ser efectivamente usados para crear programas ms eficientes. A tal efecto, nos centraremos en los aspectos de funcionamiento de los programas de mltiples threads, as como en las distintas instancias de procesamiento y administracin de los mismos.

QU ES UN THREAD? Un thread o hilo es un semi-proceso, que tiene su propia pila, y que ejecuta una porcin de cdigo dada. A diferencia de un proceso real, un thread normalmente comparte su memoria con otros threads (en la cual, tal como sucede con los procesos, cada thread tendr asignado su espacio de memoria). Un grupo de threads es un conjunto de hilos de ejecucin que estn corriendo todos dentro del mismo proceso. Dado que comparten todos la misma porcin de memoria, pueden acceder a las mismas variables globales, la misma memoria de heap, los mismos descriptores de archivos, etc. Todos corren en paralelo (por ejemplo: usando porciones del tiempo asignado al proceso en general o, si estn dentro de un sistema con multiprocesadores, pueden eventualmente correr de forma paralela realmente). La ventaja de usar un grupo de threads en lugar de un programa normal en serie es que muchas operaciones pueden ser llevadas a cabo de forma paralela y, de esta forma, los eventos asociados a cada actividad pueden ser manejados inmediatamente tan pronto como llegan (por ejemplo: si tenemos un thread manejando la interface de usuario y otro manejando las consultas a una base de datos, podremos ejecutar consultas complejas realizadas por el usuario y aun as responder a la entrada del mismo mientras la consulta est siendo ejecutada). La ventaja de usar un grupo de threads en vez de un grupo de procesos es que el cambio de contexto entre threads es realizado mucho ms rpidamente que el cambio de contexto entre procesos (un cambio de contexto significa que el sistema operativo cambia la ejecucin de un thread o proceso a la ejecucin de otro). Por lo tanto, las comunicaciones entre dos threads son usualmente ms rpidas y sencillas de implementar que las comunicaciones entre dos procesos. Por otro lado, debido a que los threads dentro de un grupo comparten el mismo espacio de memoria, si uno de ellos corrompe el espacio de su memoria, los otros threads tambin sufrirn las consecuencias. Con un proceso, el sistema operativo normalmente

protege a un proceso de otros y si un proceso corrompe su espacio de memoria los dems no se vern afectados.

BENEFICIOS DE THREADS VS PROCESOS Si se los implementa correctamente entonces los threads tienen algunas ventajas por sobre los (multi) procesos, es as que tendremos:

Menos cantidad de tiempo para crear un nuevo thread respecto de un proceso, porque el nuevo thread usa la direccin de espacio del proceso actual. Menos tiempo en la terminacin de un thread respecto de un proceso. Menos tiempo en el cambio de ejecucin entre dos threads dentro del mismo proceso, debido a que ambos estn usando el mismo espacio de direcciones del proceso. Menor cantidad de overead(sobre carga) en las comunicaciones; dado que la comunicacin entre los threads de un proceso es simple y al compartir recursos comunes, particularmente el espacio de direcciones, la informacin creada por un thread estar disponible para todos los dems.

MULTITHREADING VS. SINGLE THREADING As como podemos tener mltiples procesos corriendo en nuestra PC, tambin podemos tener mltiples threads corriendo. De esta forma aparecen dos grandes grupos de sistemas operativos respecto de la forma de ejecucin de threads. Single threading -- cuando el sistema operativo no reconoce al concepto de thread. Multithreading -- cuando el sistema operativo soporta mltiples threads de ejecucin dentro de un proceso. La figura 1 se muestra la variedad de modelos de ejecucin para threads y procesos.

Figura 1 Modelos de Ejecucin Algunos ejemplos de sistemas operativos populares para cada uno de los modelos presentados en la figura anterior son: MS-DOS -- soporta solo un nico proceso con un nico thread (cuadrante superior izquierdo de la figura). UNIX -- soporta mltiples procesos pero un nico thread por proceso (cuadrante inferior izquierdo de la figura). Solaris -- soporta mltiples threads (en uno o ms procesos). El Multithreading tiene ciertas ventajas respecto de Single Threading:

Mejora la velocidad de respuesta de las aplicaciones. Utiliza los mltiples procesadores de una computadora (si los hubiere) ms eficientemente. Mejora la estructura del programa; dado que muchos programas son ms eficientemente estructurados si se los desarrolla como unidades de ejecucin independientes o semi-independientes, en lugar de ser programas monolticos. Usan menos recursos del sistema, fundamentalmente debido a que los espacios de direcciones se comparten y a que -por ello- la comunicacin entre unidades de ejecucin se simplifica.

La Figura 2 ilustra los diferentes modelos de procesos y controles de threads en una aplicacin single thread y multithreaded.

Figura 2 Aplicaciones de Unico y Multiples Threads Como podemos observar en la Figura 2, los espacios de direcciones y el bloque de control del proceso son compartidos por los esquemas de mltiples threads; mientras que en el caso de los threads nicos esto no sucede, teniendo espacios y bloques de control nicos por cada proceso.

NIVELES DE IMPLEMENTACION DE THREADS Desde el punto de vista de la teora de Lenguajes de Programacin, bsicamente existen dos grandes categoras en lo que respecta a las implementaciones, manejos y administracin de threads:

Threads de Nivel del Lenguaje Bibliotecas que administran Threads. Threads de Nivel del Sistema Operativo Llamadas al sistema implementadas por los sistemas operativos.

Ambos tipos de implementaciones tienen sus ventajas, y en realidad existen algunos sistemas operativos que permiten el acceso a ambos niveles (ejemplo: Solaris).

Threads de Nivel del Lenguaje (TNL)


En este nivel, el kernel del sistema operativo no se preocupa por la existencia de los threads. Toda la administracin de los threads es realizada a nivel del lenguaje, es decir: por la aplicacin, usando alguna biblioteca de threads. Los cambios entre Threads durantes la ejecucin no requieren de la intervencin del kernel, ni de sus privilegios y la planificacin de los mismos es especfica de la aplicacin. En algunos textos los TNL suelen denominarse tambin threads de nivel de usuario.

Ventajas e inconvenientes de TNL Ventajas:


El cambio entre threads no involucra al sistema operativo. La planificacin puede ser especifica de la aplicacin mejorando as la performance al seleccionar el algoritmo que ms conveniente. TNLs pueden correr en cualquier sistema operativo, slo necesitan de las bibliotecas de administracin de threads.

Desventajas:

La mayora de las llamadas al sistema son bloqueantes y como el kernel bloquea procesos (no conoce de threads) entonces terminar bloqueando a todos los threads dentro de un mismo proceso. El kernel puede slo asignar procesadores a los procesos, por lo que dos threads dentro de un mismo proces o no podrn correr en forma simultnea, ya que disponen de un nico procesador para correr.

Threads de Nivel de Sistema Operativo (TNSO)


A diferencia del nivel anterior, en este nivel la administracin de los threads es realizada por el kernel del sistema operativo, por ende no existen bibliotecas de threads pero puede existir un API (de llamadas al sistema) que el kernel facilita para su utilizacin. El kernel mantiene la informacin del contexto de los procesos y los threads, es as que los cambios entre threads requieren la intervencin del kernel en el proceso de planificacin de la ejecucin de los mismos. En algunos textos los TNSO suelen denominarse tambin threads de nivel de kernel. Ventajas e Inconvenientes de los TNSO Ventajas

El kernel puede simultneamente administrar varios threads de un mismo proceso en varios procesadores. Las rutinas del kernel pueden ser multithreaded.

Desventajas:

Los cambios entre threads dentro de un mismo proceso involucran la intervencin del kernel, pudiendo generar demoras en el tiempo de ejecucin.

Aproximaciones combinadas de TNL/TNSO


Tambin existen modelos hbridos, donde la idea central es combinar lo mejor de cada una de las aproximaciones anteriores. Solaris es un ejemplo de un sistema operativo que combina TNL y TNSO.

ADMINISTRACIN DE LA MEMORIA CON THREADS Podemos decir que la planificacin de la ejecucin de los threads es una clara diferencia entre ambos modelos de implementacin de threads: en el TNL la planificacin es llevada a cabo a nivel del lenguaje, mientras que en el TNSO es llevada a cabo a nivel de sistema operativo. Sin embargo, an no hemos estudiado a qu nivel se efecta la administracin de la memoria. Es decir: la manera en que cada thread accede a los datos compartidos por los restantes threads o a sus propios datos. Es importante sealar que en una aplicacin de mltiples threads no todos los datos pueden ser compartidos entre los threads; sino que cada thread posee una pila propia de ejecucin, donde cada uno de sus procedimientos o funciones alojan (en sus respectivos registros de activacin) las variables semiestticas, semidinmicas, descriptores, etc. Los datos almacenados en cada pila de ejecucin slo son accesibles por el thread propietario de dicha pila. En cambio, los datos almacenados en el heap y los datos almacenados en forma esttica pueden ser compartidos por todos los threads del proceso; razn por la cual, puede ser necesario establecer mecanismos de sincronizacin que controlen el acceso a estos datos. En este esquema, la forma en que se administre el espacio de memoria del proceso es crucial para garantizar una ejecucin correcta de la aplicacin. Respecto de la administracin de la memoria, puede decirse que el sistema operativo provee a la aplicacin de una porcin de memoria, a travs de una cierta poltica que depende del sistema que utilicemos. Luego, esta porcin de memoria debe se administrada (por el lenguaje o por el S.O.) en funcin de las caractersticas de la aplicacin y del lenguaje de programacin en cuestin. En este punto deben tomarse decisiones tales como qu cantidad de memoria se asigna al proceso? qu cantidad de memoria del proceso se asigna a cada thread? cmo y dnde se ubican las pilas de ejecucin de cada thread?; etc. Para contestar adecuadamente estos interrogantes es necesario conocer cierta informacin sobre la forma en que se ejecutarn los diferentes threads de la aplicacin. Por ejemplo: si un thread necesita mucho ms espacio de memoria que otros threads necesitara ser alojado en un sector de memoria lo suficientemente amplio, como para atender sus demandas de memoria sin afectar a otras porciones de datos. Dado que no siempre es posible inferir este tipo de conocimiento, las estrategias de administracin de memoria pueden diferir. Por ende, puede ocurrir que la administracin de memoria sea llevada a cabo por el S.O. o por el Lenguaje. Frecuentemente, cuando no es posible conocer las caractersticas de ejecucin de los threads, es el S.O. el que efecta las tareas de administracin de la memoria. Si, en cambio, el usuario del lenguaje (el programador) conoce esta informacin puede determinar la poltica de administracin de memoria mediante instrucciones al compilador de la aplicacin; o sea, establecer una administracin a nivel del lenguaje.

IMPLEMENTACIONES Existen muchas y muy diferentes e incompatibles versiones de threading. stas incluyen implementaciones tanto a nivel de usuario como a nivel de kernel. Debemos notar que los trheads pueden ser implementados sin soporte del sistema operativo, aunque algunos sistemas operativos o bibliotecas proveen soporte explcito para ellos. Por ejemplo, las versiones recientes de Microsoft Windows (Windows NT 3.51 SP3 y posteriores) soportan el API de threads para aplicaciones que quieren mejorar su performance mediante el uso de sus propios esquemas de administracin, en lugar de dejar dicha actividad al planificador del sistema operativo. Microsoft SQL Server 2000 en el modo de planificacin de usuario es un ejemplo de ello.

Ejemplos de implementaciones a nivel de Sistema Operativo


Light Weight Kernel Threads en varios BSDs. M:N threading (en BSDs). Native POSIX Thread Library para Linux, una implementacin de POSIX Threads (pthreads) standard. Apple Multiprocessing Services (en versiones 2.0 y posteriores).

Ejemplos de Implementaciones de nivel de Lenguaje


GNU Portable Threads [1] FSU Pthreads Apple Computer's Thread Manager Threads cooperativos de REALbasic

Ejemplos de Implementaciones Hbridas

Scheduler activations usadas por la biblioteca native POSIX de NetBSD

BIBLIOGRAFA http://users.actcom.co.il/~choo/lupg/tutorials/debugging/debugging-withgdb.html http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html http://www.cs.cf.ac.uk/Dave/C/node29.html http://en.wikipedia.org/wiki/Thread_(computer_science)

S-ar putea să vă placă și