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,646