Hilos (Threads)
Hilos (Threads)
Hilos (Threads)
INDICE
HILO DE EJECUCIN ........................................................................................................................ 3 DIFERENCIAS ENTRE HILOS Y PROCESOS ................................................................................ 4 FUNCIONALIDAD DE LOS HILOS ................................................................................................... 4 ESTADOS DE UN HILO ..................................................................................................................... 4 VENTAJAS DE LOS HILOS CONTRA PROCESOS....................................................................... 4 SINCRONIZACIN DE HILOS .......................................................................................................... 5 HILOS A NIVEL DE USUARIO (ULT)........................................................................................................... 5 HILOS A NIVEL DE NCLEO (KLT) ............................................................................................................ 6 TAREAS E HILOS. UNIDAD MNIMA DE ASIGNACIN: TAREA. UNIDAD MNIMA DE EXPEDICIN: HILO.................................................................................................................................. 6 CONCEPTOS BSICOS SOBRE HILOS ......................................................................................... 7 CLASES RELACIONADAS CON LOS HILOS ................................................................................ 8 THREAD .................................................................................................................................................... 8 RUNNABLE................................................................................................................................................ 8 THREADDEATH......................................................................................................................................... 9 THREADGROUP........................................................................................................................................ 9 OBJECT .................................................................................................................................................... 9 CREACIN DE HILOS ..................................................................................................................... 10 ESTADO Y CONTROL DE HILOS .................................................................................................. 12 ESTADOS DE UN HILO ............................................................................................................................ 12 New ................................................................................................................................................... 12 Runnable .......................................................................................................................................... 12 Not running....................................................................................................................................... 13 Dead.................................................................................................................................................. 13 CONTROL DE UN HILO ................................................................................................................... 14 ARRANQUE DE UN HILO .......................................................................................................................... 14 MANIPULACIN DE UN HILO ................................................................................................................... 14 SUSPENSIN DE UN HILO ...................................................................................................................... 14 PARADA DE UN HILO .............................................................................................................................. 15 AGRUPAMIENTO DE HILOS ..................................................................................................................... 15 EL GRUPO DE HILOS POR DEFECTO ....................................................................................................... 15 LA CLASE THREADGROUP ........................................................................................................... 16 PLANIFICACIN Y PRIORIDAD DE HILOS .................................................................................. 19 PLANIFICACIN (SCHEDULING).............................................................................................................. 19 PRIORIDAD ............................................................................................................................................. 20 TIEMPO COMPARTIDO ............................................................................................................................ 22 SINCRONIZACIN ........................................................................................................................... 24 MONITORES ..................................................................................................................................... 24 HILOS DEMONIO (DAEMON) ......................................................................................................... 26
USP-Ingeniera Informtica y Sistemas Pgina 1
HILOS (THREADS)
CONCLUSIONES .............................................................................................................................. 26 FUNCIONES MIEMBRO DE LA CLASE THREAD ....................................................................... 26 SUMARIO DE CONSTRUCTORES ............................................................................................................. 27 SUMARIO DE MTODOS .......................................................................................................................... 27 HILOS Y MTODOS NATIVOS ....................................................................................................... 29 HILOS Y LA JNI ................................................................................................................................ 30 HILOS EN APPLETS. EJEMPLOS ................................................................................................. 31 HILOS EN SERVLETS. .................................................................................................................... 32 ORGANIZACIN DE LOS HILOS DE UN PROCESO. .................................................................. 32 MODELO SERVIDOR/TRABAJADOR: ........................................................................................................ 32 MODELO DE COLA DE TRABAJO: ............................................................................................................ 33 MODELO DE EQUIPO: ............................................................................................................................. 33 DISEO DE UN PAQUETE DE HILOS ........................................................................................................ 34 ESTRUCTURA BSICA. .................................................................................................................. 34 PAQUETE DE HILOS DE NIVEL USUARIO. ................................................................................................ 35 PAQUETE DE HILOS DE NIVEL KERNEL. .................................................................................................. 35 VENTAJAS DE LOS HILOS ............................................................................................................... 36 PROBLEMAS POTENCIALES DE LOS HILOS .............................................................................. 38 IMPLEMENTACIN DE BARRERAS. ............................................................................................ 39 Computacin multihilo. ................................................................................................................... 39 MODELO DE COMPUTACIN MULTIHILO. ................................................................................. 39 PROCESOS LIGEROS HILOS O HEBRAS ................................................................................... 40 CARACTERISTICAS ........................................................................................................................ 41
Pgina 2
HILOS (THREADS)
Hilo de ejecucin
En sistemas operativos, un hilo de ejecucin, hebra o subproceso es la unidad de procesamiento ms pequea que puede ser planificada por un sistema operativo. La creacin de un nuevo hilo es una caracterstica que permite a una aplicacin realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecucin comparten una serie de recursos tales como el espacio de memoria, los archivos abiertos, situacin de autenticacin, etc. Esta tcnica permite simplificar el diseo de una aplicacin que debe llevar a cabo distintas funciones simultneamente. Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo con otra tarea. Los hilos de ejecucin que comparten los mismos recursos, sumados a estos recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos de ejecucin de un mismo proceso compartan los recursos hace que cualquiera de estos hilos pueda modificar stos. Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese dato modificado inmediatamente. Lo que es propio de cada hilo es el contador de programa, la pila de ejecucin y el estado de la CPU (incluyendo el valor de losregistros). El proceso sigue en ejecucin mientras al menos uno de sus hilos de ejecucin siga activo. Cuando el proceso finaliza, todos sus hilos de ejecucin tambin han terminado. Asimismo en el momento en el que todos los hilos de ejecucin finalizan, el proceso no existe ms y todos sus recursos son liberados. Algunos lenguajes de programacin tienen caractersticas de diseo expresamente creadas para permitir a los programadores lidiar con hilos de ejecucin (como Java o Delphi). Otros (la mayora) desconocen la existencia de hilos de ejecucin y stos deben ser creados mediante llamadas de biblioteca especiales que dependen del sistema operativo en el que estos lenguajes estn siendo utilizados (como es el caso del C y del C++). Un ejemplo de la utilizacin de hilos es tener un hilo atento a la interfaz grfica (iconos, botones, ventanas), mientras otro hilo hace una larga operacin internamente. De esta manera el programa responde de manera ms gil a la interaccin con el usuario. Tambin pueden ser utilizados por una aplicacin servidora para dar servicio a mltiples clientes.
Pgina 3
HILOS (THREADS)
Estados de un hilo
Los principales estados de los hilos son: Ejecucin, Listo y Bloqueado. No tiene sentido asociar estados de suspensin de hilos ya que es un concepto de proceso. En todo caso, si un proceso est expulsado de la memoria principal (RAM), todos sus hilos debern estarlo ya que todos comparten el espacio de direcciones del proceso.
HILOS (THREADS)
2. Se tarda mucho menos en terminar un hilo que un proceso, ya que cuando se elimina un proceso se debe eliminar el BCP1 del mismo, mientras que un hilo se elimina su contexto y pila. 3. Se tarda mucho menos tiempo en cambiar entre dos hilos de un mismo proceso 4. Los hilos aumentan la eficiencia de la comunicacin entre programas en ejecucin. En la mayora de los sistemas en la comunicacin entre procesos debe intervenir el ncleo para ofrecer proteccin de los recursos y realizar la comunicacin misma. En cambio, entre hilos pueden comunicarse entre s sin la invocacin al ncleo. Por lo tanto, si hay una aplicacin que debe implementarse como un conjunto de unidades de ejecucin relacionadas, es ms eficiente hacerlo con una coleccin de hilos que con una coleccin de procesos separados.
Sincronizacin de hilos
Todos los hilos comparten el mismo espacio de direcciones y otros recursos como pueden ser archivos abiertos. Cualquier modificacin de un recurso desde un hilo afecta al entorno del resto de los hilos del mismo proceso. Por lo tanto, es necesario sincronizar la actividad de los distintos hilos para que no interfieran unos con otros o corrompan estructuras de datos. Una ventaja de la programacin multihilo es que los programas operan con mayor velocidad en sistemas de computadores con mltiples CPUs (sistemas multiprocesador o a travs de grupo de mquinas) ya que los hilos del programa se prestan verdaderamente para la ejecucin concurrente. En tal caso el programador necesita ser cuidadoso para evitar condiciones de carrera (problema que sucede cuando diferentes hilos o procesos alteran datos que otros tambin estn usando), y otros comportamientos no intuitivos. Los hilos generalmente requieren reunirse para procesar los datos en el orden correcto. Es posible que los hilos requieran de operaciones atmicas para impedir que los datos comunes sean cambiados o ledos mientras estn siendo modificados, para lo que usualmente se utilizan los semforos. El descuido de esto puede generar interbloqueo.
Pgina 5
HILOS (THREADS)
Tareas e hilos.
Unidad mnima de asignacin: tarea. Unidad mnima de expedicin: hilo. Dos hilos de una misma tarea (denominados hilos pares) comparten el segmento de cdigo, el segmento de datos y un espacio de pila, es decir, los recursos asignados a la tarea. Podemos captar la funcionalidad de los hilos si comparamos el control de mltiples hilos con el control de mltiples procesos. En el caso de los procesos, cada uno opera independientemente de los otros; cada proceso tiene su propio contador de programa, registro de pila, y espacio de direcciones. Este tipo de organizacin es muy til cuando los trabajos que los procesos efectan no tienen ninguna relacin entre si. Pero cuando los trabajos a realizar van a necesitar, por ejemplo, la llamada a una misma funcin o bien, la comparticin de una variable en memoria, nos interesar englobarlos en una tarea. Ej: Avion-Torre. Cuando un hilo est en ejecucin, posee el acceso a todos los recursos que tiene asignados la tarea.
Estado. Contexto del procesador. Punto en el que estamos ejecutando, la instruccin concretamente en la que nos hallamos. Es til a la hora de reanudar un hilo que fue interrumpido con anterioridad, puesto que al guardar el contexto, guardamos la ultima instruccin que ejecutamos, y as podemos conocer por donde tenemos que continuar la ejecucin del hilo.
Pila de ejecucin donde se ir metiendo y sacando instrucciones. (Lugar donde almacenaremos las instrucciones que van a ser ejecutadas). Espacio de almacenamiento esttico donde almacenar las variables. Acceso a los recursos de la tarea, que son compartidos por todos los hilos de la tarea.
Pgina 6
HILOS (THREADS)
Se tarda menos tiempo en crear un hilo de una tarea existente que en crear un nuevo proceso. Se tarda menos tiempo en terminar un hilo que en terminar un proceso. Se tarda menos tiempo en cambiar entre dos hilos de una misma tarea que en cambiar entre dos procesos (porque los recursos no cambian, por ejemplo) Es mas sencillo la comunicacin (paso de mensajes por ejemplo) entre hilos de una misma tarea que entre diferentes procesos. Cuando se cambia de un proceso a otro, tiene que intervenir el ncleo del sistema operativo para que haya proteccin. Cuando se cambia de un hilo a otro, puesto que la asignacin de recursos es la misma, no hace falta que intervenga el sistema operativo.
HILOS (THREADS)
en lo que se refiere a recursos de ejecucin. La siguiente figura muestra le relacin entre hilos y procesos
Thread
La clase Thread es la clase responsable de producir hilos funcionales para otras clases. Para aadir la funcionalidad de hilo a una clase simplemente se deriva la clase de Thread y se ignora el mtodo run. Es en este mtodo run donde el procesamiento de un hilo toma lugar, y a menudo se refieren a l como el cuerpo del hilo. La clase Thread tambin define los mtodos start y stop, los cuales te permiten comenzar y parar la ejecucin del hilo, adems de un gran nmero de mtodos tiles. Al final de este documento, en Apndice A: Funciones Miembro de la Clase Thread (se ha incluido una relacin de mtodos de esta clase con una breve descripcin. Para una documentacin ms extensa de todas las funciones miembro, se sugiere consultar
Runnable
Java no soporta herencia mltiple de forma directa, es decir, no se puede derivar una clase de varias clases padre. Esto nos plantea la duda sobre cmo podemos aadir la funcionalidad de Hilo a una clase que deriva de otra clase, siendo sta distinta de Thread. Para lograr esto se utiliza la interfaz Runnable. La interfaz Runnable proporciona la capacidad de aadir la funcionalidad de un hilo a una clase simplemente implementando la interfaz, en lugar de derivndola de la clase Thread. Gonzlez et al. Las clases que implementan la interfaz Runnable proporcionan un mtodo run que es ejecutado por un objeto hilo asociado que es creado aparte. Esta es una herramienta muy til y a menudo es la nica salida que tenemos para incorporar multihilo dentro de las clases. Esta cuestin ser tratada ms ampliamente en el apartado de Creacin de hilos.Aunque es un nico mtodo el que se define en esta interfaz,
Pgina 8
HILOS (THREADS)
ThreadDeath
La clase de error ThreadDeath proporciona un mecanismo que permite hacer limpieza despus de que un hilo haya sido finalizado de forma asncrona. Se llama a ThreadDeath una clase error porque deriva de la clase Error, la cual proporciona medios para manejar y notificar errores. Cuando el mtodo stop de un hilo es invocado, una instancia de ThreadDeath es lanzada por el moribundo hilo como un error. Slo se debe recoger el objeto ThreadDeath si se necesita para realiza una limpieza especfica a la terminacin asncrona , lo cual es una situacin bastante inusual. Si se recoge el objeto, debe ser relanzado para que el hilo realmente muera
ThreadGroup
La clase ThreadGroup se utiliza para manejar un grupo de hilos de modo conjunto. Esto nos proporciona un medio para controlar de modo eficiente la ejecucin de una serie de hilos. Por ejemplo la clase ThreadGroup nos proporciona mtodos stop, suspend y resume para controlar la ejecucin de todos los hilos pertenecientes al grupo. Los grupos de hilos tambin pueden contener otros grupos de hilos permitiendo una jerarqua anidada de hilos. Los hilos individuales tienen acceso al grupo pero no al padre del grupo.
Object
Aunque, estrictamente hablando, no es una clase de apoyo a los hilos, la clase objeto proporciona unos cuantos mtodos cruciales dentro de la arquitectura multihilo de Java. Estos mtodos son wait, notify y notifyAll. El mtodo wait hace que el hilo de ejecucin espere en estado dormido hasta que se le notifique que contine. Del mismo modo, el mtodo notify informa a un hilo en espera de que contine con su ejecucin. El mtodo notifyAlles similar a notify excepto que se aplica a todos los hilos en espera. Estos tres mtodos solo pueden ser llamados desde un mtodo o bloque sincronizado (o bloque de sincronizacin). Java Threads (Hilos en Java) Normalmente estos mtodos se utilizan cuando hay ejecucin multihilo, es decir, cuando un mtodo espera a que otro mtodo termine de hacer algo antes de poder continuar. El primer hilo espera hasta que otro hilo le notifique que puede continuar. La clase objeto est en la parte superior de la jerarqua de Java, lo cual significa que es el padre de todas las clases. En otras palabras, cada clase Java hereda la funcionalidad proporcionada por la clase objeto, incluyendo los mtodos wait, notify y notifyAll.
Pgina 9
HILOS (THREADS)
Creacin de Hilos
En Java, los hilos comparten el mismo espacio de memoria. Incluso comparten gran parte del entorno de ejecucin, de modo que la creacin de nuevos hilos es mucho ms rpida que la creacin de nuevos procesos. La ventaja que proporcionan los hilos es la capacidad de tener ms de un camino de ejecucin en un mismo programa. As, con un nico proceso, ejecutndose una JVM (Java Virtual Machine), habr siempre ms de un hilo, cada uno con su propio camino de ejecucin. En cuanto al proceso de creacin de hilos, son dos los mecanismos que nos permiten llevarlo a cabo en Java: implementando la interfaz Runnable, o extendiendo la clase Thread, esto es, creando una subclase de esta clase. Lo ms habitual es crear hilos implementando la interfaz Runnable, dado que las interfaces representan una forma de encapsulamiento del trabajo que una clase debe realizar. As, se utilizan para el diseo de requisitos comunes a todas las clases que se tiene previsto implementar. La interfaz define el trabajo, la funcionalidad que debe cubrirse, mientras que la clase o clases que implementan la interfaz realizan dicho trabajo (cumplen esa funcionalidad). Todas las clases o grupos de clases que implementen una cierta interfaz debern seguir las mismas reglas de funcionamiento. El otro mecanismo de creacin de hilos, como ya hemos dicho, consistira en la creacin previa de una subclase de la clase Thread, la cual podramos instanciar despus.
Por ejemplo:
class MiThread extends Thread { public void run() { . . } } .
se corresponde con la declaracin de un clase, MiThread, que extiende la clase Thread, sobrecargando el mtodo Thread.run heredado con su propia implementacin. Es en el mtodo run donde se implementa el cdigo correspondiente a la accin (la tarea) que el hilo debe desarrollar . El mtodo run no es invocado directa o explcitamente (a menos que no quieras que se ejecute dentro de su propio hilo). En lugar de esto, los hilos se arrancan con el mtodo start, se suspenden con el mtodo suspend, se reanudan con el mtodo resume, y se detienen con el mtodo stop (el cual supone tambin la muerte del hilo y la correspondiente excepcin ThreadDeath), como ya explicaremos en el apartado de Estado y Control de Hilos. Un hilo suspendido puede reanudarse en la instruccin del mtodo run en la que fue suspendido. En el
USP-Ingeniera Informtica y Sistemas Pgina 10
HILOS (THREADS)
caso de crear un hilo extendiendo la clase Thread, se pueden heredar los mtodos y variables de la clase padre. Si es as, una misma subclase solamente puede extender o derivar una vez de la clase padre Thread. Esta limitacin de Java puede ser superada a travs de la implementacin de Runnable. Veamos el siguiente ejemplo: public class MiThread implements Runnable { Thread t; public void run() { // Ejecucin del thread una vez creado } } En este caso necesitamos crear una instancia de Thread antes de que el sistema pueda ejecutar el proceso como un hilo. Adems, el mtodo abstracto run que est definido en la interfaz Runnable tiene que implementarse en la nueva clase creada. La diferencia entre ambos mtodos de creacin de hilos en Java radica en la flexibilidad con que cuenta el programador, que es mayor en el caso de la utilizacin de la interfaz Runnable. Sobre la base del ejemplo anterior, se podra extender la clase MiThread a continuacin, si fuese necesario. La mayora de las clases creadas que necesiten ejecutarse como un hilo implementarn la interfaz Runnable, ya que as queda cubierta la posibilidad de que sean extendidas por otras clases.Por otro lado, es un error pensar que la interfaz Runnable est realizando alguna tarea mientras un hilo de alguna clase que la implemente se est ejecutando. Es una interfaz, y como tal, slo contiene funciones abstractas (concretamente una nica, run), proporcionando tan solo una idea de diseo, de infraestructura, de la clase Thread, pero ninguna funcionalidad. Su declaracin en Java tiene el siguiente aspecto: package Java.lang; public interfaz Runnable { public abstract void run() ; } Comentados los aspectos ms importantes de la interfaz Runnable, veamos ahora la definicin de la clase Thread, de la cual podemos deducir lo que realmente se est haciendo: public class Thread implements Runnable { . . . public void run() {
Pgina 11
HILOS (THREADS)
if( tarea != null ) tarea.run() ; } ...} Se deduce, por tanto, que la propia clase Thread de Java tambin implementa la interfaz Runnable. Observamos que en el mtodo run de Thread se comprueba si la clase con que se est trabajando en ese momento (tarea), que es la clase que se pretende ejecutar como hilo, es o no nula. En caso de no ser nula, se invoca al mtodo run propio de dicha clase.
New
Un hilo esta en el estado new la primera vez que se crea y hasta que el mtodo start es llamado. Los hilos en estado new ya han sido inicializados y estn listos para empezar a trabajar, pero an no han sido notificados para que empiecen a realizar su trabajo.
Runnable
Cuando se llama al mtodo start de un hilo nuevo, el mtodo run es invocado y el hilo entra en el estado runnable. Este estado podra llamarse running porque la ejecucin del mtodo run significa que el hilo esta corriendo. Sin embargo, debemos tener en cuenta la prioridad de los hilos. Aunque cada hilo est corriendo desde el punto de vista del usuario, en realidad todos los hilos, excepto el que en estos momentos esta utilizando la CPU, estn en el estado runnable (ejecutables, listos para correr) en cualquier momento dado. Uno puede pensar conceptualmente en el estado runnable como si fuera el estado running, slo tenemos que recordar que todos los hilos tienen que compartir los recursos del sistema.
Pgina 12
HILOS (THREADS)
Not running
El estado not running se aplica a todos los hilos que estn parados por alguna razn. Cuando un hilo est en este estado, est listo para ser usado y es capaz de volver al estado runnable en un momento dado. Los hilos pueden pasar al estado not running a travs de varias vas.A continuacin se citan diferentes eventos que pueden hacer que un hilo est parado de modo temporal. El mtodo suspend ha sido llamado El mtodo sleep ha sido llamado El mtodo wait ha sido llamado El hilo esta bloqueado por I/O Para cada una de estas acciones que implica que el hilo pase al estado not running hay una forma para hacer que el hilo vuelva a correr. A continuacin presentamos la lista de eventos correspondientes que pueden hacer que el hilo pase al estado runnable. Si un hilo est suspendido, la invocacin del mtodo resume Si un hilo est durmiendo, pasarn el nmero de milisegundos que se ha especificado que debe dormir Si un hilo est esperando, la llamada a notify o notifyAll por parte del objeto por el que espera Si un hilo est bloqueado por I/O, la finalizacin de la operacin I/O en cuestin
Dead
Un hilo entra en estado dead cuando ya no es un objeto necesario. Los hilos en estado dead no pueden ser resucitados y ejecutados de nuevo. Un hilo puede entrar en estado dead a travs de dos vas: El mtodo run termina su ejecucin. El mtodo stop es llamado. La primera opcin es el modo natural de que un hilo muera. Uno puede pensar en la muerte de un hilo cuando su mtodo run termina la ejecucin como una muerte por causas naturales. En contraste a esto, est la muerte de un hilo por causa de su mtodo stop. Una llamada al mtodo stop mata al hilo de modo asncrono. Aunque la segunda opcin suene un poco brusca, a menudo es muy til. Por ejemplo, es bastante comn que los applets maten sus hilos utilizando el mtodo stop cuando el propio mtodo stop del applet ha sido invocado. La razn de esto es que el mtodo stop del appletes llamado normalmente como respuesta al hecho de que el usuario ha abandonado la pgina
USP-Ingeniera Informtica y Sistemas Pgina 13
HILOS (THREADS)
web que contena el applet y no es adecuado dejar hilos de un applet corriendo cuando el appletno est activo, as que es deseable matar los hilos.
Control de un hilo
Arranque de un hilo
En el contexto de las aplicaciones, sabemos que es main la primera funcin que se invoca tras arrancar, y por tanto, lgicamente, es el lugar ms apropiado para crear y arrancar otros hilos. La lnea de cdigo: t1 = new TestTh( "Thread 1",(int)(Math.random()*2000) );siendo TestTh una subclase de la clase Thread (o una clase que implemente la interfaz Runnable) crea un nuevo hilo. Los dos argumentos pasados, sin mayor relevancia, satisfarn el prototipo del constructor de la clase y se utilizarn para la inicializacin del objeto. Al tener control directo sobre los hilos, tenemos que arrancarlos explcitamente. Como ya se coment anteriormente, es la funcin miembro start la que nos permite hacerlo.
Manipulacin de un hilo
Si todo fue bien en la creacin del objeto TestTh (t1), ste debera contener un hilo, una traza de ejecucin vlida, que controlaremos en el mtodo run del objeto. El cuerpo de esta funcin miembro viene a ser el cuerpo de un programa como ya los conocemos. Digamos que es la rutina main a nivel de hilo. Todo lo que queremos que haga el hilo debe estar dentro del mtodo run. Cuando finalice run, finalizar tambin el hilo que lo ejecutaba.
Suspensin de un Hilo
La funcin miembro suspend de la clase Thread permite tener un control sobre el hilo de modo que podamos desactivarlo, detener su actividad durante un intervalo de tiempo indeterminado, a diferencia del uso de la llamada al sistema sleep, que simplemente lleva al hilo a un estado de dormido, y siempre durante un nmero de milisegundos concreto. Este mtodo puede resultar til si, construyendo un applet con un hilo de animacin, queremos permitir al usuario detener (que no finalizar) la animacin, hasta que ste decida reanudarla.Este mtodo no detiene la ejecucin permanentemente. El hilo es suspendido indefinidamente y para volver a activarlo de nuevo necesitamos realizar una invocacin a la funcin miembro resume.
Pgina 14
HILOS (THREADS)
Parada de un Hilo
Ya conocemos los mtodos de control de hilos que nos permiten arrancarlos, suspenderlos y reanudarlos. El ltimo elemento de control que se necesita sobre hilos es el mtodo stop, utilizado para terminar la ejecucin de un hilo de forma permanente: t1.stop(); Sealar que esta llamada no destruye el hilo, sino que detiene su ejecucin, y sta no puede reanudarse con el mtodo start. Cuando se desasignen las variables que se usan en el hilo, el objeto hilo (creado con new) quedar marcado para eliminarlo y el garbage collector(recolector de basura de Java) se encargar de liberar la memoria que utilizaba. Tiene sentido su utilidad, por ejemplo, en aplicaciones complejas que necesiten un control sobre cada uno de los hilos que se lancen. Por ltimo, un mtodo de control de hilos que nos permite comprobar si una instancia est viva (el hilo se ha arrancado y an no se ha detenido) o no (bien no se arranc; bien ya finaliz). Estamos hablando de la funcin miembro isAlive. t1.isAlive(); Devolver true en caso de que el hilo t1 est vivo, es decir, ya se haya llamado a su mtodo run y no haya sido parado con un stop ni haya terminado el mtodo run en su ejecucin. En otro caso, lgicamente, devolver false.
Agrupamiento de Hilos
Todo hilo de Java es un miembro de un grupo de hilos. Los grupos de hilos proporcionan un mecanismo de reunin de mltiples hilos dentro de un nico objeto y de manipulacin de dichos hilos en conjunto, en lugar de una forma individual. Por ejemplo, se pueden arrancar o suspender todos los hilos que estn dentro de un grupo con una nica llamada al mtodo. Los grupos de hilos de Java estn implementados por la clase ThreadGroup en el paquete Java.lang. El runtime system (sistema de tiempo de ejecucin) de Java pone un hilo dentro de un grupo de hilos en el momento de la construccin del mismo. Cuando creas un hilo, se puede dejar que el sistema de tiempo de ejecucin ponga el nuevo hilo en algn grupo razonable por defecto, o se puede establecer explcitamente el grupo del nuevo hilo. El hilo es un miembro permanente de aquel que sea el grupo de hilos al cual se uni en el momento de su creacin. No puede moverse un hilo a un nuevo grupo una vez que ha sido creado.
Pgina 15
HILOS (THREADS)
La clase ThreadGroup
La clase ThreadGroup es la implementacin del concepto de grupo de hilos en Java. Ofrece, por tanto, la funcionalidad necesaria para la manipulacin de grupos de hilos para las aplicaciones Java. Un objeto ThreadGroup puede contener cualquier nmero de hilos. Los hilos de un mismo grupo generalmente se relacionan de algn modo, ya sea por quin los cre, por la funcin que llevan a cabo, o por el momento en que deberan arrancarse y parar.
Pgina 16
HILOS (THREADS)
El grupo de hilos de ms alto nivel en una aplicacin Java es el grupo de hilos denominado
main. La clase ThreadGroup tiene mtodos que pueden ser clasificados como sigue: Collection Managment Methods (Mtodos de administracin del grupo): mtodos que manipulan la coleccin de hilos y subgrupos contenidos en el grupo de hilos. Methods That Operate on the Group (Mtodos que operan sobre el grupo): estos mtodos establecen u obtienen atributos del objeto ThreadGroup. Methods That Operate on All Threads within a Group (Mtodos que operan sobre todos los hilos dentro del grupo): este es un conjunto de mtodos que desarrollan algunas operaciones, como inicio y reinicio, sobre todos los hilos y subgrupos dentro del objeto ThreadGroup. Access Restriction Methods (Mtodos de restriccin de acceso): ThreadGroup y Thread permiten al administrador de seguridad restringir el acceso a los hilos en base a la relacin de miembro/grupo con el grupo
Pgina 17
HILOS (THREADS)
implicados. Si no se permite el acceso, le mtodo checkAccess lanza una excepcin de tipo SecurityException. En otro caso, checkAccess simplemente retorna. La siguiente es una lista de mtodos de ThreadGroup que invocan al mtodo checkAccess de la propia clase antes de llevar a cabo la accin del mtodo en cuestin. Estos son los que se conocen como accesos regulados, esto es, accesos que deben ser aprobados por el administrador de seguridad antes de completarse. - ThreadGroup (ThreadGroup parent, String name) - setDameon(boolena isDaemon) - setMaxPriority(int maxPriority) - stop - suspend - resume - destroy Igualmente, los siguientes mtodos de la clase Thread invocan al mtodo checkAccess de la clase antes de completarse la accin que desarrollan: - constructores que especifican un grupo de hilos - stop - supend - resume - setPriority(int priority) - setName(String name) - setDaemon(boolean isDaemon)
Una aplicacin stand-alone de Java no tiene, por defecto, un administrador de seguridad; no se impone ninguna restriccin de acceso y cualquier hilo puede consultar o modificar cualquier otro hilo, sea cual sea el grupo en el que se encuentren. Puedes definir e implementar tus propias restricciones de acceso para los grupos de hilos mediante la creacin de subclases de la clase SecurityManager, rescribiendo los mtodos apropiados, e imponiendo ese SecurityManager como el actual administrador de seguridad de tu aplicacin. El navegador HotJava es un ejemplo de aplicacin que implementa su propio administrador de seguridad. HotJava necesita asegurar que los applets se comportan de forma correcta y que no realizan ninguna accin sucia respecto a los dems applets que se estn ejecutando al mismo tiempo (como por ejemplo rebajar la prioridad de los hilos de otro applet). El administrador de seguridad de HotJava no permite a los hilos pertenecientes a grupos
USP-Ingeniera Informtica y Sistemas Pgina 18
HILOS (THREADS)
diferentes modificarse entre s. Obsrvese que las restricciones de acceso basadas en los grupos de hilos pueden variar de un navegador a otros, de modo que los applets tal vez se comporten de distinta manera en distintos navegadores. A continuacin, una breve explicacin sobre la seguridad en Java, concretamente en relacin a los applets.
Pgina 19
HILOS (THREADS)
Prioridad
Cada hilo tiene una prioridad, que no es ms que un valor entero entre 1 y 10, de modo que cuanto mayor el valor, mayor es la prioridad. El planificador determina el hilo que debe ejecutarse en funcin de la prioridad asignada a cada uno de ellos. Cuando se crea un hilo en Java, ste hereda la prioridad de su padre, el hilo que lo ha creado. A partir de aqu se le puede modificar su prioridad en cualquier momento utilizando el mtodo setPriority . Las prioridades de un hilo varan en un rango de enteros comprendido entre MIN_PRIORITY y MAX_PRIORITY (anbas definidas en la clase Thread). El entero ms alto designar la prioridad ms alta y el ms bajo, como es de esperar, la menor. Se ejecutar primero el hilo de prioridad superior, el llamado Ejecutables, y slo cuando ste para, abandona o se convierte en No Ejecutable, comienza la ejecucin de en hilo de prioridad inferior. Si dos hilos tienen la misma prioridad, el programador elige uno de ellos en alguna forma de competicin. El hilo seleccionado se ejecutar hasta que:
Un hilo comprioridad mayor pase a ser Ejecutable. En sistemas que soportan tiempo-compartido, termina su tiempo. Abandone, o termine su mtodo run. Luego, un segundo hilo puede ejecutarse, y as continuamente hasta que el intrprete abandone. El algoritmo del sistema de ejecucin de hilos que sigue Java es de tipo preventivo. Si en un momento dado un hilo que tiene una prioridad mayor a cualquier otro hilo que se est ejecutando pasa a ser Ejecutable, entonces el sistema elige a este nuevo hilo.
HILOS (THREADS)
Contar alto,bajo; public void init() { // Creamos un thread en 200, ya adelantado bajo = new Contar( 200 ); // El otro comienza desde cero alto = new Contar( 0 ); // Al que comienza en 200 le asignamos prioridad mnima bajo.setPriority( Thread.MIN_PRIORITY ); // Y al otro mxima alto.setPriority( Thread.MAX_PRIORITY ); System.out.println( "Prioridad alta es "+alto.getPriority() ); System.out.println( "Prioridad baja es "+bajo.getPriority() ); } // Arrancamos los dos threads, y vamos repintando hasta que //el thread que tiene prioridad ms alta alcanza o supera al //que tiene prioridad ms baja, pero empez a contar ms //alto public void start() { bajo.start(); alto.start(); while( alto.getContar() < bajo.getContar() ) repaint(); repaint(); bajo.stop(); alto.stop(); } // Vamos pintando los incrementos que realizan ambos threads
USP-Ingeniera Informtica y Sistemas Pgina 21
HILOS (THREADS)
public void paint( Graphics g ) { g.drawString( "bajo = "+bajo.getContar()+ " alto = "+alto.getContar(),10,10 ); System.out.println( "bajo = "+bajo.getContar()+ " alto = "+alto.getContar() ); } // Para parar la ejecucin de los threads public void stop() { bajo.stop(); alto.stop(); } }
Tiempo compartido
La estrategia del tiempo compartido determina cul de una serie de hilos con igual prioridad se pasa a ejecutar. Por ejemplo, supongamos un programa Java que crea dos hilos egostas con la misma prioridad, que tienen el siguiente mtodo run: public void run() { while (tick < 400000) { tick++; if ((tick % 50000) == 0) { System.out.println("Thread #" + num + ", tick = " + tick); } } } Este mtodo slo cuenta desde 1 hasta 400.000. La variable tick es pblica y se utiliza para determinar cunto se ha progresado. Cada 50.00 ticks imprime el identificador del hilo y su contador tick. Cuando este programa se ejecuta en un sistema que utiliza el tiempo compartido, la salida ser del tipo : Thread #1, tick = 50000
USP-Ingeniera Informtica y Sistemas Pgina 22
HILOS (THREADS)
Thread #0, tick = 50000 Thread #0, tick = 100000 Thread #1, tick = 100000 Thread #1, tick = 150000 Thread #1, tick = 200000 Thread #0, tick = 150000 Thread #0, tick = 200000 Thread #1, tick = 250000 Thread #0, tick = 250000 Thread #0, tick = 300000 Thread #1, tick = 300000 Thread #1, tick = 350000 Thread #0, tick = 350000 Thread #0, tick = 400000 Thread #1, tick = 400000 El sistema de tiempo compartido divide el tiempo de proceso de la CPU en espacios de tiempo y le asigna tiempo de proceso a un hilo dependiendo de su prioridad. En este caso, como las prioridades del los hilos eran iguales, los tiempos de proceso tambin lo son. Observa que el tiempo compartido nos ofrece garantas sobre la frecuencia y el orden en el que se van a ejecutar los hilos. Para hacer una comparativa, veamos cmo sera la salida en una mquina sin tiempo compartido, donde se ejecuta un nico hilo continuadamente hasta que aparece otro con prioridad superior. Thread #0, tick = 50000 Thread #0, tick = 100000 Thread #0, tick = 150000 Thread #0, tick = 200000 Thread #0, tick = 250000 Thread #0, tick = 300000 Thread #0, tick = 350000 Thread #0, tick = 400000
Pgina 23
HILOS (THREADS)
Thread #1, tick = 50000 Thread #1, tick = 100000 Thread #1, tick = 150000 Thread #1, tick = 200000 Thread #1, tick = 250000 Thread #1, tick = 300000 Thread #1, tick = 350000 Thread #1, tick = 400000 Nota: No todos los sistemas aceptan el tiempo compartido, por lo tanto los programas en ava no deberan ser relativos al tiempo compartido ya que podran producirse resultados distintos para sistemas diferentes.
Sincronizacin
El problema de la sincronizacin de hilos tiene lugar cuando varios hilos intentan acceder al mismo recurso o dato. A la hora de acceder a datos comunes, los hilos necesitan establecer cierto orden, por ejemplo en el caso del productor consumidor. Para asegurarse de que hilos concurrentes no se estorban y operan correctamente con datos (o recursos) compartidos, un sistema estable previene la inanicin y el punto muerto o interbloqueo. La inanicin tiene lugar cuando uno o ms hilos estn bloqueados al intentar conseguir acceso a un recurso compartido de ocurrencias limitadas. El interbloqueo es la ltima fase de la inanicin; ocurre cuando uno o ms hilos estn esperando una condicin que no puede ser satisfecha. Esto ocurre muy frecuentemente cuando dos o ms hilos estn esperando a que el otro u otros se desbloquee, respectivamente. A continuacin se presenta un ejemplo, el problema del Productor/Consumidor, con la intencin de explicar de una forma ms prctica el concepto y las situciones de sincronizacin de hilos.
Monitores
A los objetos como CubbyHole, a los que acceden varios hilos, son llamados condiciones variables. Una de las formas de controlar el acceso a estas condiciones variables y de, por tanto, sincronizar los hilos, son los monitores. Las secciones crticas son los segmentos del cdigo donde los hilos concurrentes acceden a las condiciones variables. Estas secciones, en Java, se marcan normalmente con la palabra reservada synchronized: Synchronized int MiMetodo(); Generalmente, las secciones crticas en los programas de Java son los mtodos. Sin embargo el uso indiscriminado de synchronized viola los fundamentos de la programacin objetual, por lo que es mejor utilizar synchronized slo a nivel de mtodos. Java asocia un solo monitor a cada objeto que tiene un mtodo sincronizado.
USP-Ingeniera Informtica y Sistemas Pgina 24
HILOS (THREADS)
En el ejemplo anterior del productorconsumidor tiene dos mtodos de sincronizacin: put(), que cambia el valor de CubbyHole, y get(), para recuperar el valor actual. Este sera el cdigo fuente del objeto CubbyHole utilizando las tcnicas de sincronizacin nuevas : Gonzlez et al. class CubbyHole { private int contents; private boolean available = false; public synchronized int get() { while (available == false) { try { wait(); } catch (InterruptedException e) { } } available = false; notify(); return contents; } public synchronized void put(int value) { while (available == true) { try { wait(); } catch (InterruptedException e) { } } contents = value; available = true; notify(); } }
USP-Ingeniera Informtica y Sistemas Pgina 25
HILOS (THREADS)
La variable contents tiene el valor actual de CubbyHole y available indica si se puede recuperar o no el valor. Cuando available es verdadero, el productor an no ha acabado de producir. CubbyHole tiene dos mtodos de sincronizacin, y Java proporciona un solo monitor para cada ejemplar de CubbyHole (incluyendo el compartido por el Productor y el Consumidor). Siempre que el control entra en un mtodo sincronizado, el hilo que ha llamado al mtodo adquiere el monitor del objeto al cual pertenece el mtodo. Otros hilos no pueden llamar a un mtodo sincronizado del mismo objeto mientras el monitor no sea liberado. Nota: Java permite re-adquirir un monitor. En este caso se trata de los llamados monitores re-entrantes.
Conclusiones
Se pueden usar hilos Java como standard, sin tener en cuenta la plataforma en la que vayan a ejecurtarse. La clase Thread es la clase responsable de producir hilos funcionales para otras clases. La interfaz Runnable proporciona la capacidad de aadir la funcionalidad de un hilo a una clase en lugar de derivndola de la clase Thread.Para arrancar un hilo se llama a su mtodo start el cual invoca al mtodo run del propio hilo. Todo la tarea del hilo debe estar dentro del mtodo run.Para terminar la ejecucin de un hilo de forma permanente se utiliza su mtodo stop.La clase ThreadGroup es la implementacin del concepto de grupo de hilos en Java. Java tiene un Planificador (Scheduler), el cual decide que hilos deben ejecuatarse y cuales encontrarse preparados para su ejecucin. Cada hilo tiene una prioridad, que no es ms que un valor entero entre 1 y 10, de modo que cuanto mayor el valor, mayor es la prioridad.
Pgina 26
HILOS (THREADS)
Sumario de constructores
Thread() Realiza la reserva de memoria necesaria para la creacin de un nuevo objeto Thread. Thread(Runnable target) Realiza la reserva de memoria necesaria para la creacin de un nuevo objeto Thread. Thread(Runnable target, String name) Realiza la reserva de memoria necesaria para la creacin de un nuevo objeto Thread. Thread(String name) Realiza la reserva de memoria necesaria para la creacin de un nuevo objeto Thread. Thread(ThreadGroup group, Runnable target) Realiza la reserva de memoria necesaria para la creacin de un nuevo objeto Thread. Thread(ThreadGroup group, Runnable target, String name) Crea un nuevo objeto Thread con un objeto de ejecucin concreto y un nombre concreto, y se une al grupo de hilos especificado. Thread(ThreadGroup group, String name) Crea un nuevo objeto Thread como miembro de un grupo de hilos concreto.
Sumario de mtodos
No se citan todos los mtodos. Para amplicacin del sumario, se sugiere consultar la pgina static int activeCount() Devuelve el nmero actual de hilos activos en el grupo de hilos de este hilo. void checkAccess() Determina si el hilo actualmente en ejecucin tiene permiso para modificar este hilo. static Thread currentThread() Devuelve una referencia al objeto hilo que se est ejecutando actualmente void destroy() Destruye este hilo, sin realizar ningn tipo de limpieza static void dumpStack() Imprime una traza de pila del hilo actual
USP-Ingeniera Informtica y Sistemas Pgina 27
HILOS (THREADS)
static int enumerate(Thread[] tarray) Copia dentro del array especificado todos los hilos activos del grupo y subgrupos de hilos del hilo en cuestin ClassLoader getContextClassLoader() Devuelve el contexto ClassLoader de este Thread String getName() Devuelve el nombre del hilo void setName(String name) Cambia el nombre de este hilo, asignndole el especificado como argumento int getPriority() Devuelve la prioridad del hilo ThreadGroup getThreadGroup() Devuelve el grupo de hilos al cual cual pertenece el hilo void interrupt() Interrumpe la ejecucin del hilo static boolean interrupted() Comprueba si el hilo actual ha sido interrumpido boolean isAlive() Comprueba si el hilo est vivo boolean isDaemon() Comprueba si el hilo es un hilo daemon void setDaemon(boolean on) Establece este hilo como hilo daemon, o como hilo de usuario void join() Espera a que este hilo muera void join(long millis) Espera, como mucha millis milisegundos a que este hilo muera void run() Si este hilo se construy utilizando un objeto Runnable de ejecucin independiente,
USP-Ingeniera Informtica y Sistemas Pgina 28
HILOS (THREADS)
entonces el mtodo run de ese objeto es invocado; en otro caso, este mtodo no hace nada y vuelve. static void sleep(long millis) Hace que el hilo actualmente en ejecucin pase a dormir temporalmente durante el nmero de milisegundos especificado. void start() Hace que este hilo comience la ejecucin; la Mquina Virtual de Java llama al mtodo runde este hilo. String toString() Devuelve una representacin en formato cadena de este hilo, incluyendo el nombre del hilo, la prioridad, y el grupo de hilos. static void yield() Hace que el hilo actual de ejecucin, pare temporalmente y permita que otros hilos se ejecuten (til en sistemas con planificacin de hilos no preventiva). Se aconseja consultar las referencia citada anteriormente para consultar la descripcin de mtodos cuyo uso directo es inherentemente inseguro, como son stop, suspend y resume
Pgina 29
HILOS (THREADS)
Conviene estar familiarizado con los conceptos bsicos sobre hilos, en general, y ms concretamente en Java, as como con la programacin multihilo, para poder entrar en la programacin multihilo y con mtodos nativos.
Hilos y la JNI
A continuacin se presenta una serie de precauciones que deben tenerse en cuenta a la hora de programar en multihilo con mtodos nativos: El puntero a la interfaz JNI (JNIEnv *) slo es vlido en el hilo actual. No debes pasar este puntero de un hilo a otro, o almacenarlo y utilizarlo en varios hilos. La Mquina Virtual de Java proporcionar el mismo puntero de interfaz cuando se invoque de forma consecutiva un mtodo nativo desde un mismo hilo. De todos modos, diferentes hilos pasan diferentes punteros de interfaz a los mtodos nativos. No se deben pasar referencias locales de un hilo a otro. En concreto, una referencia local debera convertirse en referencia invlida antes de que cualquier otro hilo pueda tener una oportunidad de utilizarla. Siempre que se d la situacin en que diferentes hilos tal vez tengan que usar la misma referencia a un objeto Java, se deberan convertir las referencias locales en referencias globales. Comprobar cuidadosamente el uso de variables globales. Varios hilos pueden estar accediendo a estas variables globales en el mismo instante de tiempo. Hay que asegurarse de poner los locks (cierres o controles de paso) apropiados para garantizar la seguridad.
/* bloque de sincronizacin
HILOS (THREADS)
Pgina 31
HILOS (THREADS)
todos los datos de audio. Como consecuencia, si se quiere descargar datos de audio, se debera crear uno o ms hilos para llevarlo a cabo. Utilizar un hilo para desarrollar una tarea de inicializacin de un golpe para un applet es una variante del escenario clsico productor/consumidor. El hilo que desarrolla la tarea es el productor, y el applet es el consumidor.
Hilos en servlets.
Un servlets es un programa Java que se ejecuta en un servidor web. Los clientes pueden invocarlo mediante el protocolo HTTP. Del mismo modo que un applets es cargado y ejecutado en el navegador en la maquina cliente, un servlet es cargado y ejecutado por el servidor web. As en su uso ms habitual, un servlet acepta peticiones de cliente, procesa la informacin y devuelve los resultados, que podrn ser visualizados mediante applets, pginas HTML, etc. Cuando un proceso se inicia en un servidor, necesita la asignacin de varios recursos. El cambio entre procesos implica tambin mucha sobrecarga debido al cambio de contexto al tener que grabar toda la informacin de un proceso para volver ms tarde a l. A un proceso se le puede llamar hilo pesado debido a que inicia un proceso completo, con una enorme cantidad de sobrecarga en trminos de tiempo, memoria, etc... Por el contrario, por cada peticin a un servlet, se crea un hilo ligero para manejarla. Un hilo ligero es un proceso hijo, que es controlado por el proceso padre (en este caso, el servidor). En tal escenario, el cambio de contexto se hace muy fcil, y los hilos pueden pasar fcilmente de activos a inactivos, o a espera. Esto mejora sustancialmente el rendimiento de los servlets sobre los scripts CGI. Todo servlet debe directa o indirectamente implementar su interfaz. Como cualquier otro interfaz de Java, este es tambin una coleccin de declaraciones vacas de mtodos. Uno de los mtodos que estn declarados en el interfaz Servlet es: public abstract void destroy ()El mtodo destroy se invoca para liberar todos los recursos solicitados. Tambin se encarga de la sincronizacin de cualquier hilo pendiente. Este mtodo se llama una sola vez, automticamente, como el mtodo init.
Modelo servidor/trabajador:
En este modelo un hilo funciona como supervisor asignando tareas a los hilos trabajadores. Despus de que el trabajador ha finalizado su tarea, lo indica al supervisor o es el supervisor quien lo comprueba por s mismo, para despus recibir una nueva tarea. Es el modelo empleado en el primer ejemplo del servidor de archivos. Un hilo servidor que obtiene las solicitudes y las redirige a los hilos trabajadores, que realizan el servicio.
USP-Ingeniera Informtica y Sistemas Pgina 32
HILOS (THREADS)
Modelo de equipo
En este modelo mltiples hilos trabajan juntos en una tarea simple. Cada hilo realiza una parte de la tarea, como una casa en la que cada pintor pinta una parte de la misma. Todos los hilos son iguales, y cada uno obtiene y procesa sus propias solicitudes. No existe un hilo servidor. Se puede asociar una cola de trabajo a cada tipo de solicitud, de tal forma que existan tantas categoras de hilos como tipos de solicitud. Un hilo slo dar servicio a un tipo de solicitud, teniendo preferencia las solicitudes en espera en la cola correspondiente frente a las solicitudes del buzn del sistema.
Pgina 33
HILOS (THREADS)
Estructura bsica.
El estndar POSIX Threads especifica un modelo de hilos dirigido por prioridades con polticas de planificacin preemptivas, gestin de seales, y primitivas para proporcionar exclusin mutua as como espera sincronizada. El diseo de un paquete de hilos suele estar influenciado por las restricciones impuestas por el estndar POSIX Threads (si se desea seguir dicho estndar, caso habitual) y el tipo de plataforma sobre la que se va a implementar. Normalmente el diseo del paquete intenta reducir al mnimo la cantidad de cdigo dependiente de la plataforma, y se suele aislar en mdulos concretos, de forma que la biblioteca sea adaptable a nuevas plataformas.
USP-Ingeniera Informtica y Sistemas Pgina 34
HILOS (THREADS)
En la mayora de las implementaciones, el interfaz consiste en una biblioteca C con puntos de entrada enlazables, de forma que pueda ser compilada para generar un interfaz de lenguaje independiente. Este es el caso de la implementacin Pthreads realizada por Frank Mueller como base del proyecto PART (Portable Ada Run-Time), en el que se implementa un sistema de tiempo de ejecucin para la gestin de tareas Ada apoyado en la biblioteca de hilos.
Pgina 35
HILOS (THREADS)
HILOS (THREADS)
generalmente ms rpidas que las operaciones similares con procesos. En especial, la creacin, finalizacin y cambio de contexto de un hilo, son operaciones ms rpidas con los hilos que con los procesos. Como ejemplo, en los procesadores de propsito general (SPARC, MIPS, ALPHA, HP-PA, x86) el cambio de contexto entre hilos de un mismo proceso lleva del orden de 50us. mientras que el cambio de contexto entre hilos de distintos procesos lleva del orden de 100us. Estos tiempos son muy inferiores al tiempo de cambio de contexto completo entre procesos. As en Solaris la creacin de un proceso es unas 30 veces ms lento que la creacin de un hilo, las variables de sincronizacin son unas 10 veces ms lentas y el cambio de contexto unas 5 veces ms lento.
3. Tiempo de respuesta: Si es posible separar operaciones en un programa, los hilos se pueden emplear para mejorar los tiempos de respuesta de la aplicacin. Por ejemplo, supongamos que estamos usando una utilidad de correo electrnico. En una versin de un solo hilo, mientras almacenamos un mensaje podemos apreciar algn retraso antes de que la interfaz de usuario sea refrescada. Esto es porque el programa est primero haciendo una operacin de E/S para almacenar el mensaje y despus refresca la pantalla. Estas operaciones las realiza de forma secuencial. Normalmente, si esta aplicacin fuese una versin programada con varios hilos, un hilo podra gestionar la E/S mientras otro hilo gestiona la interfaz de usuario. Estas operaciones pueden funcionar en paralelo, con la consiguiente ganancia en el tiempo de respuesta. 4. Programacin natural: Esta ventaja no est relacionada con el rendimiento, pero es importante. En algunas aplicaciones, el diseador puede necesitar instrucciones del tipo 'goto' y otros mtodos para superar las limitaciones de la programacin secuencial tradicional. Sin embargo, con los hilos, el programador no est limitado a emplear un modelo de ejecucin secuencial. As, las limitaciones de la programacin secuencial pueden solucionarse de forma ms intuitiva, menos compleja y ms natural, incluso empleando otros modelos de programacin, como la programacin concurrente. Adems muchos problemas son ms fciles de plantear y programar con un modelo de hilos debido a su estructura concurrente. 5. Existe un estndar (POSIX 1003.1c) lo que permite hacer a las aplicaciones portables entre distintas plataformas. El mismo cdigo fuente es vlido para distintas plataformas. 6. Objetos distribuidos : Con la aparicin del estndar de objetos distribuidos CORBA, los hilos toman un papel especial e importante. Los objetos distribuidos tienen una estructura multihilo inherentemente. Cada vez que se pide que un objeto realice una accin, el objeto ejecuta la accin mediante un hilo independiente, de forma que el objeto puede haber ms de un hilo al mismo tiempo. Adems los servidores de objetos se pueden construir con hilos de forma ms efectiva y con un mayor rendimiento.
Pgina 37
HILOS (THREADS)
HILOS (THREADS)
Implementacin de barreras.
Una barrera es un punto de sincronizacin entre varios hilos. Esta tcnica permite que varios hilos se sincronicen en un determinado punto de su ejecucin, de forma que ninguno de ellos puede avanzar en su ejecucin hasta que todos hayan alcanzado el punto establecido por la barrera. Con esta tcnica se pueden implementar algoritmos SIMD en sistemas MIMD de una forma sencilla.
Computacin multihilo.
El modelo de computaciones paralelas multihilo fue descrito por Bell(1992), y se presenta en la siguiente figura :
HILOS (THREADS)
completamente. La sobrecarga del paso de mensajes debido a las llamadas receive y send en los multicomputadores puede reducirse mediante hardware especializado operando en paralelo con la computacin. El ancho de banda de la comunicacin limita la granularidad, ya que se debe transferir cierta cantidad de datos a otros nodos para completar un grano de la computacin. Las llamadas de paso de mensajes (4) y sincronizacin (5) son no productivas. Son necesarios mecanismos rpidos para reducir u ocultar estos retrasos. El mutithreading no es capaz de incrementar la velocidad en la ejecucin de hilos simples, mientras que los modelos de consistencia dbiles son capaces de hacerlo.
El concepto de proceso engloba dos conceptos separados y potencialmente independientes: uno relativo a la propiedad de recursos y otro que hace referencia a la ejecucin.
Unidad que posee recursos: A un proceso se le asigna un espacio de memoria y, de tanto en tanto, se le puede asignar otros recursos como dispositivos de E/S o ficheros. Unidad a la que se le asigna el procesador: Un proceso es un flujo de ejecucin (una traza) a travs de uno o ms programas. Esta ejecucin se entremezcla con la de otros procesos. De tal forma, que un proceso tiene un estado (en ejecucin, listo, etc) y una prioridad de expedicin u origen. La unidad planificada y expedida por el sistema operativo es el proceso. Dentro de un proceso puede haber uno o ms hilos de control cada uno con: Un estado de ejecucin (en ejecucin, listo, bloqueado). Un contexto de procesador, que se salva cuando no est ejecutndose.
Pgina 40
HILOS (THREADS)
Una pila de ejecucin. Algn almacenamiento esttico para variables locales. Acceso a la memoria y a los recursos de ese trabajo que comparte con los otros hilos.
CARACTERISTICAS
Se comparten recursos. La comparticin de la memoria permite a las hebras pares comunicarse sin usar ningn mecanismo de comunicacin inter-proceso del SO. La conmutacin de contexto es ms rpida gracias al extenso compartir de recursos No hay proteccin entre las hebras. Una hebra puede escribir en la pila de otra hebra del mismo proceso Estado de los procesos ligeros
Pgina 41