Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas...

30
Arquitecturas cliente/servidor Creación de Sockets Cliente Servidor Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 1

Transcript of Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas...

Page 1: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Arquitecturas cliente/servidor

Creación de Sockets Cliente Servidor

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

1

Page 2: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Creación de Sockets Cliente/Servidor

Sockets en TCP

• Concepto de Hilos

• Definición de DAEMON

• Sockets en UDP

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 2

Page 3: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

THREADS

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

3

Page 4: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

¿Qué es un thread?

• Un thread es un flujo secuencial de control dentro de un programa.

• Un thread (hilo o contexto de ejecución) es una secuencia de instrucciones en ejecución.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

4

Page 5: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Threads

• El concepto de thread es similar al de proceso, excepto que múltiples thread pueden ejecutarse dentro del mismo proceso, compartiendo los datos y el código de programa.

• La mayoría de los programas se pueden considerar como de thread único, es decir, existe un único camino de ejecución, el programa tiene un inicio, se realizan una serie de cálculos y se finaliza.

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 5

Page 6: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Threads • Un thread es un proceso ligero (más rápido y

económico)

• Generalmente un proceso (padre) genera diversos threads (procesos-hijo), formando así un árbol de procesos

• Los programas multihilo pueden tener varios flujos de control en diferentes partes del código ejecutándose "simultáneamente".

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

6

Page 7: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Cambio de contexto

• La alternación de threads que tiene que hacer el sistema operativo es escaso.

• Entendiendo como tal el cambio que deberá realizar el sistema para colocar un proceso en ejecución y colocar el que se está ejecutando en espera.

• Este mecanismo se denomina cambio de contexto.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

7

Page 8: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Características de los threads

• Cada thread tiene su propia pila y sus propios valores para sus variables, por lo que se define su estado de ejecución, así como el flujo de control.

• Permiten un sencillo manejo de la memoria compartida, en datos y variables, así como una forma práctica de comunicación entre ellos.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

8

Page 9: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Creación de un Thread

• Para crear un nuevo thread es necesario generar una instancia de la clase java.lang.Thread.

• Un objeto Thread representa un verdadero hilo en ejecución para el intérprete de Java y es utilizado para el control y sincronización durante su aplicación.

• Mediante Thread, podemos dormir el hilo, ejecutarlo, interrumpirlo, etc. Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 9

Page 10: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Implementación

• Hay dos alternativas posibles :

– Declarar el hilo con una clase extendida de la clase java.lang.Thread, mediante la herencia.

– Implementar la interfaz java.lang.Runnable.

• La implementación de la interfaz

java.lang.Runnable es la forma habitual de crear threads, ya que proporciona una forma de abstracción a la hora de definir una clase.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

10

Page 11: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Interface Runnable

• Un objeto que desee utilizar los métodos que proporciona la clase java.lang.Thread se puede declarar mediante la implementación de la interfaz java.lang.Runnable, que simplemente se define de la siguiente manera descrita:

public interface Runnable {

abstract public void run();

}

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

11

Page 12: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

El método run( )

• El inicio de cada hilo quedara definido mediante la ejecución del método run() para cada objeto creado, que contendrá el código que se va a ejecutar.

• run() es un método público, no acepta parámetros y no lanza ninguna excepción.

• Cada objeto de esta clase sería Runnable y por tanto se podrá utilizar con la clase java.lang.Thread.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

12

Page 13: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Implementación de la interfaz Runnable

• Como se ha descrito, la clase debe implementar la interfaz Runnable, por lo que para empezar,la clase debe tener la siguiente definición:

public class miThread implements Runnable{

}

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 13

Page 14: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Funcionamiento run( ) y start( )

• Es posible indicar que comience la ejecución del hilo de ejecución mediante el uso de los métodos que proporciona la clase java.lang.Thread.

• El método start() es el encargado de llamar al método run().

• El método start() de java.lang.Thread() arranca el objeto tipo Thread como tal.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

14

Page 15: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Ejemplo: • Solo queda utilizar la clase como un verdadero objeto tipo

Thread.

• Por lo tanto, se genera un objeto tipo java.lang.Thread y se pasa un objeto del tipo de la clase generada:

public class Mensaje implements Runnable{ public void run(){ System.out.println(“Hola mundo”); } public static void main(String args[]){ Mensaje miHilo = new Mensaje(); new Thread(miHilo).start(); } }

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 15

Page 16: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Herencia

• El otro método para la creación de hilos consiste en heredar un objeto de la clase java.lang.Thread.

• Se trata de una forma más sencilla que la anterior, ya que la propia clase java.lang.Thread contiene el método run() que ejecuta el código.

• Para que la clase pueda ser ejecutada como un hilo, se hereda de la clase java.lang.Thread y se escribe el código dentro del procedimiento run(). Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 16

Page 17: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Sintaxis

• La clase java.lang.Thread redefine el método run()

class miHilo extends Thread {

public void run () {

// Código a ejecutar

}

}

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 17

Page 18: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Creación y ejecución

