Tema 1. Introducción a la Programación Concurrente Programación Concurrente Depto. de Lenguajes y Sistemas Informáticos Universidad de Granada Contenidos 1. Concepto de concurrencia y programa concurrente. 2. Sincronización y exclusión mutua. Propiedades de corrección. 3. Consideraciones sobre el hardware. Sistemas multicore y clusters. 4. Introducción a los mecanismos de sincronización y comunicación de bajo nivel. 5. Algoritmos de Exclusión Mutua en sistemas con memoria compartida. 1. Concurrencia y programa concurrente Programa concurrente y Concurrencia • Programa secuencial: Declaraciones de datos + instrucciones (ejecución secuencial). • Programa concurrente: Conj. de programas secuenciales ordinarios ejecutados como procesos paralelos (paralelismo abstracto). • Proceso: Ejecución de un programa secuencial. • Concurrencia: describe el potencial para ejecución paralela. – Solapamiento real o virtual de varias actividades en el tiempo 1. Concurrencia y programa concurrente Programación concurrente Programación Concurrente • PC: Notaciones y técnicas de programación usadas para expresar paralelismo potencial y solucionar los problemas de sincronización y comunicación. • Abstracción: La PC es independiente de la implementación del paralelismo. Justificación de la PC • Eficiencia: Obvia. • Calidad: Más natural especificar algunos sistemas en términos de varios procesos secuenciales ejecutándose concurrentemente. – Ej.: Transacciones de reservas de vuelos. • Cada terminal se controla con un programa secuencial 1. Concurrencia y programa concurrente Modelo abstracto. Entrelazamiento • Modelado del paralelismo • – P: Programa concurrente consistente en 2 procs.: P1 y P2. – P ejecuta cualquiera de las secuencias de ejecución obtenidas entrelazando secuencias de P1 y P2. P: Posibles comp. P1 P2 … … I11 I12 I13 I14 I21 I22 I23 I24 I11 I21 I12 I22 I23 I13 I24 … I11 I12 I13 I21 I22 I23 I14 … I21 I11 I22 I12 I13 I14 I23 … Independencia del entorno de ejecución: El entrelazamiento preserva la corrección. – No importa cómo sea la ejecución, el resultado debe ser consistente. En caso contrario, no sería posible razonar sobre la corrección. P: I1||I2 I1≡ M=1 I2≡ M=2 Resultado consistente M=1 ó M=2 – Análisis de programas difícil. – Nº ejecuciones posibles ≈ ∞ – Se requieren métodos formales 1. Concurrencia y programa concurrente Modelo abstracto. Hipótesis del progreso finito • No suposición acerca velocidades absolutas/relativas de ejecución de los procesos salvo que el tiempo de ejecución >0 – Entender programa concurrente en base a: • sus procesos secuenciales + las interacciones entre ellos. – Ej.: Disco es más lento que una CPU pero el programa no debería asumir eso – Razones para diseñar un sistema indep. de suposiciones temporales: • Difícil detectar y corregir fallos • Naturaleza dinámica de la configuración • Hipótesis del Progreso Finito – Globalmente: Existe al menos 1 proc. preparado, es decir, eventualmente se permitirá la ejecución de algún proceso. – Localmente: Se le permite la ejecución de una sección de código a un proceso por lo que completará su ejecución en un tiempo finito. 2. Sincronización y Exclusión mutua. Corrección Notaciones para expresar ejec. concurrente Propuestas Iniciales: No separan definición proc. de la sincronización. Posteriores Propuestas: Separan conceptos e imponen estructura. Declaración de procesos: Rutinas específicas de programación concurrente Estructura del programa concurrente más clara. Sistemas Estáticos : Nº fijo de procesos/hebras. − − Activación: sólo en la iniciación del programa Ej.: Message Passing Interface (MPI-1). Sistemas Dinámicos: Nº variable de procesos/hebras − − Activación: En cualquier momento de la ejecución Ej.: OpenMP, Java Threads, Parallel Virtual Machine (PVM), MPI-2. 2. Sincronización y Exclusión mutua. Corrección Creación de procesos Creación de procesos no estructurada: FORK-JOIN program P1; ............... fork P2; ............... join P2; ............... program P2; ............... ............... end; Fork: Especifica que la rutina invocada puede comenzar su ejecución. Join: Sincroniza la terminación rutina invocada Ventajas: práctica y potente, Creación dinámica (UNIX) Inconvenientes: no estructuración. Bucles, condicionales, etc. Creación de procesos estructurada: COBEGIN-COEND cobegin S1 | S2 | ... | Sn coend; ⇒ Ejecución concurrente de S1, S2,…, Sn • • • Termina cuando terminen todos los Si Hace explícito qué rutinas van a ejecutarse concurrentemente Estructura: 1 única entrada y 1 única salida Más fácil de entender 2. Sincronización y Exclusión mutua. Corrección Exclusión mutua Asegura que una secuencia de sentencias (sección crítica) se trata como una operación indivisible. A1: Actividad del proceso P1 A1 y A2 se excluyen mutuamente A2: Actividad del proceso P2 − La ejecución de A1 no puede solaparse con la ejecución de A2 − Si ambas intentan ejec. simultáneamente Sólo una avanza, la otra se bloquea. Ej.: Asignación de recursos en S.O. Descripción Abstracta del problema resto pre-protocolo sección crítica (corta) post-protocolo • Aseguran la E.M. • Baja sobrecarga 2. Sincronización y Exclusión mutua. Corrección Sincronización Sincronización Un proceso no debe continuar su ejecución hasta que se cumpla otra condición más general → Sincronizar el proceso con la condición. Generalización de la E.M. − Se pueden usar técnicas similares para la solución Grafo de sincronización: muestra las restricciones de precedencia que determinan cuándo una actividad puede empezar. − − Cada flecha en el grafo es un paso de sincronización. Tiene que ser acíclico. A B C D E F G H I 2. Sincronización y Exclusión mutua. Corrección Propiedades de corrección. Tipos Corrección en Sistemas concurrentes: Las propiedades de corrección se definen en términos de propiedades de sus secuencias de ejecución. − • Propiedades de seguridad (safety): deben cumplirse “siempre”. − “Para todas las posibles ejecuciones de P …………” Requeridas en especificaciones estáticas: “Nunca pasará nada malo” E.M. : 2 procesos nunca entrelazan ciertas subsecuencias de operaciones. Ausencia Interbloqueo (Deadlock): Un programa que no termina siempre realizará trabajo útil. Propiedades de Vivacidad (liveness): deben cumplirse “eventualmente”. − Son propiedades dinámicas difíciles de probar: “Realmente sucede algo” − Ausencia de inanición (starvation): los procesos no son indefinidamente pospuestos. Tipo particular de propiedad de vivacidad : Equidad (fairness): Un proceso que desee progresar debe hacerlo con justicia relativa con respecto a los demás. − Más ligado a la implementación y a veces incumplida: distintos grados 3. Consideraciones sobre el hardware Arquitecturas para programación concurrente • Arquitecturas básicas para programación concurrente Red de interconexión CPU Mem Monoprocesador CPU alterna instrucciones de distintos procesos Paralelismo Virtual CPU CPU CPU CPU Memoria Multiprocesador de memoria compartida Datos comunes CPU CPU CPU Mem Mem Mem Sistema Distribuido • No memoria común • Red de interconexión Paralelismo Real (o híbrido) Mecanismos de implementación de la concurrencia − − Dependen fuertemente de la arquitectura Consideran una máquina virtual que representa un sistema multiprocesador o un sistema distribuido, − proporciona una base homogénea para el sistema de procesos concurrentes. El tipo de paralelismo afecta a la eficiencia pero no a la corrección 3. Consideraciones sobre el hardware Procesadores multinúcleo (multicore) ● ● Arquitectura multicore: cada procesador contiene dos o más núcleos que pueden ejecutar instrucciones de forma simultánea. Multiprocesador en un solo chip: el sistema operativo percibe cada núcleo como procesador independiente. – ● ● ● Teóricamente, paralelismo perfecto. Ventajas: – Menor consumo y mejor disipación calor. – Mejor aprovechamiento multithreading. Ejemplos: AMD Athlon dual core (2), AMD Opteron Barcelona (4), Intel core duo (2), Intel quad core (4), SUN UltraSparc T1 Niagara(8), IBM Cell (8+1), ... Futuro inmediato: Ordenadores basados en esta tecnología y adaptación software al nuevo hardware. Procesadores visibles al Sist. Operativo Thread 1 P Thread 2 P Productividad + 3. Consideraciones sobre el hardware Clusters de ordenadores Conexión de ordenadores mediante red de interconexión: ● Cada ordenador con su memoria local y espacio de direcciones propio ● Red de interconexión: envío/recepción de mensajes. ● El conjunto se ve como un único ordenador ● – ● Ventajas sobre multiprocesador específico ● Disponibilidad a bajo costo de potentes estaciones de trabajo y PCs ● Fácil incorporación de últimos avances en CPUs y redes ● Es posible usar software ya existente o modificarlo Inconveniente: Latencia significativa Red de Interconexión 4. Mecanismos de bajo nivel Sistemas con memoria compartida Mecanismos de bajo nivel en sistemas con memoria común E.M. y sincronización: Los mecanismos dependen de la naturaleza síncrona del hardware. Métodos de sincronización por el procesador − Hacer los procesadores ininterrumpibles. − Sólo para procesadores individuales. Métodos de sincronización por la memoria (almacenamiento) − La memoria puede servir sólo una petición de acceso al mismo tiempo. − mayor rango de aplicabilidad. 4. Mecanismos de bajo nivel Inhibición de interrupciones Interrupciones inhibidas: Se posponen las nuevas interrupciones. Forzar E.M.: hacer ininterrumpible al proceso que ejecuta sección crítica. Ventaja: muy rápido, 1 instrucción máquina Inconvenientes Impide tratar eventos de tiempo real. Evitar S.C. largas. Excluye actividades no conflictivas No esperas en una S.C. Falla en multiprocesadores Seguridad: S.C. anidadas − procedure BeginRegion; { DisableInterrupts } procedure EndRegion; { EnableInterrupts } PROTOCOLOS PARA E.M. E.M. relajada A BeginRegion ……. ……. ……. ……. EndRegion B ……. BeginRegion ……. EndRegion ……. 4. Mecanismos de bajo nivel Cerrojos. Locks Instrucción atómica de sincronización por mem.: TestAndSet - Lee una variable - Le asigna un nuevo valor Cerrojos: Mecanismo de E.M. − Cada región se asocia a un grupo de variables compartidas − atomic function TestAndSet (Lock : Bool) : Bool; {TestAndSet := Lock; Lock := true; /* No importa el valor antiguo */} Asociar un cerrojo con cada grupo. Se necesitan varios cerrojos: Adquirir en orden jerárquico. P1 P2 Bloqueo BeginRegion (L1) BeginRegion (L2) BeginRegion (L2) BeginRegion (L1) S.C. S.C. …. …. type Lock = Boolean; procedure BeginRegion ( var L : Lock); { while TestAndSet(L) do null; } procedure EndRegion ( var L : Lock); { L := false } 4. Mecanismos de bajo nivel Cerrojos. Propiedades Propiedades de los Cerrojos Ventajas Cualquier nº de procesos y procesadores con almacenamiento compartido. Simple y fácil de verificar. Liberal. Inconvenientes Permite inanición: Elección de proceso arbitraria. Usa espera ocupada: afecta a la eficiencia. 4. Mecanismos de bajo nivel Semáforos(Dijkstra, 1965) Mecanismo exitoso Var s: semaphore; // Variable con valores enteros positivos Inicialización: Asignar un entero positivo P(s), wait:: If (s>0) s-- else suspender proceso llamador V(s), signal:: If (Hay algún proceso P suspendido en s) despertar P else s++ Tipos de semáforos – Binarios: Valores 0 ó 1 para implementar Exclusión Mutua – Generales: enteros>=0 para Sincronización de condición E.M. con semáforos Program EjemploMutex Proc. P1 { Var s: semaphore while (true) {P(s); S.C.; V(s); …} } Proc. P1 {…} Proc. P2 {…} Main {s=1;cobegin P1;P2; coend;} Proc. P2 { while (true) {P(s); S.C.; V(s); …} } 4. Mecanismos de bajo nivel Mecanismos en sistemas distribuidos • No existe memoria común: No sincronización por almacenamiento. No monoprocesador : No sincronización por procesador. Paso de mensajes: Mecanismo para: − Transmitir datos (comunicación): Los procesos envían/reciben mensajes en lugar de escribir/leer en variables compartidas − Sincronizar procesos: la recepción de un mensaje es posterior al envío. Ventajas: − Portabilidad: Implementable en cualquier arquitectura ( multiproc, sist. distribuido). − No son necesarios mecanismos de E.M. 4. Mecanismos de bajo nivel Mecanismos en sistemas distribuidos Mecanismos de bajo nivel en sistemas distribuidos • Primitivas básicas − − Envío: send (<lista-expresiones> , <identificador_destino>) Recepción: receive (<lista-variables>, <identificador_fuente>) • Esquema General mensaje Emisor CANAL Receptor 4. Mecanismos de bajo nivel Esquemas de identificación Esquemas de Identificación en la comunicación ¿Cómo identifica el emisor al receptor del mensaje y viceversa? Dos posibilidades: – Denominación directa: Emisor identifica explícitamente al receptor y viceversa Se utilizan los identificadores de los procesos – Denominación indirecta: Los mensajes se depositan en almacenes intermedios que son globales a los procesos (buzones). 4. Mecanismos de bajo nivel Esquemas de identificación. Denominación Directa Denominación Directa Ventajas: − No hay retardo para establecer la identificación Process P1 Process P2 {dato:integer; {dato:integer; Produce (dato); receive (dato , P1); send (dato , P2);} Consume (dato);} Inconvenientes − Cambios en la identificación requiere Recompilar − Sólo enlaces 1-1 P1 P2 Existen esquemas asimétricos − emisor identifica al receptor, pero el receptor no indica emisor Receive (dato, Id): En Id se devuelve el emisor del mensaje recibido. 4. Mecanismos de bajo nivel Esquemas de identificación. Denominación Indirecta CHANNEL OF INT Buzón Denominación Indirecta Flexibilidad: permite comunic. varios procs. Declaración estática/dinámica: − Estática: fija fuente/destino en tiempo de compilación. − • Process P1 Process P2 {dato:integer; {dato:integer; Produce (dato); receive (dato , Buzón); send (dato , Buzón);} Consume (dato);} No apropiada en entornos cambiantes. Buzón P1 P2 Dinámica: + potente pero – eficiente Tipos Canales (1 a 1) P1 A P2 P1 B P2 • Tipo fijo Buzones generales (n a n) P1 P2 B Puertos (n a 1) P3 P1 P4 P2 • Destino: send de cualquier proc. • Fuente: receive de cualquier proc. • Implementación complicada. •Enviar mensaje y transmitir todos los lugares. •Recibir mensaje y notificar recepción a todos. B P3 • Destino: send de cualquier proc. • Fuente: receive de un proc. • Implementación más sencilla. 4. Mecanismos de bajo nivel Sincronización en sistemas distribuidos Sincronización Coincidencia temporal emisor/receptor: com. síncrona/asíncrona Paso de mensajes Síncrono: emisor se bloquea hasta receptor listo y viceversa. − Intercambio de mensaje: punto de sincronización emisor/receptor. El emisor podrá hacer aserciones acerca del estado del receptor. − Análogo: com. telefónica y chat. cita entre ambos. − Sentencias bloqueantes: pueden retardar al invocador. − Más fáciles de implementar pero menos flexibles. send (A,m) send (A,m) Proceso A Proceso A Cita Cita Proceso B espera receive(A,m) espera Proceso B receive(A,m) 4. Mecanismos de bajo nivel Sincronización en sistemas distribuidos (2) – Paso de mensajes Asíncrono: Llamadas no bloqueantes Existe Buffer para almacenar los mensajes Send nunca retrasa. Análogo: Correo electrónico y foro. send (A,m) Proceso A Buffer Proceso B receive(A,m) 4. Mecanismos de bajo nivel Sincronización en sistemas distribuidos(3) • Send con buffer lleno Receive con buffer vacío • Retrasar send hasta que haya espacio • Devolver código al invocador. (Chequeo) • Retrasar receive: es lo más frecuente • Devolver código. Simulación esquema síncrono con operaciones asíncronas Process P1 Process P2 {dato:integer; {dato:integer; send (P2 , dato); receive (P2,confimación)} receive (P1 , dato); send (P1,confimación)} Combinaciones: − Envío-recepción bloqueantes/no bloqueantes, − Envío NO bloq.-recepción bloq.: muy útil que emisor pueda continuar después del envío. Recepción no bloqueante con tiempo de espera: Útil para evitar inanición 5. Algoritmos de Exclusión mutua Introducción Existen soluciones hardware 1965 : Aparecen soluciones software − − Sucesión de soluciones + mejoras (eficiencia, calidad) Valor didáctico: Propiedades de los algoritmos concurrentes Tipos de algoritmos − Centralizados (para arquitecturas con memoria compartida) − Variables de estado + variable/s crítica/s (compartida/s) + Espera ocupada Nos centraremos en este tipo Distribuidos (para arquitecturas distribuidas) Soluciones para : Distribuir soluciones centralizadas Variables de estado + paso de mensajes (no hay variables compartidas) Equidad: propiedad de la implementación → Evita inanición 5. Algoritmos de Exclusión mutua Solución con variable compartida y espera ocupada Espera ocupada: Enfoque para conseguir exclusión mutua − − − Procesos esperan a la entrada de región hasta continuación segura. Utilizan recursos computacionales sin ningún progreso (p.e. ejecutando continuamente un bucle vacío). No cambian si no hay otro trabajo a realizar durante espera. VAR MutEx : Boolean = false; proc BeginRegion; {while MutEx do nothing; MutEx = true;} proc EndRegion; {MutEx = false;} • Sincronización por almacenamiento • Falla propiedad de seguridad 5. Algoritmos de Exclusión mutua Refinamiento sucesivo de Dijkstra Condiciones que ha de verificar un solución correcta – – Dijkstra (1965) : Condiciones + pasos didácticos (prop. patológicas) Derivación por refinamiento sucesivo del Algoritmo de Dekker iii. No suposición acerca nº instrucciones o nº de procs. soportados – – Excepto que instrucciones básicas tienen ejecución atómica. Ejecución simultánea 2 insts. → Ejecución secuencial orden conocido • No suposición acerca velocidad entre competidores: • Un proc. en S. no C. no puede evitar que otro entre en su S.C. • Alcanzabilidad (No interbloqueo): – • excepto que NO es cero. Los procs. requiriendo acceso a S. C. no pueden ser indefinidamente retrasados. 5. Algoritmos de Exclusión mutua Refinamiento sucesivo de Dijkstra. Etapa 1 1ª Etapa • Garantiza E.M. • No garantiza iii). – Alternancia • • Procs. sólo pueden entrar en sucesión Procesos con tasas de utilización dispares. Variables Compartidas VAR turn:{0,1} = 0 ó 1 Protocolo para Pi: While (turn!=i) do nothing; <sección crítica> turn=j; Solución • Propuesta de Solución – No garantiza E.M. Protocolo para Pi: turn=i; While (turn!=i) do nothing; <sección crítica> turn=j; 5. Algoritmos de Exclusión mutua Refinamiento sucesivo de Dijkstra. Etapa 2 2ª Etapa • Problema 1ª etapa – – Almacena el nº del proc. que debe entrar. Debe almacenar info. de estado para decidir • – flag[i]=true → Pi en S.C. No garantiza E.M. • • Si Pi y Pj avanzan simultáneamente No satisface ii): depende de la velocidad Variables Compartidas VAR flag:boolean [0..1] = false; Protocolo para Pi: While (flag[j]) do nothing; flag[i]=true; <sección crítica> flag[i]=false; 5. Algoritmos de Exclusión mutua Refinamiento sucesivo de Dijkstra. Etapa 3 3ª Etapa • • Problema 2ª etapa – Pi puede comprobar flag[j] antes de que Pj lo modifique Solución: – Intercambio 2 primeras líneas • Garantiza E.M. • No garantiza iv) – Variables Compartidas VAR flag:boolean [0..1] = false; Protocolo para Pi: flag[i]=true; While (flag[j]) do nothing; <sección crítica> flag[i]=false; Si Pi y Pj avanzan simultáneamente → Interbloqueo 5. Algoritmos de Exclusión mutua Refinamiento sucesivo de Dijkstra. Etapa 3 4ª Etapa • Problema 3ª etapa – Cuando Pi fija su estado, no conoce estado de Pj. • Solución: Pi pone flag[i] a true para indicar intención de entrar. • No garantiza iv) ni ii) • Conclusión: – – – Si Pi y Pj avanzan simultáneamente : Interbloqueo No basta con el estado de los procs. Hace falta turno. Variables Compartidas VAR flag:boolean [0..1] = false; Protocolo para Pi: flag[i]=true; While (flag[j]) {flag[i]=false; while flag[j] do nothing; flag[i]=true;} <sección crítica> flag[i]=false; 5. Algoritmos de Exclusión mutua Algoritmo de Dekker Algoritmo de Dekker Variables Compartidas VAR flag: boolean [0..1] = false; turn: {0,1} = 0 ó 1 /* Establece cortesía*/ Protocolo para Pi: flag[i]=true; While (flag[j]) { if (turn==j) {flag[i]=false; while (turn==j) do nothing; flag[i]=true;} } <sección crítica> turn=j; flag[i]=false; 5. Algoritmos de Exclusión mutua Algoritmo de Dekker. Excl. mutua Prueba de corrección. E.M. • • • No utiliza instrucciones especiales – Respeta ii) Demostrar manteniendo ii) – – ¿Garantiza E.M.? ¿Alcanzabilidad? E.M. – – – – – Protocolo para Pi: flag[i]=true; While (flag[j]) { if (turn==j) { flag[i]=false; while (turn==j) do nothing; flag[i]=true; } } <sección crítica> turn=j; flag[i]=false; Pi en S.C. → flag[j]=false. Sólo Pi modifica flag[i]. Pi comprueba flag[j] sólo cuando flag[i]=true. Pi en S.C. → (flag[i]=true → flag[j]=false). (Pi en S.C) y (Pj en S.C.) → Falso : ABSURDO 5. Algoritmos de Exclusión mutua Algoritmo de Dekker. Alcanzabilidad Prueba de Alcanzabilidad • Caso A: Único Pi desea entrar → Encuentra flag[j]=false y entra • Caso B: P0 y P1 desean entrar (turn=0) • B.1.: P1 encuentra flag[0]=false → Entra • B.2.: P1 encuentra flag[0]=true → turn=0 – – – – Pasa a bucle interno y pone flag[1]=false P0 encuentra flag[1]=true → turn=0 Sigue en bucle externo hasta flag[1]=false P0 entra antes que P1 Protocolo para Pi: flag[i]=true; While (flag[j]) { if (turn==j) { flag[i]=false; while (turn==j) do nothing; flag[i]=true; } } <sección crítica> turn=j; flag[i]=false; 5. Algoritmos de Exclusión mutua Algoritmo de Dekker. No inanición Prueba de Inanición • • • • • • Existe escenario de inanición Depende hardware – Prioridad escritura sobre lectura memoria P1 rápido y repetitivo||P0 en bucle interno P1 sale de S.C. → pone turn=0 P0 encuentra turn≠1 → Sale bucle interno P1 pone flag[1]=false – – – Vuelve flag[1]=true Encuentra flag[0]=false Entra en S.C. → Impide a P0 poner flag[0]=true • Acceso a flag[0] en E.M. Protocolo para Pi: flag[i]=true; While (flag[j]) { if (turn==j) { flag[i]=false; while (turn==j) do nothing; flag[i]=true; } } <sección crítica> turn=j; flag[i]=false; 5. Algoritmos de Exclusión mutua Generalización a N procesos. Alg. De Dijkstra Algoritmo de Dijkstra para N procesos (1965) Variables Compartidas VAR flag : array[0..n-1] of (passive, requesting, in_cs); /* inic. a passive */ turn : 0..n-1; Protocolo para Pi ( i=0..n-1) var j:0..n-1; /*Variable local*/ repeat { flag[i] = requesting; while (turn != i) if flag[turn] = passive then turn = i; flag[i] = in_cs; j = 0; while (j < n) and (j = i or flag[j] != in_cs) j++} until j = n; /* Ahora se cumple: (flag[j] ≠ in_cs, para todo j≠i) y flag[i]=in_cs */ testd(i) <sección crítica> flag[i] = passive; 5. Algoritmos de Exclusión mutua Algoritmo de Dijkstra. Excl. mutua Prueba de corrección. E.M. • Pi sólo puede entrar si testd(i) – (flag[j]≠in_cs, para todo j≠i) y (flag[i]=in_cs) • Sólo Pi puede poner flag[i]=in_cs • Sólo se comprueban los flag[...] después de asignar Protocolo para Pi ( i=0..n-1) var j:0..n-1; /*Variable local*/ repeat { flag[i] = requesting; while (turn != i) if flag[turn] = passive then turn = i; flag[i] = in_cs; until testd(i); <sección crítica> flag[i] = passive; • Sólo Pi puede entrar a su S.C. 5. Algoritmos de Exclusión mutua Algoritmo de Dijkstra. Alcanzabilidad • • • • Prueba de corrección. Alcanzabilidad Pi intenta entrar → flag[i]≠passive flag[i] == in_cs no implica turn=i Varios Pi entran simult. bucle interno – – Ponen turn=i (el último turn=k) Ponen flag[i]=in_cs Los que lleguen después – – – flag[turn]≠passive No se asignan turn Se quedan en primer bucle Protocolo para Pi ( i=0..n-1) var j:0..n-1; /*Variable local*/ repeat { flag[i] = requesting; while (turn != i) if flag[turn] = passive then turn = i; flag[i] = in_cs; until testd(i); <sección crítica> flag[i] = passive; • • Todos Pi abandonan 2º bucle interno: No cumplen testd(i) – – Pi (i≠k) ponen flag[i]=requesting y vuelven al primer bucle interno Pk vuelve bucle externo y al 2º bucle interno (turn=k) Pk único con flag[k]=in_cs → Pk entra en S.C. 5. Algoritmos de Exclusión mutua Algoritmo de Dijkstra. Inanición? Prueba de corrección. Inanición Varios Pi piden entrar S.C. constantemente – – Puede que siempre sea el mismo el último en hacer turn=i No evita el peligro de inanición Condición Adicional Solución (v) Un proceso que intente entrar en su sección crítica será capaz de hacerlo en un tiempo finito. Otra Formulación – – Debe un límite en el nº de veces que otros procesos pueden entrar en S.C. entre el momento en que un proc. hace su petición para entrar en su propia S.C. y el momento en que realmente entra. Tiempo máximo de espera =f(número de veces). 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para 2 procesos Algoritmo de Peterson Versión para 2 procesos Variables Compartidas flag : array[0..1] of boolean; /* inicializado a false */ turn : 0..1; /* resuelve conflictos de simultaneidad */ Protocolo para Pi ( i=0,1; j=(i+1) mod 2 ) flag[i] = true; turn = i; while (flag[j] and turn==i) do; <sección crítica> flag[i] = false; 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para 2 procesos (2) Prueba de corrección. E.M. Supongamos P0 y P1 en S.C. flag[0]=flag[1]=true Condiciones no pueden ser falsas al mismo tiempo Uno de ellos, Pi, entró primero Encontró turn=j Pj no puede entrar, turn=j lo impide Variables Compartidas flag : array [0..1] of boolean; turn : 0..1; Protocolo para Pi flag[i] = true; turn = i; while (flag[j] and turn==i) do; <sección crítica> flag[i] = false; 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para 2 procesos (3) Prueba de corrección. Alcanzabilidad + Equidad Suponer P0 esperando continuamente • P1 sale de S.C. • • P1 esperando entrar • • flag[1]=false → P0 entra a S.C. IMPOSIBLE: Pturn debe entrar P1 monopoliza acceso a S.C. • P1 pone turn=1 al intentar entrar de nuevo → P0 entra a S.C. Variables Compartidas flag : array [0..1] of boolean; turn : 0..1; Protocolo para Pi flag[i] = true; turn = i; while (flag[j] and turn==i) do; <sección crítica> flag[i] = false; 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos Algoritmo de Peterson para N procesos Generalización: Iterar solución para 2 procs., eliminando 1 proc. cada vez. Variables Compartidas flag : array[0..N-1] of -1..n-2; /* inicializada a –1 */ turn : array[0..N-2] of 0..n-1; /* inicializada a 0 */ Protocolo para Pi ( i=0,...,N-1) j:0..N-2; /* variable local indicando la etapa */ for j = 0 to N-2 {flag[i] = j; turn[j] = i; while [(∃ k ≠ i : flag[k] ≥ j) ∧ (turn[j] == i)] do; } <sección crítica> flag[i] = -1; -1 ⇒ Pi no ha entrado en su protocolo de entrada. j>=0 ⇒ Pi está en la j-ésima etapa del protocolo. Pi1 precede a Pi2 ⇔ flag[i1]>flag[i2]. 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos (2) Lema 1. Un proc. que precede a todos los demás puede avanzar al menos 1 etapa. Demostración: Supongamos Pi llega a bucle interno y se verifica: (No ∃ k ≠ i : flag[k] ≥ j) (1) • (1) se mantiene ⇒ Pi puede avanzar a etapa j+1. • (1) deja de ser cierta ⇒ algún Pr hace flag[r]←j. En cuanto, turn[j]=r ⇒ Pi podría continuar. Pi ( i=0,...,N-1) for j = 0 to N-2 {flag[i] = j; turn[j] = i; while [(∃ k ≠ i : flag[k] ≥ j) ∧ (turn[j] == i)] do;} <sección crítica> flag[i] = -1; Si más de un proceso adicional se une a etapa j, Pi podría ser adelantado. 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos (3) Lema 2. Cuando un proceso avanza de la etapa j a la etapa j+1, se mantiene exactamente una de las siguientes condiciones: (a) el proceso precede a todos los demás procesos, o (b) el proceso no está solo en la etapa j. Nota: "Pi avanza una etapa" se refiere al instante de almacenar nuevo valor en flag[i]. Demostración: Si Pi está a punto de avanzar flag[i]. Entonces ocurre una de estas cosas: Se cumple (1) ⇒ (a), o turn[j] ≠ i ⇒ Pi no último en etapa j ⇒ ∃ Pr tal que turn[j]=r ⇒ (b). 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos (4) Lema 3. Si hay (al menos) dos procesos en la etapa j, habrá (al menos) un proceso en cada etapa k, 0 ≤ k ≤ j-1. Demostración: Inducción sobre j. (j=0): Condición nula. (j=1): Si hay al menos 2 procs. en etapa 1, el último que entrara en la etapa tuvo que dejar, por Lema 2, a otro en etapa 0. (j → j+1)?: Supongamos al menos 2 procesos en etapa j+1, cuando el último se unió, por Lema 2, había al menos 2 procs. en etapa j. Por la hipótesis de inducción, las etapas precedentes estaban ocupadas y, por Lema 2, estas etapas no pudieron haber sido desocupadas desde entonces. 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos (4) Lema 4. El número máximo de procs. en etapa j es n-j, 0<=j<=n-2. Demostración: Supongamos hay al menos dos procesos en etapa j. Por Lema 3, las etapas 0 hasta j-1 contienen al menos un proceso por lo que podría haber n-j como máximo en la etapa j. Si alguna de estas etapas estuviera vacía, el Lema 3 implica que como máximo hay un proceso en la etapa j. 5. Algoritmos de Exclusión mutua Algoritmo de Peterson para N procesos. Corrección Prueba de corrección. Algoritmo de Peterson Exclusión Mútua La etapa n-2 contiene como mucho 2 procesos (Lema 4). Si hay sólo uno allí, y otro está en su S.C., Lema 2 dice que no puede avanzar para entrar en su S.C.. Cuando la etapa n-2 contiene 2 procs., no hay ninguno en la etapa n-1 (S.C.), y uno de los 2 puede entrar. Para el proc. que queda no se cuple condición del bucle interno. Alcanzabilidad Siempre existirá un proc. que precede a todos los demás → puede avanzar por Lema 1 o está acompañado en la etapa ocupada más alta → si no fue el último en entrar, avanzará. Equidad Si un proceso intenta continuamente avanzar, en el peor de los casos, el número máximo de turnos que tiene que esperar sería: d(N)=N(N-1)/2.