Sincronización entre procesos Federico Raimondo SO 10/09/2013 Federico Raimondo Sincronización entre procesos 10/09/2013 1 / 15 Repaso Mutex Mutual Exclusion (Mutex o Exclusión Mutua) Lograr el acceso exclusivo a una variable o porción de código. Federico Raimondo Sincronización entre procesos 10/09/2013 2 / 15 Repaso Mutex Mutual Exclusion (Mutex o Exclusión Mutua) int critica = 3.1416 A(): while(true): agregar_decimal(critica) B(): while(true): quitar_decimal(critica) ¿cómo hacemos para que agregar decimal y quitar decimal se ejecuten sin “molestarse”? Federico Raimondo Sincronización entre procesos 10/09/2013 3 / 15 Repaso Mutex Mutual Exclusion (Mutex o Exclusión Mutua) int critica = 3.1416 sem_t m(1); A(): while(true): m.wait() agregar_decimal(critica) m.signal() B(): while(true): m.wait() quitar_decimal(critica) m.signal() Federico Raimondo Sincronización entre procesos 10/09/2013 4 / 15 Repaso Rendezvouz Rendezvous Federico Raimondo Sincronización entre procesos 10/09/2013 5 / 15 Repaso Rendezvouz Rendezvous (Encuentro) Dados dos procesos A y B, logra que ambos se encuentren en determinado punto del código antes de seguir ejecutando. Federico Raimondo Sincronización entre procesos 10/09/2013 5 / 15 Repaso Rendezvouz Rendezvous (Encuentro) A(): f1() g1() B(): f2() g2() ¿cómo hacemos para que g1 y g2 se ejecuten luego de que lo hagan f1 y f2? Federico Raimondo Sincronización entre procesos 10/09/2013 6 / 15 Repaso Rendezvouz Rendezvous (Encuentro) A(): f1() b.signal() a.wait() g1() Federico Raimondo B(): f2() a.signal() b.wait() g2() Sincronización entre procesos 10/09/2013 7 / 15 Repaso Barrera Barrera Es la idea de Rendezvous extendida a N procesos. Federico Raimondo Sincronización entre procesos 10/09/2013 8 / 15 Repaso Barrera Barrera Ai(): f() g() ¿cómo hacemos para que todos los procesos ejecuten g() una vez que todos hayan ejecutado f()? Federico Raimondo Sincronización entre procesos 10/09/2013 9 / 15 Repaso Barrera Barrera int n = N sem m = mutex(1) sem b = sem(0) P(i): f() m.wait() //Acceso exclusivo n--; yo = n; m.signal() if yo == 0: // Soy el ultimo b.signal() b.wait() b.signal() // <- wait+signal = turnstile g() Federico Raimondo Sincronización entre procesos 10/09/2013 10 / 15 Repaso Barrera Barrera int n = N sem m = mutex(1) sem b = sem(0) P(i): f() m.wait() //Acceso exclusivo n--; yo = n; m.signal() if yo == 0: // Soy el ultimo b.signal() b.wait() b.signal() // <- wait+signal = turnstile g() ¡Ojo con el orden! Federico Raimondo Sincronización entre procesos 10/09/2013 10 / 15 Repaso Barrera Barrera int n = N sem m = mutex(1) sem b = sem(0) P(i): f() m.wait() //Acceso exclusivo n--; yo = n; m.signal() if yo == 0: // Soy el ultimo b.signal(N) // broadcast b.wait() g() Federico Raimondo Sincronización entre procesos 10/09/2013 11 / 15 Repaso Cola ordenada Cola ordenada Los procesos deben acceder a la sección critica en orden. Federico Raimondo Sincronización entre procesos 10/09/2013 12 / 15 Repaso Cola ordenada Cola ordenada P(i): f() //<-- Seccion critica Q(): while(true) g() // <-- Aca corren los P en orden. ¿cómo hacemos para que los procesos P ejecuten f() en el orden en que llegaron, luego de que Q ejecute g()? Federico Raimondo Sincronización entre procesos 10/09/2013 13 / 15 Repaso Cola ordenada Cola ordenada cola c = colaVacia() sem_t m = mutex(1) semt_t c = colaNoVacia(0) P(i): sem yo = sem(0) m.wait() n = tamanio(c) c.push(yo) m.signal() if (n == 0) colaNoVacia.signal() yo.wait() f() m.wait() c.pop() if c no es vacia: c.top().signal() m.signal() Federico Raimondo Sincronización entre procesos 10/09/2013 14 / 15 Repaso Cola ordenada Cola desordenada Q(): while(true) g() colaNoVacia.wait() m.wait() c.top().signal() m.signal() Federico Raimondo Sincronización entre procesos 10/09/2013 15 / 15