psp-b1 hilos y procesos

UT 3: sincronización y prioridad

eugeniaperez.es

¿por qué los conceptos vistos hasta ahora...?

Mejoran la carga páginas/experiencia de usuario

Son aplicables a desarrollo de aplicaciones móviles

Estamos viendo conceptos avanzados de Java 

 

UT 3: sincronización y prioridad

1. Sincronización y prioridad

1 cpu

  • 1 instrucción de cada vez
  • Control de la ejecución -> planificación (scheduling)
  • Java -> Planificación por prioridad fija
    • Prioridad puede ser definida para cada thread (valor entero)
    • Se puede definir a través del setPriority()
    • La JVM elige el thread con la prioridad más alta

eugeniaperez.es

UT 3: sincronización y prioridad

1. Sincronización y prioridad

Cuando se ejecuta un hilo, la ejecución continúa 
hasta que:

  • Otro thread con mayor prioridad esté listo
  • El thread en ejecución termine
  • El thread en ejecución se detenga voluntariamente
  • El thread en ejecución deja de ser ejecutable (operación de E/S, etc.)

Si coinciden 2 o más threads con la misma prioridad 
y listos -> Round Robin

eugeniaperez.es

UT 3: sincronización y prioridad

1. Sincronización y prioridad

eugeniaperez.es

Los SOs Windows admiten la estrategia de planificación por división de tiempos a fin de evitar que un hilo se apodere del control de la CPU por un periodo de tiempo prologado -> selfish thread.

public int tick = 1;
public void run() {
    while (tick < 10000000) {
        tick++;
    }
} 

El hilo no abandona voluntariamente la CPU. 

Se ejecuta hasta que se termine el while o venga otro con mayor prioridad...

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores

La sincronización de threads implica disponer de mecanismos que permitan cerciorarse de que no se producen situaciones de inanición (bloqueo de hilos), punto muerto o interbloqueo. 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores

La sincronización tiene como objetivo que se opere satisfactoriamente con los recursos compartidos por los hilos concurrentes.

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores

A continuación vamos a ejemplificar la compartición de recursos a través de un objeto contenedor común, mediante el algoritmo del Productor-Consumidor.

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

Text

eugeniaperez.es

Monitores:

algoritmo del 

Productor-Consumidor.

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

Cuando 2 threads necesitan compartir información
Ejemplo:

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

Necesitamos mecanismos de control, en caso contrario podría suceder que el Consumidor no obtuviese cada valor producido por el Productor una y sólo una vez.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

¿Y si el Productor fuese más rápido que el Consumidor y generase dos números antes que el Consumidor tuviera una posibilidad de consumir el primero?

  • Productor #1 pone: 3
  • Consumidor #1 obtiene: 3
  • Productor #1 pone: 4
  • Productor #1 pone: 5
  • Consumidor #1 obtiene: 5

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

¿Y si el Consumidor fuese más rápido que el Productor y consumiera el mismo valor dos veces o más?

  • Productor #1 pone: 4
  • Consumidor #1 obtiene: 4
  • Consumidor #1 obtiene: 4
  • Productor #1 pone: 5

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

Text

eugeniaperez.es

DE CUALQUIER FORMA EL RESULTADO es eRRÓNEO. 

SE QUIERE QUE EL CONSUMidor oBTENGA CADA DATO PRODUCIDO POr el PRODUCTOR Y SOLO UNA VEZ.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

Para prevenir estas condiciones en el ejemplo del Productor /Consumidor, el almacenamiento de un entero en el Contenedor por el Productor debe estar sincronizado con la recuperación por parte del Consumidor.
Se gestiona mediante Monitores:

  • notifyAll()
  • wait()

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

El productor tiene una variable llamada container que permite almacenar los datos que va produciendo.

El método run se encarga de producir aleatoriamente el dato y mediante el método put se coloca en el contenedor.

 

Productor

Consumidor

Contenedor

run()

run()

put(data)

get(): data

Thread

Thread

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Productor-Consumidor

A los objetos a los que acceden varios hilos se les llama condiciones variables: Contenedor.

Los Monitores permiten controlar el acceso a las condiciones de variables, garantizando la sincronización de threads.

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Productor-Consumidor

Se consideran secciones críticas aquellos fragmentos de código marcados en Java con la palabra reservada synchronized, donde los hilos concurrentes acceden a las condiciones variables.

synchronized int miMetodo();

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores: algoritmo del Productor-Consumidor

¿Secciones críticas...?

 

Productor

Consumidor

Contenedor

run()

run()

put(data)

get(): data

synchronized void put(data);
synchronized int get();

Thread

Thread

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

  • El valor que introduce el productor en el contenedor (put) y que luego se extrae por el consumidor (get) es almacenado en la variable data.
  • Además existe un flag (idData) para avisar a los hilos de la existencia de un nuevo valor.
  • El método wait permite suspender la ejecución hasta que se reciba una señal, notificando que el dato ha sido consumido, o que ya se ha producido un nuevo valor.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

  • Las señales que activan el método wait se envían mediante el método notifyAll.
  • A su vez, desde el método get se comprueba si existe un valor disponible, en caso contrario se queda esperando hasta que le avisen (wait).
  • Una vez avisado (con notifyAll desde el put) modifica el flag y devuelve el valor, avisando a su vez al método put de que el dato ya ha sido consumido.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Text

