psp-b1 hilos y procesos

UT 3: sincronización y prioridad

Semáforos

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Hasta ahora hemos visto el mecanismo de sincronización basado en el uso de monitores...

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Los monitores permitían sincronizar dos hilos

Siempre consumíamos un dato una y solo una vez.

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Hemos visto:

  • Uso avanzado de conceptos en Java (secciones críticas: synchronized, herencia, interfaces, etc)
  • Patrones de diseño (Decorator)
  • Uso del API de Java (clases útiles, métodos)
  • Colecciones de Java

eugeniaperez.es

  • Conceptos avanzados de Java
  • Módulo complementario de otros...

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

semáforos

Otro posible mecanismo para sincronizar hilos son los semáforos.

Un semáforo es un mecanismo para permitir o bien restringir el acceso a recursos compartidos en un entorno de multiprocesamiento, con varios procesos concurrentes.

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Veamos un ejemplo implementado en Java, mediante la clase Semaphore del paquete java.util.concurrent.

  • Se presentan dos clases que implementan hilos (Thread).
  • Queremos que HiloPrioritario se ejecute siempre antes que HiloNoPrioritario, con lo que vamos a utilizar un semáforo para ello.

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Descarga los proyectos del repositorio:

PSP.UT3.Semaphore:

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut3.semaphore.git

PSP.UT3.FileDownloader:

https://eugenia_perez@bitbucket.org/eugenia_perez/psp.ut3.filedownloader.git

Usuario: cuatrovientos

Contraseña: Cuatrovientos

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

En este ejemplo creamos un Semáforo.

El hilo prioritario tomará el semáforo, se ejecutará, y una vez finalice su ejecución lo liberará para que el hilo no prioritario lo pueda coger.

 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

 

Los métodos importantes son:

  • release() y acquire()

eugeniaperez.es

Libera el semáforo (contador +1)

Adquiere el semáforo (contador -1)

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

release(): ejecutado por un hilo para liberar el semáforo cuando el propio hilo ha terminado su ejecución.

  • El hilo que posee el semáforo en un momento determinado, lo libere para que otro hilo lo pueda empezar a utilizar.
  • Puede recibir un número n, que será incrementado a la variable permits.

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

acquire(): ejecutado por un hilo para acceder al semáforo con una particularidad: puede recibir un número n, que será decrementado la variable permits.

  • Para que un hilo pueda tomar el control de un semáforo con este método, la variable permits > 0. 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

Si cuando construimos el Semáforo, lo hacemos pasándole un 0 en el constructor, permits valdrá 0, con lo que el hilo no prioritario no podrá ser nunca el primero en ejecutarse, ya que necesita que el hilo prioritario llame al release(). 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

eugeniaperez.es

permits: +1

permits: +n

permits: -1

permits: -n

permits: n

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

Una aplicación de los semáforos podría servir para simular el comportamiento de un navegador web.

Un programa al que le indicamos una URL a visitar, accede a ella, descarga el contenido HTML del documento para mostrárnoslo, y además, descarga todos los ficheros auxiliares necesarios para mostrarnos todo el contenido de la página, esto es, ficheros Javascript, CSS, imágenes, vídeos, etc.

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

Por ejemplo, cuando accedemos a Google, podemos ver que el navegador realiza 20 peticiones distintas para poder mostrarnos la página:

 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

En la imagen anterior podemos ver todos los ficheros que son necesarios descargar para mostrar la página (hasta 20). En la parte derecha, vemos una línea del tiempo que indica cuándo se empieza a descargar cada recurso, y cuándo termina ésta. Vemos que varios se van haciendo en paralelo.

 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

Por ejemplo, el primer recurso que se descarga (después del propio documento HTML de la página de Google),

es una imagen con la URL:

https://www.google.es/images/nav_logo231.png

 

 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

Dependiendo del navegador, la cantidad de ficheros que es capaz de descargar en paralelo varía.

Existen, por ejemplo, navegadores que sólo son capaces de descargar 2 a la vez.

A continuación, podríamos simular este comportamiento con una aplicación Java que utilice semáforos.

 

 

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

La clase principal crearía un semáforo que sólo permitirá 2 descargas simultáneas.

Se simula descargar una página web que para ser visualizada necesita descargar en background otros 10 archivos.

 

 

eugeniaperez.es

Por motivos de simplicidad, hacemos una espera de entre 0,5 y 3 segundos, que sería lo que podría tardar en descargarse cada recurso individual.

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

eugeniaperez.es

UT 3: sincronización y prioridad

1.2 Sincronización de Threads: semáforos

EJEMPLO PRÁCTICO

Si quisiéramos dotar a la aplicación de un comportamiento más acorde al mundo real, podríamos sustituir el sleep del hilo por un código para parsear el HTML(que vaya buscando entre el código todos los recursos externos que la página necesita, y por cada uno de éstos, lanzar una instancia de FileDownloader, descargando uno a uno a disco).

Esto sería lo que hace un navegador web para mostrar las páginas al usuario.

 

 

eugeniaperez.es

UT 3: SINCRONIZACIÓN Y PRIORIDAD

1.2 Sincronización de Threads: Semáforos

eugeniaperez.es

Text

ACTIVIDADES Pág. 86, enunciados en Bitbucket:

  • Actividad 3: https://eugenia_perez@bitbucket.org/eugenia_perez/ut3.activity3.git 
  • Actividad 4: https://eugenia_perez@bitbucket.org/eugenia_perez/ut3.activity4.git
  • Actividad 5:
  • Con Semáforos: https://eugenia_perez@bitbucket.org/eugenia_perez/ut3.activity5b.git

Si lo prefieres puedes plantearla con monitores... 

UT 3: SINCRONIZACIÓN Y PRIORIDAD

1.2 Sincronización de Threads: Semáforos

eugeniaperez.es

Text

PARA ENTREGAR, 25 Octubre, 23:30:

  • Actividad 3: obligatoria
  • Actividad 5: voluntaria
  •  

 

UT3. Sincronización y prioridad (B) Semáforos

By eugenia_perez

UT3. Sincronización y prioridad (B) Semáforos

  • 1,532