Tabla de contenidos
Los objetos ofrecen una forma de dividir un programa en diferentes secciones. A menudo, también es necesario dividir un programa, independientemente de las subtareas en ejecución.
Utilizando multihilado, un hilo de ejecución dirige cada una esas subtareas independientes, y puedes programar como si cada hilo tuviera su propia CPU. Un mecanismo interno reparte el tiempo de CPU por ti, pero en general, no necesitas pensar acerca de eso, lo que ayuda a simplificar la programación con múltiples hilos.
Un proceso es un programa autocontenido en ejecución con su propio espacio de direcciones. Un sistema operativo multitarea puede ejecutar más de un proceso (programa) en el mismo tiempo, mientras ....., por medio de cambios periódicos de CPU de una tarea a otra. Un hilo es una simple flujo de control secuencial con un proceso. Un proceso puede tener de este modo múltiples hilos en ejecución concurrentes. Puesto que los hilos se ejecutan con un proceso simple, pueden compartir memoria y otros recursos. La dificultad fundamental de escribir programas multihilados está en coordinar el uso de esos recursos entre los diferentes hilos.
Hay muchas aplicaciones posibles para el multihilado, pero lo más usual es querer usarlo cuando tienes alguna parte de tu programa vinculada a un evento o recurso particular. Para evitar bloquear el resto de tu programa, creas un hilo asociado a ese evento o recurso y le permites ejecutarse independientemente del programa principal.
La programación concurrente se como caminar en un mundo completamente nuevo y aprender un nuevo lenguaje de programación, o por lo menos un nuevo conjunto de conceptos del lenguaje. Con la aparición del soporte para los hilos en la mayoría de los sistemas operativos para microcomputadores, han aparecido también en los lenguajes de programación o librerías extensiones para los hilos. En cualquier caso, programación hilada:
1. Parece misteriosa y requiere un esfuerzo en la forma de pensar acerca de la programación.
2. En otros lenguajes el soporte a los hilos es similar. Cuando entiendas los hilos, comprenderás una jerga común.
Comprender la programación concurrente está al mismo nivel de dificultad que comprender el polimorfismo. Si pones un poco de esfuerzo, podrás entender el mecanismo básico, pero generalmente necesitará de un entendimiento y estudio profundo para desarrollar una comprensión auténtica sobre el tema. La meta de este capítulo es darte una base sólida en los principios de concurrencia para que puedas entender los conceptos y escribir programas multihilados razonables. Sé consciente de que puedes confiarte fácilmente. Si vas a escribir algo complejo, necesitarás estudiar libros específicos sobre el tema.
Una de las razones más convincentes para usar concurrencia es crear una interfaz sensible al usuario. Considera un programa que realiza una operación de CPU intensiva y, de esta forma, termina ignorando la entrada del usuario y comienza a no responder. El programa necesita continuar controlandor sus operaciones, y al mismo tiempo necesita devolver el control al botón de la interfaz de usuario para que el programa pueda responder al usuario. Si tienes un botón de "Salir", no querrás estar forzado a sondearlo en todas las partes de código que escribas en tu programa. (Esto acoplaría tu botón de salir a lo largo del programa y sería un quebradero de cabeza a la hora de mantenerlo). .....
Una función convencional no puede continuar realizando sus operaciones y al mismo tiempo devolver el control al resto del programa. De hecho, suena a imposible, como si la CPU estuviera en dos lugares a la vez, pero esto es precisamente la "ilusión" que la concurrencia permite (en el caso de un sistema multiprocesador, debe haber más de una "ilusión").
También puedes usar concurrencia para optimizar la carga de trabajo. Por ejemplo, podrías necesitar hacer algo importante mientras estás estancado esperando la llegada de una entrada del puerto I/O. Sin hilos, la única solución razonable es sondear los puertos I/O, que es costoso y puede ser difícil.
Si tienes una máquina multiprocesador, los múltiples hilos pueden ser distribuídos a lo largo de los múltiples procesadores, pudiendo mejorar considerablemente la carga de trabajo. Este es el típico caso de los potentes servidores web multiprocesdor, que pueden distribuir un gran número de peticiones de usuario por todas las CPUs en un programa que asigna un hilo por petición.
Un programa que usa hilos en una máquina monoprocesador hará una cosa en un tiempo dado, por lo que es teóricamente posible escribir el mismo programa sin el uso de hilos. Sin embargo, el multihilado proporciona un beneficio de optimización importante: El diseño de un programa puede ser maravillosamente simple. Algunos tipos de problemas, como la simulación - un video juego, por ejemplo - son difíciles de resolver sin el soporte de la concurrencia.
El modelo hilado es una comodidad de la programación para simplificar el manejo de muchas operaciones al mismo tiempo con un simple programa: La CPU desapilará y dará a cada hilo algo de su tiempo. Cada hilo tiene consciencia de que tiene un tiempo constante de uso de CPU, pero el tiempo de CPU está actualmente repartido entre todo los hilos. La excepción es un programa que se ejecuta sobre múltiples CPU's. Pero una de las cosas fabulosas que tiene el hilado es que te abstrae de esta capa, por lo que tu código no necesita saber si está ejecutándose sobre una sóla CPU o sobre varias.[149] De este modo, usar hilos es una manera de crear programas escalables de forma transparente - si un programa se está ejecutando demasiado despacio, puedes acelerarlo fácilmente añadiendo CPUs a tu ordenador. La multitarea y el multihilado tienden a ser las mejores opciones a utilizar en un sistema multiprocesador.
El uso de hilos puede reducir la eficiencia computacional un poco, pero el aumento neto en el diseño del programa, balanceo de recursos, y la comodidad del usuario a menudo es más valorado. En general, los hilos te permiten crear diseñor más desacoplados; de lo contrario, las partes de tu código estaría obligadas a prestar atención a tareas que podrías manejarlas con hilos normalmente.