Descarga el repositorio:

  •  PSP.UT3.ProducerConsumer
  • URL: https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut3.producerconsumer.git

Username: cuatrovientos

Password: Cuatrovientos

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Text

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Monitores

Tanto Productor como Consumidor utilizan un recurso compartido que se basa en el objeto contenedor de valores.

Es interesante que mientras se esté ejecutando el put nadie más tenga acceso a las variables propias del objeto.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Este mecanismo para gestionar bloqueos supone:

  • El coste de adquirir y liberar bloqueos en los métodos synchronized es más elevado.
  • Es responsabilidad del programador gestionar los bloqueos.
  • Se intenta evitar el uso de recursos compartidos por la complejidad que arroja su gestión.

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Text

ENTREGA: UT3. Actividad 1 (pág. 85)

  • 11 Octubre a las 23:30

​Modifica el ejemplo del Productor-Consumidor para
SUSTITUIR la clase Contenedor por una colección de la API de Java que ofrezca el mismo comportamiento.

 

 

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Text

ENTREGA: UT3. Actividad 1 (pág. 85)

Pista: Echa un vistazo a la interfaz BlockingQueue y a
alguna de sus implementaciones que soporte sincronismo.
Es decir, investiga y busca de entre las posibles implementaciones de esta interfaz y elige
la que creas que más se adapta a este problema, eliminando
la clase Contenedor
e instanciando esta nueva
implementación que utilizarán tanto el Productor como el Consumidor.

 

 

 

 

UT 3: sincronización y prioridad

1.1 Sincronización de threads: monitores

eugeniaperez.es

Text

ENTREGA: UT3. Actividad 1 (pág. 85)

El objetivo de esta actividad es que NO REINVENTES LA RUEDA

Debes acostumbrarte a utilizar las clases del API de Java que ya están desarrolladas para estos fines...

Al final tendrás un proyecto con 3 clases en lugar de 4 y el tratamiento de las secciones críticas será más eficiente...
 

 

 

 

UT 3: sincronización y prioridad

REPASO

eugeniaperez.es

Text

API de Java: 

Está organizada en paquetes lógicos, donde cada paquete contiene un conjunto de clases relacionadas de gran utilidad para los programadores.
Es un conjunto de clases que podemos utilizar para llevar a cabo tareas en nuestras aplicaciones.

Por tanto, es recomendable que antes de ponernos a escribir código, le echemos un vistazo a la API porque, a lo mejor, ya existe una clase que hace lo que pretendemos.

Debes acostumbrarte a utilizar las clases del API de Java que ya están desarrolladas para estos fines...

Al final tendrás un proyecto con 3 clases en lugar de 4 y el tratamiento de las secciones críticas será más eficiente...
 

 

 

 

UT 3: sincronización y prioridad

REPASO

eugeniaperez.es

Text

JAVA COLLECTION FRAMEWORK (JCF)

Set de clases e interfaces de importante utilidad, en el paquete java.util, para el manejo de colecciones de objetos en Java.
Es decir, hasta ahora, cuando has hecho los ejercicios, y has necesitado una colección, es decir, un array o una lista, probablemente has utilizado tus propias soluciones. Por ejemplo, en el ejercicio del Productor-Consumidor, has utilizado 
una clase Contenedor, que no es más que un almacén en el que se van insertando y sacando elementos.
gar de 4 y el tratamiento de las secciones críticas será más eficiente...

 

 

 

 

UT 3: sincronización y prioridad

REPASO

eugeniaperez.es

Text

JAVA COLLECTION FRAMEWORK (JCF)

No obstante, esto NO suele ser necesario.
La ventaja es que:

  • Ya están hechas, probadas, documentadas,
  • y son eficientes.
  • Es decir, podemos afirmar casi con total
  • probabilidad que van a estar mejor que las
  • que programemos nosotros mismos. 

 

 

 

 

UT 3: sincronización y prioridad

REPASO

eugeniaperez.es

Text

JAVA COLLECTION FRAMEWORK (JCF)

Se organizan en:

  • Interfaces: definen un tipo de colección. Habrá una interfaz lista, que definirá los métodos de una lista.
  • Implementaciones de las interfaces: dado  que habrá varios tipos de listas, habrá varias implementaciones de la interfaz lista.

 

 

 

 

UT 3: sincronización y prioridad

REPASO

eugeniaperez.es

Text

La idea es buscar una implementación de la interfaz BlockingQueue, que sustituya a la clase Contenedor:

 

 

 

 

 

Productor

Consumidor

UT.3 Sincronización y prioridad

By eugenia_perez

UT.3 Sincronización y prioridad

  • 1,284