Paul Leger http://pleger.cl Procesos (capitulo 2) Paul Leger http://pleger.cl
Problemas de Lectores y Escritores Si tenemos una base de datos, varios pueden leer al mismo tiempo, pero solamente uno puede escribir al mismo tiempo. En otras palabras, si: Si hilos/procesos están leyendo al mismo tiempo, otros pueden seguir leyendo, pero nadie puede escribir Si hay un hilo que está escribiendo, no se puede leer ni escribir por otros hilos/procesos
Lectores y Escritores Lectores Escritor A Escritor B
Monitores Monitores sincronizan hilos como los semáforos, pero no usan “tickets” sino condiciones para “dormir”. Por ejemplo, Si un hilo no cumple cierta condición se duerme O si cierta condición se cumpla se despierta otros hilos
Lectores y Escritores Con Monitores Alguien leyendo o escribiendo? Escribiendo = True E Escritor S Escribiendo = False Nadie escribiendo? Lectores++ E Lectores S Lectores- - Lectores = 0?
Monitores en Lectores Escritores en Pseudocódigo Entrada y salida de lectores Entrada y salida de escritores def EnterWrite(): while (reader> 0 or writing): canwrite.wait() writing = True def EnterRead(): while (writing): canread.wait() readers++ 1 4 2 def ExitWrite(): writing = False canwrite.signal() if (not writing): canread.signal() def ExitRead(): readers-- if (readers == 0) canwrite.signal() 5 3 6 canread es un monitor usado para controlar los diferentes hilos que quieren leer canwrite es un monitor usado para controlar los diferentes hilos que quieren escribir
Algunas Problemas … si no usa correctamente estas soluciones Deadlock (abrazo mortal): Dos hilos/procesos quedan esperando entre ellos; cada uno espera que uno de ellos termine la tarea. Ejemplo: dos escritores que tienen la misma prioridad para escribir Starving (hambruna): Un proceso/hilo que nunca tiene posibilidad de entrar a una zona critica. Ejemplo: infinitos lectores y un escritor
Monitores en Python En Python, no existe exactamente la abstracción Monitor. Afortunadamente, se puede emular esta abstracción con otras abstracciones del lenguaje: condition = threading.Condition(threading.Lock()): Creación de una condición de monitor condition.adquire(): Adquiere un lock/acceso para entrar a una zona condition.release(): Libera un lock/acceso para entrar a una zona condition.wait(): Duerme un hilo
Ejemplo: Productores y Consumidores con Conditions
Ejercicio Propuesto: Implementar lectores y escritores con monitores en Python
Comunicación entre Procesos
Comunicación entre Procesos Un proceso se comunica con otro a través de usar archivos como memoria compartida o mensajes. Ejemplos: Cuando Word imprime un archivo, esta aplicación debe comunicarse con el servicio de imprimir Cuando en un chat, dos clientes reciben mensajes entre ellos Cuando un sistema operativo tiene que apagarse, cada aplicación recibe una señal (= mensaje) de cerrarse
Condiciones Criticas ¿Quién se encarga? En procesos también tenemos secciones criticas que deben ser cuidadas. Por ejemplo: Impresora Escritura de archivos Tarjeta de video Etc. ¿Quién se encarga?
Soluciones a Secciones Criticas Se puede ocupar soluciones como semáforos y monitores para administrar este acceso
Comunicaciones Entre Procesos: Una Introducción a socket