Sistemas Operativos Temas 4, 5 y 6 Jorge García Duque Despacho: B-202 Tutorías: Lunes 16:00-18:00 y Martes 16:00-20:00 Sistemas Operativos. 2009-2010 Índice • Tema 4: Herramientas de Sincronización de Alto Nivel. – Regiones Críticas. – Monitores. • Tema 5: Comunicación entre procesos. • Tema 6: Gestión de Interbloqueo • Resolución de cuestiones y problemas de examen. Sistemas Operativos. 2009-2010 Tema 4. Herramientas de Sincronización de Alto Nivel Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (I). Introducción • • Objetivo: evitar los problemas de inicialización y errores en la disposición de las sentencias wait y signal. Consta de una variable compartida x de cualquier tipo, a la que sólo se puede acceder mediante la sentencia: REGION x DO S, • donde S es la sección crítica donde se accede a la variable x. La Región Crítica garantiza el acceso en exclusión mutua a S, y por tanto, a los datos contenidos en la variable x. Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (II). Exclusión Mutua Proceso P { Proceso Q { shared tipo x; shared tipo x; ................. ................. REGION x DO BEGIN REGION x DO BEGIN Sección Crítica; Sección Crítica; END; END; ................. ................. } } COBEGIN P;Q; COEND; Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (III). Exclusión Mutua • Implementación con semáforos: – La sentencia shared tipo x se sustituye por: semaforo x_mutex(1); – La sentencia REGION x DO S se sustituye por: wait(x_mutex); S; signal(x_mutex); • Problema: sólo solucionamos el problema de la exclusión mutua. Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (IV). Condicionales • Regiones Críticas Condicionales: – Se añade una condición de acceso booleana B: REGION x WHEN B DO S; – Sólo si B es cierto se compite por el acceso en exclusión mutua a S. – Si B es falso, el proceso se suspende hasta que B sea cierto y pueda competir por la exclusión mutua. – La comprobación de B debe hacerse en exclusión mutua por lo que sus variables involucradas deben incluirse en la Región x; Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (V). Implementación [shared tipo x]: semaforo x_mutex(1), x_wait(0); int x_cuenta = 0, x_temp = 0; [REGION x WHEN B DO S]: wait(x_mutex); if (NOT B) { x_cuenta++; signal(x_mutex); wait(x_wait); while (NOT B) { x_temp++; if (x_temp < x_cuenta) signal(x_wait); else signal(x_mutex); wait(x_wait); } x_cuenta--; } Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Regiones Críticas (VI). Implementación [REGION x WHEN B DO S] (cont): S; if (x_cuenta > 0) { x_temp = 0; signal(x_wait); } else signal(x_mutex); • Problemas de la implementación: – Conlleva evaluar todas las condiciones B cada vez que un proceso accede a la sección crítica. – Los procesos se desordenan. Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Monitores(I). Introducción • Objetivo: aislar el código de sincronización del código de los procesos. S Proceso A I N C. S I N C. DATOS S S I I Proceso B N N C. C. Monitor: tipo abstracto de datos que garantiza el acceso en exclusión mutua a los datos. Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Monitores(II). Introducción • Sólo un proceso puede ejecutar simultánemente una de las funciones de acceso (ENTRY) definidas para el Monitor. • El Monitor puede incluir funciones internas con el objetivo de estructurar la codificación de las funciones de acceso. • Los procesos no pueden acceder a las funciones internas ni a los datos del Monitor. f1 Internas f2 f3 f4 DATOS Inicio() Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel f5 f6 Monitores (III). Condicionales • Se incluyen como parte de los datos del Monitor Variables de Condición: • Una variable de condición v consta de: – Una cola de procesos. – Tres funciones de acceso: • wait(v): suspende al proceso en la cola asociada a la variable de condición. • signal(v): si existe algún proceso suspendido en la cola asociada a la variable de condición se despierta el más prioritario. • empty(v): función boolena que retorna verdadero si no existe ningún proceso suspendido en la cola asociada a la variable de condición (falso en caso contrario) Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Monitores(IV). Condicionales Monitor Semaforo int s; condition v; ENTRY wait() { inicio() { s = N; } ENTRY signal() { if (s == 0) wait(v); else s--; } Proceso P { M.wait(); S; M.signal(); } Sistemas Operativos. 2009-2010 if (empty(v)) s++; else signal(v); } Herramientas de Sincronización de Alto Nivel Monitores (V). Condicionales • • • • • Problema: cuando un proceso P despierta a otro proceso Q suspendido sobre una variable de condición, ¡existirán dos procesos preparados dentro del Monitor!. Solución: como el Monitor garantiza la exclusión mutua en el acceso a los datos, uno de los dos procesos se suspenderá hasta que el otro abandone el Monitor (retorna o se suspende sobre una variable de condición). Dos posibilidades: 1. Continúa el proceso señalado (Q) y se demora el que ha ejecutado el signal (P). 2. Continúa el proceso que ha ejecutado el signal (P) y se demora el proceso señalado (Q). En general, las soluciones son dependientes del tipo de Monitor. Soluciones independientes del tipo de Monitor: después de un signal, el proceso abandona el Monitor. Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Colas de Variables de Condición Cola Interna MONITOR Internas DATOS Inicio() Cola de Procesos de Entrada Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel Monitores(VI). Implementación semaforo mutex(1), next(0); int next_count = 0; [condition v]: semaforo v_sem(0); int v_count = 0; [Monitor.f()]: wait(mutex); f(); siguiente(); Sistemas Operativos. 2009-2010 if (next_count > 0) signal(next); else signal(mutex); Herramientas de Sincronización de Alto Nivel Monitores(VII). Implementación [signal(v)]: Tipo 1 (cont. señalado) if (v_count > 0) { next_count++; signal(v_sem); wait(next); next_count--; } [wait(v)]: Tipo 1 (cont. Señalado) v_count++; siguiente(); if (next_count > 0) wait(v_sem); signal(next); v_count--; else signal(mutex); Sistemas Operativos. 2009-2010 Herramientas de Sincronización de Alto Nivel