• La creación del hilo y su ejecución sería de la forma siguiente:

miHilo mio = new miHilo();

mio.start();

• Como se observa, la ejecución también se realiza con la llamada al método start()

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 18

Page 19: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Observaciones (Herencia)

La implementación de los threads mediante este

método es mucho más fácil de utilizar. Si se quiere crear un thread que herede de otra clase que no se java.lang.Thread, como

por ejemplo Applet, no se podrá realizar. Cabe señalar que la clase Thread en sí implementa a la

interfaz Runnable, hay un par de constructores de la clase Thread que reciben objetos tipo Runnable

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

19

Page 20: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Estados de un thread

Durante el ciclo de vida de un thread se pueden encontrar diferentes estados.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

20

Page 21: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Algunos métodos de la clase Thread

• void start(): usado para iniciar el cuerpo de la thread definido por el método run().

• void sleep(tiempo): pone a dormir una thread por un tiempo mínimo especificado.

• void join(): usado para esperar por el término de la thread, por ejemplo por término de método run().

• void yield(): Mueve el thread desde el estado de en ejecución al final de la cola de procesos en espera por la CPU, en otras palabras cede el control del microprocesador a otro hilo.

• boolean isAlive(): Indica si el thread esta vivo o no.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

21

Page 22: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Distribución del procesador

• Por defecto los hilos con prioridad igual se

ejecutan con el sistema round robin.

• Si un thread comienza a ejecutarse, lo seguirá haciendo hasta que ocurra alguna de las siguientes circunstancias: – Se llame al método sleep() o wait() – Se espere una entrada/salida – Si se ejecuta un método sincronizado. – Se llame al método yield()

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

22

Page 23: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Prioridades de los Threads

• Java garantiza de cierta manera la gestión de los threads en cuanto al nivel de prioridad asignado a cada uno de ellos, de tal forma que cada hilo tiene una prioridad asociada.

• Si un hilo con mayor prioridad pasa a activo, que el hilo que se esta ejecutando, éste pasa a dormido.

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 23

Page 24: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Manejo de Prioridades

• La prioridad por defecto de un thread está definida por la variable estática Thread.NORM_PRIORITY = 5

• Existen otras dos variables estáticas definidas en el paquete java.lang.Thread – public static final int MAX_PRIORITY 10 – public static final int MIN_PRIORITY 1 – public static final int NORM_PRIORITY 5

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 24

Page 25: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Ejemplo class MiHilo extends Thread { String mensaje; MiHilo( String cadena) { mensaje = cadena ; } public void run() { while(true) { System.out.println( mensaje ); } } public static void main( String args[] ) { new MiHilo("K1 ").start(); new MiHilo("K2 ").start(); MiHilo obj2 = new MiHilo("L "); obj2.setPriority( Thread.NORM_PRIORITY+1); obj2.start(); } } Salida: K1 K1 K1 K1 K1 K2 L K1 K2 L K1 K2 L K1 K2 L L

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

25

Page 26: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Definición de DAEMON

• Es un tipo especial de proceso que se ejecuta de forma:

– Continua (infinitamente) .

– Transparente para el usuario.

– Simultánea con otros procesos, por eso suelen encontrarse en sistemas multitarea.

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

26

Page 27: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Además…

• No disponen de una interfaz directa con un humano, ya sea gráfica o textual.

• No hacen uso de la entradas y salidas estándar para comunicar errores o registrar su funcionamiento.

• Por el contrario usan archivos del sistema en zonas especiales (/var/log/) o utilizan otros demonios especializados en dicho registro como el syslogd

Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza

27

Page 28: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Por ejemplo:

• httpd

• demonios "cronológicos" para mantenimiento del

sistema en segundo plano.

• proceso de sistema de protección en tiempo real de antivirus .

• proceso de protección de firewall de capa de red/aplicación. Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 28

Page 29: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Programas Demonios

• Un thread demonio (daemon) es un thread de baja prioridad que consta de un bucle infinito y se suele utilizar para prestar servicios cuando se necesite, por ejemplo, refresco de memoria, mostrar imágenes, etc. Java utiliza un thread daemon, el recolector de basura para realizar todas las gestiones sobre la creación y destrucción de los objetos en memoria.

• Un thread demonio se declara de la siguiente manera: – thread.setDaemon();

• Y se puede comprobar si un thread es tipo "demonio" mediante el siguiente método: – isDaemon();

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 29

Page 30: Arquitecturas cliente/servidorprofesores.fi-b.unam.mx/yasmine/tema2thread.pdf · Arquitecturas Cliente/Servidor, Sem 2015-1 M.I.Yasmine Macedo Reza 29 . Observaciones sobre threads

Observaciones sobre threads

La diferencia entre los threads normales y los

demonios es que Java no espera la muerte

de los demonios para detener su ejecución

Otra característica consiste en que cualquier

thread que se crea desde otro que es demonio también es un thread demonio.

Arquitecturas Cliente/Servidor, Sem 2015-1

M.I.Yasmine Macedo Reza 30