Descargar la presentación
La descarga está en progreso. Por favor, espere
1
SINCRONIZACIÓN DE PROCESOS
2
SINCRONIZACIÓN DE PROCESOS
Un proceso cooperativo es uno que puede afectar o ser afectado por los demás procesos que se ejecutan en el sistema. Los procesos cooperativos podrían compartir directamente un espacio de direcciones lógico (es decir, tanto código como datos), o bien compartir datos únicamente a través de archivos. El primer caso se lleva a la práctica mediante procesos ligeros o hilos El acceso concurrente a datos compartidos puede dar pie a inconsistencia de los datos. La sincronización de procesos se refiere a diversos mecanismos que aseguran la ejecución ordenada de procesos cooperativos que comparten un espacio de direcciones lógico, con el fin de mantener la consistencia de los datos.
3
Revisión El modelo del buffer limitado de un sistema que consiste en varios procesos secuenciales cooperativos ejecutados asincrónicamente y con posible datos compartidos La solución vista permite a n- 1 elementos en buffer al mismo tiempo si queremos remediar esta deficiencia podríamos modificar el algoritmo añadiendo una variable entera contador, con O como valor inicial Se incrementa este contador cada vez que se agrega un nuevo elemento al buffer, y se decrementa cuando se saca un elemento
4
Solución para n elementos
Productor: repeat producir un elemento en sigp …… while contador := n do nada; buffer[entra] := sigp; entra :=entra+ 1 mod n; contador:= contador+ 1; until false;
5
Solución para n elementos (cont)
Consumidor: repeat while contador = 0 do nada; sigc := buffer[sale]; sale :=sale+ 1 mod n; contador := contador- 1; consumir el elemento que está en sigc ……. until false;
6
Condición de Competencia (race condition)
Aunque ambas rutinas son correctas por separado, pero podrían no funcionar correctamente si se les ejecuta de manera concurrente. Como ilustración, supongamos que el valor de la variable contador actualmente es 5, y que los procesos productor y consumidor ejecutan los enunciados «contador := contador+ 1" y "contador:= contador- 1" de forma concurrente Después de la ejecución de estos dos enunciados ¡el valor de la variable contador puede ser 4, 5 o 6! El único resultado correcto es contador = 5, que se genera correctamente si el productor y el consumidor se ejecutan por separado. El estado incorrecto se produce porque ambos procesos manipulan la variable contador de forma concurrente. Una situación como ésta, en la que varios procesos acceden a, y manipulan, los mismos datos de forma concurrente y el resultado de la ejecución depende del orden en que haya ocurrido el acceso, se denomina condición de competencia (race condition).
7
Problema de la Sección Crítica
Cada proceso tiene un segmento de código, llamado sección crítica, en la que el proceso podría estar modificando variables comunes, actualizando una tabla, escribiendo un archivo, etc. El problema de la sección crítica consiste en diseñar un protocolo que los procesos puedan usar para cooperar pues cuando un proceso se está ejecutando en su sección crítica, ningún otro proceso puede ejecutarse en ella Repeat sección de ingreso sección crítica sección de egreso 1 sección restante until fa/se;
8
Problema de la Sección Crítica (cont)
La solución debe satisfacer tres requisitos: Mutua exclusión: Si el proceso Pi se está ejecutando en su sección crítica, ningún otro proceso puede estarse ejecutando en su sección crítica. Progreso: Si ningún proceso se está ejecutando en su sección crítica y hay procesos que desean ingresar en sus secciones críticas, sólo aquellos procesos que no se estén ejecutando en su sección restante podrán participar en la decisión de cuál proceso será el siguiente en ingresar en su sección crítica, y esta selección no podrá posponerse indefinidamente. Espera limitada: Hay un límite para el número de veces que se permite a otros procesos ingresar en sus secciones críticas después de que un proceso ha solicitado ingresar en su sección crítica y antes de que se le otorgue la autorización para hacerlo.
9
Dos Procesos: Algoritmo 1
repeat while turno <> i do nada; sección crítica turno := j; sección restante until false; La. solución asegura que sólo un proceso a la vez podrá estar en su sección crítica. No satisface el requisito de progreso, ya que requiere una alternación estricta de los procesos en la ejecución de la sección crítica SI turno = j y Pi esta listo para ingresar en su sección crítica, Pi no podrá hacerlo aunque esté en su sección restante.
10
Dos Procesos: Algoritmo 2
Para solucionar el problema del algoritmo 1 que sólo recuerda cuál proceso tiene permiso de ingresar en su sección crítica, podemos sustituir la variable turno por el siguiente arreglo: var indicador: array [0 .. 1] of boolean; Asi: indicador[i] := false; repeat indicador[i] := true; while indicador[j] do nada; sección crítica sección restante until False; En esta solución se satisface el requisito de mutua exclusión, pero no el de progreso.
11
Dos Procesos: Algoritmo 3
var indicador: array[0 .. 1] of boolean; turno: ; repeat indicador[i] := true; turno:= j; while (indicador[j] and turno = j) do nada; sección crítica indicador[i] := false; sección restante until False; Este algoritmo satisface la mutua exclusión, el progreso y la espera limitada.
12
Múltiples Procesos var escogiendo: array [0 .. n- 1] of boolean;
número: array [0 .. n- 1] of integer; repeat escogiendo[i] := true; número[i] := máx(número[0], número[1], ... , número[n- 1]) + 1; escogiendo[i] := False; for j := 0 to n – 1 do begin while escogiendo[j] do nada; while número[j] <> 0 and (número[j],j) < (número[i],i) do nada; end; sección crítica número[i] :=o; sección restante until false;
13
Hardware de Sincronización
El problema de la sección crítica se podría resolver fácilmente en un entorno uniprocesador si pudiéramos prohibir las interrupciones mientras se esta modificando una variable compartida. Esta solución no es factible en un entorno multiprocesador. La desactivación de interrupciones en un multiprocesador puede requerir mucho tiempo, mientras se envía el mensaje a todos los procesadores Por lo anterior, muchas máquinas cuentan con instrucciones de hardware especiales que nos permiten determinar , modificar o intercambiar el contenido de una palabra o dos palabras, atómicamente. Ej.: (Test-and-Set, TAS function Evaluar-y-Asignar (var objetivo: boolean): boolean; begin Evaluar-y-Asignar := objetivo; objetivo := true; end
14
Mutua Exclusión con Evaluar-y-Asignar.
repeat while Evaluar-y-Asignar(cerradura) do nada; sección crítica cerradura := false; sección restante until false;
15
Mutua Exclusión con Intercambiar
Se declara una variable booleana global cerradura y se le asigna el valor inicial false. Además, cada proceso tiene una variable booleana local llave var esperando: array [0 .. n- 1] of boolean; cerradura: boolean; procedure Intercambiar (var a, b: boolean); var temp: boolean; begin temp :=a; a:= b; b := temp; end;
16
Mutua Exclusión con Intercambiar (cont)
repeat llave := true; Intercambiar( cerradura ,llave); until llave := false; sección crítica cerradura := false; 1 sección restante until false; El proceso Pi puede ingresar en su sección crítica sólo si esperando[i] =false o bien llave = false. Llave sólo puede asumir el valor false si se ejecuta la Evaluar-y-Asignar
17
Mutua Exclusión y Espera Limitada con Evaluar-y-Asignar
var j: 0.. n- 1; llave: boolean; repeat esperando[i] := true; llave := truc; while esperando[i] and llave do llave:= Evaluar-y-Asignar(cerradura); esperando[i] := false; sección crítica j := i + 1 mod n; while (j ( i) and (not esperando[j]) do j := j+ 1 mod n; if j = i then cerradura := false else esperando[j] := false; sección restante until false;
18
Semáforos Son una herramienta de sincronización
Un semáforo S es una variable entera con un valor inicial, sólo puede accederse a través de dos operaciones atómicas estándar: espera (wait) y señal (signal). espera(S): while S <= 0 do nada; S:= S -1; señal(S): S := S + 1; Todos los procesos comparten un semáforo, mutex (mutua exclusión) que recibe como valor inicial 1 repeat espera(mutex); 1 sección crítica señal(mutex); 1 sección restante until false;
19
Implementación de Semáforos
Si un proceso ejecuta la operación espera y se encuentra con que el valor del semáforo no es positivo, deberá esperar. Una alternativa a la espera es que el proceso se bloquee. La operación de bloqueo coloca un proceso en una cola de espera asociada al semáforo, y el proceso cambia al estado "en espera« Luego, se transfiere el control al planificador de la CPU, el cual selecciona otro proceso para ejecutar. Un proceso que está bloqueado, esperando un semáforo S, deberá reiniciarse cuando algún otro proceso ejecute una operación señal El proceso se reinicia con una operación despertar, que cambia el estado del proceso, de "en espera" a "listo". A continuación, el proceso se coloca en la cola de procesos listos. (La CPU podría o no conmutarse del proceso en ejecución al proceso que ahora está listo, dependiendo del algoritmo de planificación de la CPU.)
20
Implementación de Semáforos (cont)
type semáforo = record valor: integer; L: list of proceso; end; Operaciones: espera(S): S. valor:= S. valor- 1; if S. valor < O then begin agregar este proceso a S.L; bloquear; señal(S): S. valor:= S.valor + 1; if S. valor <=0 then begin quitar un proceso P de S.L; despertar(P);
21
Implementación de Semáforos (cont)
La lista de procesos que esperan se puede implementar fácilmente con un campo de enlace en cada bloque de control de proceso (PCB). Cada semáforo contiene un valor entero y un apuntador puntero a una lista de PCB. Una forma de añadir procesos a la lista, y retirarlos de ella, que asegura la espera limitada, sería utilizar una cola de primero que entra, primero que sale (FIFO), el semáforo contendría apuntadores punteros tanto a la cabeza como al final de la cola. En general, la lista puede utilizar cualquier estrategia de colas. El aspecto crítico de los semáforos es que se ejecuten atómicamente. Debemos garantizar que dos procesos no puedan ejecutar operaciones espera y señal para el mismo semáforo al mismo tiempo Esta situación es un problema de sección crítica
22
Bloqueos Mutuos e Inanición
La implementación de un semáforo con una cola de espera puede crea una situación en la que dos o más procesos esperan indefinidamente la ocurrencia de operación señal por parte de uno de estos procesos Se dice entonces procesos se bloquean mutuamente Po P1 espera( S); espera(Q); espera(Q); espera(S); señal( S); señal(Q); señal(Q); serial(S); Otro problema relacionado con los bloqueos mutuos es el bloqueo indefinido o inanición, una situación en la que procesos esperan indefinidamente dentro del semáforo.
23
Semáforos Binarios Un semáforo binario es uno cuyo valor binario sólo puede variar entre 0 y 1 Un semáforo S de conteo términos de semáforos binarios: var S1: semáforo-binario; S2: semáforo-binario; C: integer; Operaciones para el semáforo de conteo S Operación espera Operación señal espera( S1); espera(S1); C:= C -1; C:= C+ 1; if C< 0 then begin if C<= 0 then señal(S2) señal(Sl); else señal(Sl); espera( S2); end señal(S1);
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.