Programación Por Threads
Programación Por Threads
Programación Por Threads
TEMA:
CICLO : VII
FECHA : 04/05/2017
Pucallpa – Perú
2017
i
PROGRAMACIÓN POR THREADS
DEDICATORIA
A Dios
Por iluminarme durante este
Informe y por permitirnos finalizarlo
Con éxito.
-A mis padres
Por sus apoyos incondicionales y el
esfuerzo diario que realizan por
brindarme una buena educación.
II
PROGRAMACIÓN POR THREADS
AGRADECIMIENTO
III
PROGRAMACIÓN POR THREADS
ÍNDICE
CONTRAPORTADA I
DEDICATORIA ii
AGRADECIMIENTO iii
INDICE iv
INTRODUCCIÓN v
IV
INTRODUCCIÓN
La destrucción de los hilos antiguos por los nuevos es una característica que no
permite a una aplicación realizar varias tareas a la vez (concurrentemente). Los
distintos hilos de ejecución comparten una serie de recursos tales como el espacio
de memoria, los archivos abiertos, la situación de autenticación, etc. Esta técnica
permite simplificar el diseño de una aplicación que debe llevar a cabo distintas
funciones simultáneamente.
Un hilo es simplemente una tarea que puede ser ejecutada al mismo tiempo que
otra tarea.
Los hilos de ejecución que comparten los mismos recursos, sumados a estos
recursos, son en conjunto conocidos como un proceso. El hecho de que los hilos
de ejecución de un mismo proceso compartan los recursos hace que cualquiera de
estos hilos pueda modificar estos recursos. Cuando un hilo modifica un dato en la
memoria, los otros hilos acceden a ese dato modificado inmediatamente.
El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga
activo. Cuando el proceso finaliza, todos sus hilos de ejecución también han
terminado. Asimismo en el momento en el que todos los hilos de ejecución finalizan,
el proceso no existe más y todos sus recursos son liberados.
5
PROGRAMACIÓN POR THREADS
CAPÍTULO I
ASPECTOS GENERALES
1.1. DEFINICION
Los Threads son una ampliación del concepto de multitarea, si bien multitarea se
refiere a la capacidad de un sistema para ejecutar varios procesos a la vez, en un
comienzo esto hacia referencia a que más de una aplicación se estuviera
ejecutando de manera concurrente, sin embargo pronto se hizo notoria la necesidad
de que una misma aplicación hiciera varias cosas a la vez. Allí nacieron los Threads.
6
PROGRAMACIÓN POR THREADS
Al igual que los procesos, los hilos poseen un estado de ejecución y pueden
sincronizarse entre ellos para evitar problemas de compartición de recursos.
Generalmente, cada hilo tiene una tarea especifica y determinada, como forma de
aumentar la eficiencia del uso del procesador.
Estados de un hilo
Los principales estados de los hilos son: Ejecución, Listo y Bloqueado. No tiene
sentido asociar estados de suspensión 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 deberán estarlo ya que todos comparten el espacio de direcciones del
proceso.
Cambio de estados
Creación: Cuando se crea un proceso se crea un hilo para ese proceso. Luego, este
hilo puede crear otros hilos dentro del mismo proceso, proporcionando un puntero
de instrucción y los argumentos del nuevo hilo. El hilo tendrá su propio contexto y
su propio espacio de la columna, y pasará al final de los Listos.
Bloqueo: Cuando un hilo necesita esperar por un suceso, se bloquea (salvando sus
registros de usuario, contador de programa y punteros de pila). Ahora el procesador
podrá pasar a ejecutar otro hilo que esté al principio de los Listos mientras el anterior
permanece bloqueado.
Desbloqueo: Cuando el suceso por el que el hilo se bloqueó se produce, el mismo
pasa a la final de los Listos.
Terminación: Cuando un hilo finaliza se liberan tanto su contexto como sus
columnas.
7
PROGRAMACIÓN POR THREADS
Todos los hilos comparten el mismo espacio de direcciones y otros recursos como
pueden ser archivos abiertos. Cualquier modificación 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 programación multihilo es que los programas operan con mayor
velocidad en sistemas de computadores con múltiples CPUs (sistemas
multiprocesador o a través de grupo de máquinas) ya que los hilos del programa se
prestan verdaderamente para la ejecución 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 también están 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 atómicas para impedir
que los datos comunes sean cambiados o leídos mientras estén siendo
modificados, para lo que usualmente se utilizan los semáforos. El descuido de esto
puede generar interbloqueo.
8
PROGRAMACIÓN POR THREADS
Procesamiento asíncrono
Los elementos asíncronos de un programa se pueden implementar como hilos. Un
ejemplo es como los software de procesamiento de texto guardan archivos
temporales cuando se está trabajando en dicho programa. Se crea un hilo que tiene
como función guardar una copia de respaldo mientras se continúa con la operación
de escritura por el usuario sin interferir en la misma. Son como 2 programas
independientes.
Aceleración de la ejecución
Se pueden ejecutar, por ejemplo, un lote mientras otro hilo lee el lote siguiente de
un dispositivo.
9
PROGRAMACIÓN POR THREADS
1.6. IMPLEMENTACIONES
También conocidos como ULT (user level thread) y KLT (kernel level thread)
El intercambio de los hilos no necesita los privilegios del modo kernel, porque
todas las estructuras de datos están en el espacio de direcciones de usuario de
un mismo proceso. Por lo tanto, el proceso no debe cambiar a modo kernel para
gestionar hilos. Se evita la sobrecarga de cambio de modo y con esto el
sobrecoste u overhead.
Se puede realizar una planificación específica. Dependiendo de que aplicación
sea, se puede decidir por una u otra planificación según sus ventajas.
Los ULT pueden ejecutar en cualquier sistema operativo. La biblioteca de hilos
es un conjunto compartido.
10
PROGRAMACIÓN POR THREADS
En una aplicación KLT pura, todo el trabajo de gestión de hilos lo realiza el kernel.
En el área de la aplicación no hay código de gestión de hilos, únicamente
un API (interfaz de programas de aplicación) para la gestión de hilos en el
núcleo. Windows 2000, Linux y OS/2 utilizan este método. Linux utiliza un método
muy particular en el que no hace diferencia entre procesos e hilos. Para Linux, si
varios procesos creados con la llamada al sistema "clone" comparten el mismo
espacio de direcciones virtuales, el sistema operativo los trata como hilos, y
lógicamente son manejados por el kernel.
11
PROGRAMACIÓN POR THREADS
CAPÍTULO II
MARCO TEORICO
2.1. DESCRIPCIONES.
Dado lo que he explicado anteriormente podemos contemplar los siguientes
aspectos:
Los thread de usuario (fibers) son mucho más eficientes en escenarios con
varios thread que los thread del kernel. Principalmente por dos razones:
12
PROGRAMACIÓN POR THREADS
Los thread de usuario bloquean a todos los thread del proceso cuando estos
están bloqueados a espera de una llamada al kernel o a un dispositivo de
IO, lo cual hace que se pierda la funcionalidad de procesamiento paralelo.
Qué sucede si estamos utilizando varios threads en una aplicación que se ejecuta
en una maquina con una sola CPU?
Si bien la impresión del usuario es que se están ejecutando varias cosas al tiempo
ya esta claro que esto no es así pues en la CPU solo se puede ejecutar una cosa a
la vez, lo que esta pasando realmente es que los thread están alternando tiempo
de ejecución de una manera tan rápida que el usuario percibe que se están
ejecutando al tiempo.
13
PROGRAMACIÓN POR THREADS
En este caso las cosas pueden cambiar, si nuestra aplicación tiene dos hilos y
nuestra maquina tiene dos CPU (o core) en efecto cada thread se podría ejecutar
en una CPU diferente, en este caso si se puede habar de ejecución en paralelo,
aunque no necesariamente pues puede darse el caso en que, debido a la necesidad
del sistema de calendarizar threads de otros procesos, ambos thread se ejecuten
en la misma CPU en un momento dado, en ese momento no habría paralelismo.
Que pasa si mi maquina tiene 2 CPU pero mi aplicación esta utilizando más de 2
thread?
Lo que sucederá es que solo dos de esos thread se estarán ejecutando en paralelo
en un momento dado (aunque ya vimos que esto no es necesariamente lo que
sucede), y el sistema operativo alternara la ejecución de dichos thread de tal forma
que todos tengan Quantums asignados, pero solo podrá haber máximo 2 en
paralelo.
¿Es cierto que usar threads hará que mi aplicación se ejecute más rápido?
Como ya vimos si tu maquina tiene solo 1 CPU realmente hará tu aplicación mas
lenta, pero con la ventaja de poder efectuar varias tareas a la vez (en apariencia),
pero si tienes tantas o más CPU como threads en ejecución el rendimiento si que
mejorara, es decir si tienes 2 thread y 2 CPU seguramente que si estarás haciendo
dos cosas a la vez y no una cosa cada vez.
El efecto contrario se evidencia toda vez que trates de ejecutar más threads que las
CPU que tienes, es decir si vas a ejecutar 20 threads y solo tienes 2 CPU en vez
de ganar rendimiento realmente lo que harás será castigarlo puesto que esos thread
estarán compitiendo por el tiempo de CPU, lo cual se traduce en múltiples y
frecuentes cambios de contexto que harán perder el preciado tiempo de CPU en la
lógica necesaria par cambiar de un thread a otro.
14
PROGRAMACIÓN POR THREADS
CAPÍTULO III
PROGRAMACION POR THREADS
En esta entrada vamos a ver las diferentes maneras de como trabajar con Threads
en Java (o hilos en español). Sino tienes muy claro el concepto de la multitarea te
recomendamos que te leas primero la entrada de Multitaréa e Hilos, fácil y muchas
ventajas aunque en esta entrada también veremos (en menor detalle) los conceptos
y las ventajas de la multitarea.
15
PROGRAMACIÓN POR THREADS
que se han de ejecutar 4 procesos; uno detrás de otro, y estos tardan unos
segundos:
En Java para utilizar la multitarea debemos de usar la clase Thread (es decir que la clase
que implementemos debe heredar de la clase Thread) y la clase Thread implementa la
Interface Runnable. En el siguiente diagrama de clase mostramos la Interface Runnable y
la clase Thread con sus principales métodos:
16
PROGRAMACIÓN POR THREADS
En esta entrada no vamos a ver como utilizar todos los métodos de la clase Thread, pero
os los mostramos para que sepáis que existen y a parte por su nombre podéis intuir su
funcionalidad.
En esta entrada vamos a poner un ejemplo para que veáis las ventajas de la multitarea,
viendo como se ejecutaría un programa sin utilizar la multitarea y otro utilizándola.
17
PROGRAMACIÓN POR THREADS
Explicado este ejemplo vamos a ver como hemos definido estas clases:
Clase "Cajera.java":
Si ejecutásemos este programa propuesto con dos Clientes y con un solo proceso
(que es lo que se suele hacer normalmente), se procesaría primero la compra del
Cliente 1 y después la del Cliente 2, con lo cual se tardará el tiempo del Cliente 1 +
Cliente 2. A continuación vamos a ver como programamos el método Main para
lanzar el programa. CUIDADO: Aunque hayamos puesto dos objetos de la clase
Cajera (cajera1 y cajera2) no significa que tengamos dos cajeras independientes,
lo que estamos diciendo es que dentro del mismo hilo se ejecute primero los
métodos de la cajera1 y después los métodos de la cajera2, por tanto a nivel de
procesamiento es como si tuviésemos una sola cajera:
18
PROGRAMACIÓN POR THREADS
19
PROGRAMACIÓN POR THREADS
20
PROGRAMACIÓN POR THREADS
21
PROGRAMACIÓN POR THREADS
CONCLUSIONES
Por otro lado para los que empecéis a ver estos temas de la concurrencia,
multitarea y demás, no so preocupéis al principio si os cuesta programar problemas
de este tipo ya que a parte de la multitarea se mezclan cosas como la herencia y
las Interfaces que al principio son cosas que cuestan de asimilar, así que ir poco a
poco pero tener muy claro que la multitarea es muy util y se ha de aplicar para hacer
las aplicaciones más eficientes y que den mejor rendimiento.
22
PROGRAMACIÓN POR THREADS
BIBLIOGRAFIA
http://codigoprogramacion.com/cursos/java/133-uso-de-hilos-o-threads-en-
java.html#.WQyqRuWGO00
https://jarroba.com/multitarea-e-hilos-en-java-con-ejemplos-thread-runnable/
23