| Artículos | 01 FEB 2004

Hilos de proceso con Java: threads

Tags: Histórico
Adolfo Aladro.
Los hilos de proceso (threads) representan uno de los recursos más importantes de los que dispone un programador para crear aplicaciones complejas donde puede ser conveniente, o incluso necesario, realizar varias tareas de manera simultánea. El mecanismo de hilos de proceso de Java es sencillo, potente y productivo. De hecho muchos de los estándares de la plataforma Java, como por ejemplo los applets o los servlets, emplean hilos de proceso para llevar cabo algunas tareas en paralelo. Todo esto sucede de forma transparente al programador pero conviene entender y comprender cómo funciona con el fin de llegar a escribir aplicaciones que crean y usan sus propios hilos de manera explícita.

Probablemente la concurrencia ha sido siempre uno de los asuntos más espinosos de la programación. Por otro lado, la forma en la que los lenguajes tradicionales la han implementado no resultaba de gran ayuda para enfrentarse a los retos de un tipo de programación que ya es bastante compleja por sí misma. Sin embargo, existen muchos casos en los que es deseable dividir las tareas de una aplicación haciendo posible que algunas de ellas se ejecuten concurrentemente. Ello puede contribuir decisivamente en el rendimiento, especialmente si se trabaja en entornos con varios procesadores o si se desarrollan aplicaciones distribuidas, como por ejemplo las aplicaciones web.
Java dispone de un mecanismo de hilos de proceso que permite crear este tipo de aplicaciones de una forma considerablemente fácil. Gran parte de los estándares de la plataforma Java emplean hilos de proceso de manera implícita, es decir, sin que el programador tenga que ser consciente de ello. Muchas de las estructuras de datos proporcionadas por la API estándar de Java están preparadas para afrontar las operaciones de lectura y escritura simultánea. En estos casos Java realiza la mayor parte del trabajo que implican los hilos de proceso, y por ello no es preciso que el programador entienda todas y cada una de dichas tareas que subyacen. Sin embargo, aunque no sea necesario sí que es conveniente, ya que ello constituye el paso previo para que el programador sea después capaz de implementar mecanismos equivalentes en sus propias aplicaciones.
En este artículo se estudiarán los fundamentos teóricos de los hilos de proceso, utilizando además un estándar de Java, como son los servlets, como ejemplo. Posteriormente se verá cómo el programador puede introducir el empleo de hilos de proceso dentro de sus aplicaciones.

Hilos de proceso frente a procesos
Un proceso puede definirse como un programa y toda la información que necesita para ejecutarse, lo que incluye aspectos tales como la memoria, los registros, etc. El problema es que tradicionalmente se ha venido utilizando el concepto de proceso con el fin de alcanzar dos objetivos distintos: por un lado el paralelismo o la concurrencia, y por otro la seguridad. El primero consiste en dividir las aplicaciones en distintos procesos de forma que cada uno de ellos se ejecute concurrentemente. En lo que respecta al segundo de los objetivos, los procesos también se utilizan para proteger a los usuarios entre sí. Así por ejemplo, si un proceso trata de acceder a una zona de memoria que se encuentra fuera del espacio que le ha sido asignado, el sistema lo detecta y lo impide.
Éstas son actividades no sólo diferentes, sino que son objetivos de diseño contrapuestos y la consecución de uno siempre se logra en detrimento del otro. Por ello, la primera consecuencia de esta contradicción de metas es que generalmente los procesos no pueden compartir recursos, medida de protección que se toma para evitar problemas de seguridad. Así por ejemplo, en general un proceso no conoce ni puede acceder a las variables de otro proceso. Entonces, ¿qué ocurre cuando los procesos necesitan compartir información? No queda más remedio que acudir a técnicas de comunicación entre procesos, lo que incrementa notablemente la complejidad del sistema y en consecuencia, empeora el rendimiento.
Un programa es un trozo de código “sin vida”. Un proceso es un programa en ejecución, lo que abarca algo mucho más amplio. El sistema operativo debe tener los datos suficientes de cada proceso para poder ejecutarlo o para detener su ejecución en cualquier momento. A esta información se le denomina descriptor de un proceso y puede definirse como la fotografía que tiene el sistema operativo del proceso. Un descriptor de proceso contendrá fundamentalmente: valores actuales del contador de programa, de los registros y de las variables; archivos abiertos; etc. Gracias a los descriptores de proceso, el sistema operativo es capaz de interrumpir un proceso, ceder todos los recursos de la máquina a otro proceso entrante, y después de un tiempo, volver a retomar el primero de los procesos justo por el punto por donde fue interrumpido. A esta operación se la denomina cambio de contexto. Un cambio de contexto es una operación considerablemente pesada, ya que supone guardar toda la información del proceso saliente y restaurar la del proceso entrante.
El concepto de hilo de proceso (thread) nace con el fin de intentar separar esos dos aspectos de diseño: concurrencia y protección. Un hilo de proceso se puede definir como un hilo de ejecución dentro de un proceso. Los hilos de un mismo proceso comparten casi todo: ficheros abiertos, espacio de memoria, información de protección, temporizadores, señales, etc. Al mismo tiempo, cada hilo tiene también su parte privada: su propia pila, su propio contador de programa y su propio estado.

Compartición de datos
Todos los hilos de proceso que pertenecen a un mismo proceso comparten un área común de datos que sirve para intercambiar información entre ellos. No es necesario acudir a técnicas de comunicación entre procesos tales como paso de mensajes, ya que todos los hilos son capaces de acceder directamente a los datos compartidos.
Por otro lado, la conmutación entre hilos de un mismo proceso es muy rápida, puesto que la cantidad de información que ha de ser salvada y/o restaurada por el sistema es mucho menor. Por eso, cuando se trata con hilos siempre se habla de cambios de contexto ligeros, en contraposición a los cambios de contexto pesados, que implican el manejo de procesos.

Hilos de proceso y servlets
Aunque una de las características que definen a Java es la independencia con respecto a la plataforma, no se debe pasar por alto el hecho de que aquellas arquitecturas que cuenten con varios procesadores tendrán la posibilidad real de ejecutar varios hilos concurrentemente.
Los servlets, una tecnología web que pertenece a la plataforma Java, representan uno de los ejemplos más sencillos para estudiar la naturaleza de una aplicación basada en en hilos de proceso.
Podría decirse que los servlets son al servidor lo que los applets al cliente (al navegador). La diferencia principal con los applets es que son objetos sin rostro, es decir, sin interfaces gráficas. Esta definición de manual se comprende mucho mejor si se aclara que los servlets son simplemente la solución que aporta la plataforma Java para hacer aplicaciones web. Aunque no se trata en este momento de estudiar detalladamente todos los aspectos de los servlets como tecnología, sí cabe citar dos de las funciones primordiales que pueden llevar a cabo los servlets:
-Crean y devuelven páginas HTML cuyo contenido depende de la petición del cliente, lo que se denominan páginas dinámicas, en contraste con las páginas HTML est&

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información