SlideShare una empresa de Scribd logo
1 de 10
Descargar para leer sin conexión
Sincronización de Procesos

                                                                                                                                           Fundamentos
        Sincronización de Procesos                                                                                                         El Problema de la Sección Crítica
                                                                                                                                           La Solución de Peterson y otras
                                                                                                                                           Hardware de Sincronización
                                                                                                                                           Semáforos
                                      Módulo 6                                                                                             Problemas Clásicos de Sincronización
                                                                                                                                           Monitores
                                                                                                                                           Ejemplos de Sincronización

                  Departamento de Ciencias e Ingeniería de la Computación
                               Universidad Nacional del Sur

                                                                                                                  JRA © 2009                        Sistemas Operativos – Sincronización de Procesos




                                       Fundamentos                                                                                                      El Problema

             El acceso concurrente a datos compartidos puede                                                                   Productor                         contador = 4                          Consumidor
             resultar en inconsistencias.
                                                                                                                                    :                                                                      :
             Mantener la consistencia de datos requiere mecanismos                                                                  :                                                                      :
                                                                                                                                    :                                                                      :
             para asegurar la ejecución ordenada de procesos                                                                        :                                                                      :
             cooperativos.
             La solución con memoria compartida al problema del                                                          contador:= contador+1;
                                                                                                                            t d        t d +1                                                     contador:= contador-1;
                                                                                                                                                                                                     t d        t d 1
             buffer limitado (módulo anterior) permite a lo sumo n – 1
             items en el buffer al mismo tiempo. Una solución, donde                                                                :                                                                       :
                                                                                                                                    :                                                                       :
             todos los N buffers son usados, no es simple.                                                                          :                                                                       :
                                                                                                                                    :                                                                       :
                 Supóngase que se modifica el código del productor-
                 consumidor agregando una variable contador,
                 inicializado a 0 e incrementado en cada momento                                                                                                 contador = 4
                 que un nuevo item es agregado al buffer
                                                                                                                       Luego de una operación de Productor y otra de
                                                                                                                       Consumidor … contador permanece invariante
JRA © 2009                            Sistemas Operativos – Sincronización de Procesos                            JRA © 2009                        Sistemas Operativos – Sincronización de Procesos




                                          El Problema                                                                                                   El Problema
               Productor                                                                     Consumidor                           P1                             a=b=1                                     P2
                     :                                                                            :
                     :                                                                            :                                 :                                                                      :
                     :                                                                            :                                 :                                                                      :
                     :                                                                            :                                 :                                                                      :
                                                                                                                                    :                                                                      :

              rega ← contador
                     contador                                                             regb ← contador
                                                                                                                                 a:= a+1;
                                                                                                                                        ;                                                                a
                                                                                                                                                                                                         a:= 2 * a;
              rega ← rega+1
                         a +1
             contador:= contador+1;                                                       regb ← regb - 1
                                                                                         contador:= contador-1;                  b:= b+1;                                                                b:= 2 * b;
              contador ← regaa
              contador ← reg                                                              contador ← regb                           :                                                                       :
                                                                                                                                    :                                                                       :
                                                                                                                                    :                                                                       :
                     :                                                                             :                                :                                                                       :
                     :                                                                             :
                     :                                                                             :
                     :     rega= 5                                                 regb= 3         :
                                                                                                                                                                 a=b=4

                                                               4
                                                    contador = 5
                                                               3
                                                                                                                     Luego de la ejecución de P1 seguida de P2 los valores de a y b deben ser iguales entre sí

JRA © 2009                            Sistemas Operativos – Sincronización de Procesos                            JRA © 2009                        Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                                                                           1
El Problema                                                                               El Problema

                                             a=b=1                                                                     A sig(A)                   B sig(B)                 C sig(C)
                    P1                                                             P2
                     :                                                              :
                                                                                                       L
                     :                                                              :
                     :                                                              :
                     :                                                              :

                  a:= a+1;
                         ;                                                        a:
                                                                                  a:= 2 * a;                D sig(D)                            E sig(E)
                  b:= b+1;                                                        b:= 2 * b;
                     :                                                               :
                     :                                                               :
                     :                                                               :
                     :                                                               :                       :                                    :

                                                                                                        sig(D) ← L                         sig(E) ← L
                                          a=4,b=3
                                                                                                          L ←D                               L ←E

  Luego de la ejecución de P1 y P2 los valores de a y b deberían ser iguales                                 :                                    :
  entre sí, pero no lo son.

JRA © 2009                    Sistemas Operativos – Sincronización de Procesos                 JRA © 2009               Sistemas Operativos – Sincronización de Procesos




                                  El Problema                                                                               El Problema
                             A sig(A)                   B sig(B)                 C sig(C)                              A sig(A)                   B sig(B)                 C sig(C)
        L                                                                                              L



             D sig(D)                                  E sig(E)                                             D sig(D)                             E sig(E)



              :                                         :                                                    :                                    :

         sig(D) ← L                              sig(E) ← L                                             sig(D) ← L                         sig(E) ← L
           L ←D                                    L ←E                                                   L ←D                               L ←E

              :                                         :                                                    :                                    :


JRA © 2009                    Sistemas Operativos – Sincronización de Procesos                 JRA © 2009               Sistemas Operativos – Sincronización de Procesos




                                  El Problema                                                                               El Problema
                             A sig(A)                   B sig(B)                 C sig(C)                              A sig(A)                   B sig(B)                 C sig(C)
        L                                                                                              L



             D sig(D)                                  E sig(E)                                             D sig(D)                             E sig(E)



              :                                         :                                                    :                                    :

         sig(D) ← L                              sig(E) ← L                                             sig(D) ← L                         sig(E) ← L
           L ←D                                    L ←E                                                   L ←D                               L ←E

              :                                         :                                                    :                                    :


JRA © 2009                    Sistemas Operativos – Sincronización de Procesos                 JRA © 2009               Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                                      2
El Problema                                                                               El Problema
                        A sig(A)                    B sig(B)                 C sig(C)                              A sig(A)                   B sig(B)                 C sig(C)
        L                                                                                       L



             D sig(D)                              E sig(E)                                           D sig(D)                               E sig(E)



              :                                     :                                                  :                                      :

         sig(D) ← L                          sig(E) ← L                                          sig(D) ← L                            sig(E) ← L
           L ←D                                L ←E                                                L ←D                                  L ←E
              :                                     :                                                  :                                      :


JRA © 2009                Sistemas Operativos – Sincronización de Procesos              JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                              El Problema                                                                        Condición de Carrera
                        A sig(A)                    B sig(B)                 C sig(C)
        L
                                                                                                     Condición de carrera – Es la situación donde varios
                                                                                                     procesos acceden y manejan datos compartidos
                                                                                                     concurrentemente. El valor final de los datos
                                                                                                     compartidos depende de que proceso termina último.
             D sig(D)                              E sig(E)
                                                                                                     Para prevenir las condiciones de carrera , los
                                                                                                     procesos concurrentes cooperativos deben ser
              :                                     :                                                sincronizados.
         sig(D) ← L                          sig(E) ← L
           L ←D                                L ←E

              :                                     :


JRA © 2009                Sistemas Operativos – Sincronización de Procesos              JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                  Problema de la Sección Crítica                                                     Solución al Problema de la Sección Crítica
                                                                                             1. Exclusión Mutua. Si el proceso Pj está ejecutando en su sección
                                                                                                crítica, entonces ningún otro proceso puede estar ejecutando en
             n procesos todos compitiendo para usar datos                                       sus secciones críticas.
             compartidos                                                                     2. Progreso. Si ningún proceso está ejecutando en su sección crí-
                                                                                                tica y existe algunos procesos que desean entrar en sus secciones
             Cada proceso tiene un segmento de código                                           criticas, entonces la selección de procesos que desean entrar en la
             llamado sección crítica, en la cual los datos                                      sección crítica no puede ser pospuesta indefinidamente.
             compartidos son accedidos                                                       3. Espera Limitada. Debe existir un límite en el número de veces
                                                                                                que a otros procesos les está permitido entrar en sus secciones
             Problema – asegurar que cuando un proceso                                          críticas después que un proceso ha hecho un requerimiento para
                                                                                                entrar en su sección crítica y antes que ese requerimiento sea
             está ejecutando en su sección crítica, no se le                                    completado.
             permite a otro proceso ejecutar en su                                                     Asuma que cada proceso ejecuta a velocidad distinta de cero.
             respectiva sección crítica.                                                               No se asume nada respecto a la velocidad relativa de los n
                                                                                                       procesos.


JRA © 2009                Sistemas Operativos – Sincronización de Procesos              JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                                  3
Resolución del Problema                                                             Solución de Peterson
              Solo 2 procesos, P0 y P1
              Estructura general del proceso Pi                                               Proceso Pi
                                                                                                     repeat
              repeat
                                                                                                        flag [i] := true;
                  protocolo de entrada                                                                  turn := j;
                                                                                                        while (flag [j] and turn = j) do no-op;
                                    ( )
                    sección crítica (SC)                                                                    sección crítica
                                                                                                        flag [i] := false;
                  protocolo de entrada                                                                      resto de sección
                                                                                                     until false;
                    resto de sección
                until falso                                                                   Alcanza los tres requerimientos; resuelve el problema
                                                                                              de la sección crítica para dos procesos.
              Los procesos pueden compartir algunas variables
              comunes para sincronizar sus acciones.
JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos




                   Algoritmo para N Procesos                                                   Algoritmo para N Procesos(Cont.)
                       (Algoritmo del “panadero”)
         Sección crítica para n procesos                                                      Notación orden lexicográfico (ticket #,id proceso #)
                                                                                                 (a,b) < c,d) si a < c o si a = c y b < d
                Antes de entrar en su sección crítica, el proceso
                recibe un número. El poseedor del número mas                                     max (a0,…, an-1) es un número k, tal que k ≥ ai para
                chico entra en su sección crítica.                                               i = 0, …, n – 1
             Si los procesos Pi y Pj reciben el mismo número , si i                           Dato compartido
             < j, entonces Pi es servido primero; sino lo es Pj .                                    var choosing: array [0..n – 1] of boolean;
             El esquema de numeración siempre genera números                                             number: array [0..n – 1] of integer,
             en orden incremental de enumeración;
                                                                                              Las estructuras de datos son inicializadas a false y 0
                p.e., 1,2,3,3,3,3,4,5...                                                      respectivamente.



JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos




              Algoritmo para N Procesos(Cont.)                                                     Sincronización por Hardware
        repeat                                                                                 Muchos sistemas proveen soporte por hardware para el código
           choosing[i] := true;                                                                de la sección crítica
           number[i] := max(number[0], number[1], …, number [n – 1])+1;                        Monoprocesador – pueden deshabilitarse las interrupciones
           choosing[i] := false;                                                                   El código que esta corriendo debe ejecutar sin apropiación
           for j := 0 to n – 1                                                                     Generamente es demasiado ineficiente en sistemas
             do begin                                                                              multiprocesador
                    while choosing[j] do no-op;                                                      Los SOs que usan esto no son ampliamente escalables
                    while number[j] ≠ 0                                                        Las computadoras modernas proveen instrucciones especiales
                       and (number[j],j) < (number[i], i) do no-op;                            que se ejecutan atómicamente
             end;                                                                                     Atómico = no-interrumpible
             sección crítica
                                                                                                  Sea por verificación de una palabra de memoria y su
           number[i] := 0;                                                                        inicialización
              resto de sección                                                                    O por intercambio de dos palabras de memoria
        until false;

JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                  4
Solución usando Test-and-Set                                                   Exclusión Mutua con Test-and-Set

                                                                                               Dato compartido : var lock: boolean (inicialmente false)
             Verifica y modifica el contenido de una palabra
             atomicamente.                                                                     Proceso Pi
                                                                                                          repeat
             función Test-and-Set (var target: boolean): boolean;                                           while Test-and-Set (lock) do no-op;
                  begin
                  b i                                                                                          sección crítica
                     Test-and-Set := target;                                                                lock := false;
                     target := true;                                                                           resto de sección
                  end;                                                                                      until false;




JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




                            Instrucción Swap                                                              Solución usando Swap
                                                                                              La variable booleana compartida es inicializada en FALSE;
                                                                                              Cada proceso tiene una variable local booleana key
              Definición:                                                                     Solución:
                                                                                                 while (true) {
                 void Swap (boolean *a, boolean *b)                                                     key = TRUE;
                 {                                                                                        while ( key == TRUE)
                         boolean temp = *a;                                                                     Swap (&lock, &key );
                         *a = *b;                                                                                  // sección critica
                         *b = temp:
                                                                                                          lock = FALSE;
                 }
                                                                                                                 //  sección restante
                                                                                                  }


JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




                                    Semáforos                                            El Semáforo como Herramienta General de Sincronización
                                                                                         Semáforo de Cuenta – el valor entero puede tener un rango
             Es una herramienta de sincronización.                                       sobre un dominio sin restricciones.
             Semáforo S – variable entera                                                Semáforo Binario – el valor entero puede tener un rango
             Dos operaciones standard modifican S: wait() y                              solo entre 0 y 1; puede ser más simple de implementar
             signal()                                                                           También se los conoce como mutex locks
             Originalmente llamadas P() y V()                                            Puede implementarse un semáforo de cuenta S como un
                                                                                                 p
             Puede ser accedido solo por dos operaciones                                 semáforo binario
             indivisibles (deben ser atómicas):                                          Provee exclusión mutua
                       wait (S): while S≤ 0 do no-op;                                         Semáforo S;       // inicializado en 1
                               S := S – 1;                                                    wait (S);
                                                                                                      Sección Critica
                       signal (S): S := S + 1;
                                                                                              signal (S);

JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                   5
El Semáforo como Herramienta General de Sincronización                                     Implementación de S con Semáforos Binarios

             Ejecute B en Pj solo después que A ejecute en Pi                                     Estructuras de datos:
             Use el semáforo flag inicializado a 0
             Código:                                                                                   var             S1: binary-semaphore;
                                                                                                                       S2: binary-semaphore;
                                                                                                                       S3: binary-semaphore;
                                                                                                                           binary semaphore;
                          Pi                                     Pj
                                                                                                                       C: integer;
                              M                                   M
                          A                              wait(flag)                               Initialización:
                     signal(flag)                                B                                                     S1 = S3 = 1
                                                                                                                       S2 = 0
                                                                                                                       C = valor inicial del semaforo S

JRA © 2009                        Sistemas Operativos – Sincronización de Procesos   JRA © 2009                      Sistemas Operativos – Sincronización de Procesos




                   Implementación de S (Cont.)                                                         Implementación del Semáforo
             operación wait
                                  wait(S3);                                                   Debe garantizar que dos procesos no puedan ejecutar wait ()
                                  wait(S1);                                                   y signal () sobre el mismo semáforo al mismo tiempo
                                  C := C – 1;
                                                                                              Entonces, la implementación se convierte en el problema de
                                  if C < 0
                                                                                              la sección crítica donde el código del wait y el signal son la
                                  then begin
                                                                                              sección crítica.
                                            signal(S1);
                                            wait(S2);                                               Podemos tener ahora espera ocupada en la
                                       end                                                          implementación de la sección crítica porque:
                                  else signal(S1);                                                     El código de implementación es corto
                                  signal(S3);
             operación signal                                                                          Poca espera ocupada si la sección crítica está
                                  wait(S1);                                                            raramente invocada
                                  C := C + 1;                                                 Note que las aplicaciones pueden pasar y gastar mucho
                                  if C ≤ 0 then signal(S2);                                   tiempo en secciones críticas, entonces esta no es una buena
                                  signal(S1);                                                 solución.
JRA © 2009                        Sistemas Operativos – Sincronización de Procesos   JRA © 2009                      Sistemas Operativos – Sincronización de Procesos




               Implementación de Semáforo sin Espera Ocupada                                                 Implementación (Cont.)
                                                                                                    Las operaciones del semáforo se definen como
         Con cada semáforo hay asociada una cola de espera.
         Cada entrada en dicha cola tiene dos datos:                                                     wait(S): S.value := S.value – 1;
                valor (de tipo entero)                                                                            if S.value < 0
                                                                                                                     then begin
                puntero al próximo registro en la lista
                                                                                                                         agregue este proceso a S.L;
                                                                                                                         block;
         Dos operaciones:                                                                                            end;
                                                                                                         signal(S): S.value := S.value + 1;
                block – ubica el proceso invocando la operación en
                la apropiada cola de espera .                                                                       if S.value ≤ 0
                                                                                                                       then begin
                wakeup – remueve uno de los procesos en la cola
                                                                                                                           remueva un proceso P de S.L;
                de espera y lo ubica en la cola de listos.                                                                 wakeup(P);
                                                                                                                        end;
JRA © 2009                        Sistemas Operativos – Sincronización de Procesos   JRA © 2009                      Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                        6
Interbloqueo e Inanición                                              Problemas Clásicos de Sincronización
         Interbloqueo – dos o más procesos están esperando
         indefinidamente por un evento que puede ser causado por
         solo uno de los procesos que esperan.
         Sean S y Q dos semáforos inicializados a 1                                            Problema del Buffer Limitado
                     P0                                     P1                                 Problema de Lectores y Escritores
                   wait(S);                            wait(Q);
                                                                                               Problema de los Filósofos Cenando
                   wait(Q);                            wait(S);
                      M                                       M
                  signal(S);                         signal(Q);
                  signal(Q);                         signal(S);
         Inanición – bloqueo indefinido. Un proceso no puede ser
         removido nunca de la cola del semáforo en el que fue
         suspendido.

JRA © 2009                     Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   4




                 Problema del Buffer Limitado                                                  Problema del Buffer Limitado (Cont.)

                                                                                                Proceso Productor
             Datos compartidos                                                                                repeat
                      type item = …                                                                                …
                      var buffer = …                                                                            produce un item en nextp
                                                                                                                    …
                        full, empty, mutex: semaphore;                                                          wait(empty);
                        nextp, nextc: item;                                                                     wait(mutex);
                        full :=0; empty := n; mutex :=1;                                                            …
                                                                                                                  agregue nextp al buffer
                                                                                                                         …
                                                                                                                signal(mutex);
                                                                                                                signal(full);
                                                                                                              until false;

JRA © 2009                     Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos




             Problema del Buffer Limitado(Cont.)                                               Problema de los Lectores-Escritores
                                                                                           Un conjunto de datos es compartido entre un número de procesos
              Proceso Consumidor                                                           concurrentes
                      repeat                                                                    Lectores – solo leen el conjunto de datos, no realizan
                        wait(full)                                                              actualizaciones
                        wait(mutex);                                                            Escritores – pueden leer y/o escribir
                             …
                        remueve un item de buffer a nextc                                  Problema – permitir a múltiples lectores leer al mismo tiempo. Un
                                                                                                        p             p                               p
                                                                                           solo escritor puede acceder a los datos compartidos al mismo
                             …
                                                                                           tiempo.
                        signal(mutex);
                                                                                           Datos compartidos
                        signal(empty);
                                                                                                Conjunto de datos
                             …
                        consume el item en nextc                                                Semáforo mutex inicializado a 1.

                             …                                                                  Semáforo wrt inicializado a 1.
                      until false;                                                              Entero readcount inicializado a 0.

JRA © 2009                     Sistemas Operativos – Sincronización de Procesos   JRA © 2009                    Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                       7
Problema de los Lectores-Escritores                                              Problema de los Lectores-Escritores

              Datos compartidos                                                               Proceso Lector
                          var mutex, wrt: semaphore (=1);                                               wait(mutex);
                             readcount : integer (=0);                                                    readcount := readcount +1;
                                                                                                          if readcount = 1 then wait(wrt);
                                                                                                        signal(mutex);
              Proceso Escritor
                                                                                                              …
                           wait(wrt);                                                                     se realiza la lectura
                                …                                                                             …
                             se realiza la escritura                                                    wait(mutex);
                                …                                                                         readcount := readcount – 1;
                           signal(wrt);                                                                   if readcount = 0 then signal(wrt);
                                                                                                         signal(mutex):


JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




             Problema de los Filósofos Cenando                                                Problema de los Filósofos Cenando
                                                                                         Filósofo i:
                                                                                                           repeat
                                                                                                             wait(chopstick[i])
                                                                                                             wait(chopstick[i+1 mod 5])
                                                                                                                …
                                                                                                               comer
                                                                                                                …
                                                                                                             signal(chopstick[i]);
                                                                                                             signal(chopstick[i+1 mod 5]);
                                                                                                                …
             Datos compartidos                                                                                 pensar
                Fuente con arroz (conjunto de datos)                                                            …
                var chopstick: array [0..4] of semaphore;(=1 inicialmente)                                   until false;

JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                  Sistemas Operativos – Sincronización de Procesos   4




                     Problemas con Semáforos                                                                        Monitores
                                                                                          Es un constructor de sincronización de alto nivel que
               Incorrecto uso de las operaciones sobre                                    permite compartir en forma segura un tipo de dato
                                                                                          abstracto entre procesos concurrentes.
              semáforos:
                                                                                                 type monitor-name = monitor
                  signal (mutex) …. wait (mutex)                                                     declaraciones de variables
                                                                                                     procedure entry P1 :(…);
                  wait (mutex) … wait (mutex)                                                           begin
                                                                                                        b i … end;  d
                                                                                                     procedure entry P2(…);
                                                                                                        begin … end;
                 Omitir el wait (mutex) o el signal (mutex) (o                                             M
                 ambos)                                                                              procedure entry Pn (…);
                                                                                                        begin…end;
                                                                                                     begin
                                                                                                        código de inicialización
                                                                                                     end
JRA © 2009                    Sistemas Operativos – Sincronización de Procesos   JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                    8
Vista esquemática de un Monitor                                                                        Variables de Condición

                                                                                                            condición x, y;
                     datos
                   compartidos
                                                            cola de entrada                                 Dos operaciones sobre una variable de
                                                                                                            condición
                                                                                                               x.wait
                                                                                                               x wait () – el proceso que invoca esa
                          ...                                                                                  operación es suspendido

                  operaciones                                                                                  x.signal () – reinicia uno de los procesos (si
                                                                                                               hay alguno) que invocó x.wait ()

                      código
                  inicialización


JRA © 2009                      Sistemas Operativos – Sincronización de Procesos             JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




             Monitor con Variables de Condición                                                            Solución de los Filósofos Cenando
                                                                                                          type filósofos-cenando = monitor
                                                                                                             var state : array [0..4] of :(pensando, hambre, comiendo);
                         datos                                                                               var self : array [0..4] of condition;
                       compartidos
                                                                                                             procedure entry pickup (i: 0..4);
                                           x                      cola de entrada                             begin
                                           y              colas asociadas a las
                                                                                                                   estado[i] := hambre,
                                                                                                                   test (i);
                                                          variables de condición x e y
                                                                                                                   if estado[i] ≠ comiendo th self[i].wait,
                                                                                                                        t d [i]       i d then lf[i]     it
                                                                                                              end;
                              ...
                                                                                                             procedure entry putdown (i: 0..4);
                      operaciones                                                                             begin
                                                                                                                  estado[i] := pensando;
                          código                                                                                  test (i+4 mod 5);
                      inicialización                                                                              test (i+1 mod 5);
                                                                                                              end;

JRA © 2009                      Sistemas Operativos – Sincronización de Procesos         5   JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




             Solución de los Filósofos Cenando                                                                  Solución de los Filósofos Cenando

             procedure test(k: 0..4);
                 begin                                                                                    Cada filósofo invoca las operaciones pickup() y
                      if estado[k+4 mod 5] ≠ comiendo                                                     putdown() en la siguiente secuencia:
                            and state[k] = hambre
                            and state[k+1 mod 5] ] ≠ comiendo
                            then begin                                                                           dp.pickup (i)
                                      estado[k] : comiendo;
                                                 :=
                                      self[k].signal;                                                                Comer
                            end;
                      end;
                                                                                                                 dp.putdown (i)
                 begin
                      for i := 0 to 4
                             do estado[i] := pensando;
                 end.

JRA © 2009                      Sistemas Operativos – Sincronización de Procesos         5   JRA © 2009                     Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                                               9
Ejemplos de Sincronización                                                   Sincronización en SOLARIS

             Solaris                                                                      Implementa una variedad de locks para soportar
                                                                                          multitasking, multithreading (incluyendo threads en
             Windows XP                                                                   tiempo real), y multiprocesamiento.
             Linux                                                                        Usa mutex adaptivos para mayor eficiencia en la
                                                                                          protección de datos para segmentos de código cortos.
             Pthreads
                                                                                          Usa variables de condición y locks lectores-escritores
                                                                                          cuando grandes secciones de código necesitan acceder
                                                                                          a los datos.
                                                                                          Usa turnstiles para ordenar la lista de threads
                                                                                          esperando para adquirir un mutex adaptivo o un lock
                                                                                          lectores-escritores


JRA © 2009                Sistemas Operativos – Sincronización de Procesos   JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                 Sincronización Windows XP                                                         Sincronización en Linux

             Usa máscaras de interrupción para proteger el acceso a                       Linux:
             recursos globales en sistemas mono procesador
                                                                                            Deshabilita las interrupciones para
             Usa spinlocks en sistemas multiprocesador
                                                                                            implementar secciones críticas cortas
             Tambiém provee dispatcher objects los cuales actuan
             como mutex y semáforos
             Los Dispatcher objects pueden proveer eventos                                Linux provee:
               Un evento actúa como una variable de condición                               semaforos
                                                                                            spin locks




JRA © 2009                Sistemas Operativos – Sincronización de Procesos   JRA © 2009                  Sistemas Operativos – Sincronización de Procesos




                 Sincronización en Pthreads

              APIs Pthreads son independientes de los SOs
              Proveen:
                 Locks mutex
                                                                                                                  Fin
                 Variables de condición

              Extensiones no portables incluyen:                                                         Módulo 6
                 Locks lector-escritor
                 spin locks

                                                                                            Departamento de Ciencias e Ingeniería de la Computación
                                                                                                         Universidad Nacional del Sur

JRA © 2009                Sistemas Operativos – Sincronización de Procesos




                                                                                                                                                            10

Más contenido relacionado

Similar a So 2009-mod 06

Diseño de Algoritmos Paralelos.pptx
Diseño de Algoritmos Paralelos.pptxDiseño de Algoritmos Paralelos.pptx
Diseño de Algoritmos Paralelos.pptxSebastianPea63
 
Diseño de Algoritmos Paralelos Roderick Beriguete .pptx
Diseño de Algoritmos Paralelos Roderick Beriguete .pptxDiseño de Algoritmos Paralelos Roderick Beriguete .pptx
Diseño de Algoritmos Paralelos Roderick Beriguete .pptxRoderickx12
 
Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfAlgoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfdarosario3d
 
Octave una alternativa libre para el cálculo numérico
Octave una alternativa libre para el cálculo numéricoOctave una alternativa libre para el cálculo numérico
Octave una alternativa libre para el cálculo numéricoEsteban Saavedra
 
Multiplicacion de matrices: Implementacion en cluster
Multiplicacion de matrices: Implementacion en clusterMultiplicacion de matrices: Implementacion en cluster
Multiplicacion de matrices: Implementacion en clusterWalter Tejerina
 
Paper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaPaper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaFcoKraken
 
Paper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaPaper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaFcoKraken
 
Desarrollo de lógica algorítmica
Desarrollo de lógica algorítmicaDesarrollo de lógica algorítmica
Desarrollo de lógica algorítmicaOmar B.
 
SICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOSSICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOSlorenapardo
 
Pasos para realizar un problema en computador
Pasos para realizar un problema en computadorPasos para realizar un problema en computador
Pasos para realizar un problema en computadorAlex Rommyo
 
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.WALTER YSIQUE
 
Pasos para realizar un problema en computador
Pasos para realizar un problema en computadorPasos para realizar un problema en computador
Pasos para realizar un problema en computadorAlex Rommyo
 
Diseño de Algoritmos Paralelos | 21-0336
Diseño de Algoritmos Paralelos | 21-0336Diseño de Algoritmos Paralelos | 21-0336
Diseño de Algoritmos Paralelos | 21-0336JesuelFerreirasAcost
 

Similar a So 2009-mod 06 (20)

Diseño de Algoritmos Paralelos.pptx
Diseño de Algoritmos Paralelos.pptxDiseño de Algoritmos Paralelos.pptx
Diseño de Algoritmos Paralelos.pptx
 
DISEÑO DE ALGORITMOS PARALELOS
DISEÑO DE ALGORITMOS PARALELOSDISEÑO DE ALGORITMOS PARALELOS
DISEÑO DE ALGORITMOS PARALELOS
 
Diseño de Algoritmos Paralelos Roderick Beriguete .pptx
Diseño de Algoritmos Paralelos Roderick Beriguete .pptxDiseño de Algoritmos Paralelos Roderick Beriguete .pptx
Diseño de Algoritmos Paralelos Roderick Beriguete .pptx
 
Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdfAlgoritmos Paralelos - Actividad 14 - UNIBE.pdf
Algoritmos Paralelos - Actividad 14 - UNIBE.pdf
 
Algoritmos Paralelos
Algoritmos ParalelosAlgoritmos Paralelos
Algoritmos Paralelos
 
Octave una alternativa libre para el cálculo numérico
Octave una alternativa libre para el cálculo numéricoOctave una alternativa libre para el cálculo numérico
Octave una alternativa libre para el cálculo numérico
 
Multiplicacion de matrices: Implementacion en cluster
Multiplicacion de matrices: Implementacion en clusterMultiplicacion de matrices: Implementacion en cluster
Multiplicacion de matrices: Implementacion en cluster
 
Algoritmos paralelos
 Algoritmos paralelos Algoritmos paralelos
Algoritmos paralelos
 
Paper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaPaper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra Fmancia
 
Paper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra FmanciaPaper Mmulfpuna Mpi Cparra Fmancia
Paper Mmulfpuna Mpi Cparra Fmancia
 
Sesion 1
Sesion 1Sesion 1
Sesion 1
 
Desarrollo de lógica algorítmica
Desarrollo de lógica algorítmicaDesarrollo de lógica algorítmica
Desarrollo de lógica algorítmica
 
Software 1
Software 1Software 1
Software 1
 
3 unidad so2
3 unidad so23 unidad so2
3 unidad so2
 
SICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOSSICRONIZACION DE PROCESOS
SICRONIZACION DE PROCESOS
 
Pasos para realizar un problema en computador
Pasos para realizar un problema en computadorPasos para realizar un problema en computador
Pasos para realizar un problema en computador
 
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.
TÓPICOS DE MATLAB: APLICACIÓN A LOS MÉTODOS NUMÉRICOS.
 
Pasos para realizar un problema en computador
Pasos para realizar un problema en computadorPasos para realizar un problema en computador
Pasos para realizar un problema en computador
 
PPT-BPMN.pdf
PPT-BPMN.pdfPPT-BPMN.pdf
PPT-BPMN.pdf
 
Diseño de Algoritmos Paralelos | 21-0336
Diseño de Algoritmos Paralelos | 21-0336Diseño de Algoritmos Paralelos | 21-0336
Diseño de Algoritmos Paralelos | 21-0336
 

So 2009-mod 06

  • 1. Sincronización de Procesos Fundamentos Sincronización de Procesos El Problema de la Sección Crítica La Solución de Peterson y otras Hardware de Sincronización Semáforos Módulo 6 Problemas Clásicos de Sincronización Monitores Ejemplos de Sincronización Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur JRA © 2009 Sistemas Operativos – Sincronización de Procesos Fundamentos El Problema El acceso concurrente a datos compartidos puede Productor contador = 4 Consumidor resultar en inconsistencias. : : Mantener la consistencia de datos requiere mecanismos : : : : para asegurar la ejecución ordenada de procesos : : cooperativos. La solución con memoria compartida al problema del contador:= contador+1; t d t d +1 contador:= contador-1; t d t d 1 buffer limitado (módulo anterior) permite a lo sumo n – 1 items en el buffer al mismo tiempo. Una solución, donde : : : : todos los N buffers son usados, no es simple. : : : : Supóngase que se modifica el código del productor- consumidor agregando una variable contador, inicializado a 0 e incrementado en cada momento contador = 4 que un nuevo item es agregado al buffer Luego de una operación de Productor y otra de Consumidor … contador permanece invariante JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos El Problema El Problema Productor Consumidor P1 a=b=1 P2 : : : : : : : : : : : : : : : : rega ← contador contador regb ← contador a:= a+1; ; a a:= 2 * a; rega ← rega+1 a +1 contador:= contador+1; regb ← regb - 1 contador:= contador-1; b:= b+1; b:= 2 * b; contador ← regaa contador ← reg contador ← regb : : : : : : : : : : : : : : : rega= 5 regb= 3 : a=b=4 4 contador = 5 3 Luego de la ejecución de P1 seguida de P2 los valores de a y b deben ser iguales entre sí JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 1
  • 2. El Problema El Problema a=b=1 A sig(A) B sig(B) C sig(C) P1 P2 : : L : : : : : : a:= a+1; ; a: a:= 2 * a; D sig(D) E sig(E) b:= b+1; b:= 2 * b; : : : : : : : : : : sig(D) ← L sig(E) ← L a=4,b=3 L ←D L ←E Luego de la ejecución de P1 y P2 los valores de a y b deberían ser iguales : : entre sí, pero no lo son. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos El Problema El Problema A sig(A) B sig(B) C sig(C) A sig(A) B sig(B) C sig(C) L L D sig(D) E sig(E) D sig(D) E sig(E) : : : : sig(D) ← L sig(E) ← L sig(D) ← L sig(E) ← L L ←D L ←E L ←D L ←E : : : : JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos El Problema El Problema A sig(A) B sig(B) C sig(C) A sig(A) B sig(B) C sig(C) L L D sig(D) E sig(E) D sig(D) E sig(E) : : : : sig(D) ← L sig(E) ← L sig(D) ← L sig(E) ← L L ←D L ←E L ←D L ←E : : : : JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 2
  • 3. El Problema El Problema A sig(A) B sig(B) C sig(C) A sig(A) B sig(B) C sig(C) L L D sig(D) E sig(E) D sig(D) E sig(E) : : : : sig(D) ← L sig(E) ← L sig(D) ← L sig(E) ← L L ←D L ←E L ←D L ←E : : : : JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos El Problema Condición de Carrera A sig(A) B sig(B) C sig(C) L Condición de carrera – Es la situación donde varios procesos acceden y manejan datos compartidos concurrentemente. El valor final de los datos compartidos depende de que proceso termina último. D sig(D) E sig(E) Para prevenir las condiciones de carrera , los procesos concurrentes cooperativos deben ser : : sincronizados. sig(D) ← L sig(E) ← L L ←D L ←E : : JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Problema de la Sección Crítica Solución al Problema de la Sección Crítica 1. Exclusión Mutua. Si el proceso Pj está ejecutando en su sección crítica, entonces ningún otro proceso puede estar ejecutando en n procesos todos compitiendo para usar datos sus secciones críticas. compartidos 2. Progreso. Si ningún proceso está ejecutando en su sección crí- tica y existe algunos procesos que desean entrar en sus secciones Cada proceso tiene un segmento de código criticas, entonces la selección de procesos que desean entrar en la llamado sección crítica, en la cual los datos sección crítica no puede ser pospuesta indefinidamente. compartidos son accedidos 3. Espera Limitada. Debe existir un límite en el número de veces que a otros procesos les está permitido entrar en sus secciones Problema – asegurar que cuando un proceso críticas después que un proceso ha hecho un requerimiento para entrar en su sección crítica y antes que ese requerimiento sea está ejecutando en su sección crítica, no se le completado. permite a otro proceso ejecutar en su Asuma que cada proceso ejecuta a velocidad distinta de cero. respectiva sección crítica. No se asume nada respecto a la velocidad relativa de los n procesos. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 3
  • 4. Resolución del Problema Solución de Peterson Solo 2 procesos, P0 y P1 Estructura general del proceso Pi Proceso Pi repeat repeat flag [i] := true; protocolo de entrada turn := j; while (flag [j] and turn = j) do no-op; ( ) sección crítica (SC) sección crítica flag [i] := false; protocolo de entrada resto de sección until false; resto de sección until falso Alcanza los tres requerimientos; resuelve el problema de la sección crítica para dos procesos. Los procesos pueden compartir algunas variables comunes para sincronizar sus acciones. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Algoritmo para N Procesos Algoritmo para N Procesos(Cont.) (Algoritmo del “panadero”) Sección crítica para n procesos Notación orden lexicográfico (ticket #,id proceso #) (a,b) < c,d) si a < c o si a = c y b < d Antes de entrar en su sección crítica, el proceso recibe un número. El poseedor del número mas max (a0,…, an-1) es un número k, tal que k ≥ ai para chico entra en su sección crítica. i = 0, …, n – 1 Si los procesos Pi y Pj reciben el mismo número , si i Dato compartido < j, entonces Pi es servido primero; sino lo es Pj . var choosing: array [0..n – 1] of boolean; El esquema de numeración siempre genera números number: array [0..n – 1] of integer, en orden incremental de enumeración; Las estructuras de datos son inicializadas a false y 0 p.e., 1,2,3,3,3,3,4,5... respectivamente. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Algoritmo para N Procesos(Cont.) Sincronización por Hardware repeat Muchos sistemas proveen soporte por hardware para el código choosing[i] := true; de la sección crítica number[i] := max(number[0], number[1], …, number [n – 1])+1; Monoprocesador – pueden deshabilitarse las interrupciones choosing[i] := false; El código que esta corriendo debe ejecutar sin apropiación for j := 0 to n – 1 Generamente es demasiado ineficiente en sistemas do begin multiprocesador while choosing[j] do no-op; Los SOs que usan esto no son ampliamente escalables while number[j] ≠ 0 Las computadoras modernas proveen instrucciones especiales and (number[j],j) < (number[i], i) do no-op; que se ejecutan atómicamente end; Atómico = no-interrumpible sección crítica Sea por verificación de una palabra de memoria y su number[i] := 0; inicialización resto de sección O por intercambio de dos palabras de memoria until false; JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 4
  • 5. Solución usando Test-and-Set Exclusión Mutua con Test-and-Set Dato compartido : var lock: boolean (inicialmente false) Verifica y modifica el contenido de una palabra atomicamente. Proceso Pi repeat función Test-and-Set (var target: boolean): boolean; while Test-and-Set (lock) do no-op; begin b i sección crítica Test-and-Set := target; lock := false; target := true; resto de sección end; until false; JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Instrucción Swap Solución usando Swap La variable booleana compartida es inicializada en FALSE; Cada proceso tiene una variable local booleana key Definición: Solución: while (true) { void Swap (boolean *a, boolean *b) key = TRUE; { while ( key == TRUE) boolean temp = *a; Swap (&lock, &key ); *a = *b; // sección critica *b = temp: lock = FALSE; } // sección restante } JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Semáforos El Semáforo como Herramienta General de Sincronización Semáforo de Cuenta – el valor entero puede tener un rango Es una herramienta de sincronización. sobre un dominio sin restricciones. Semáforo S – variable entera Semáforo Binario – el valor entero puede tener un rango Dos operaciones standard modifican S: wait() y solo entre 0 y 1; puede ser más simple de implementar signal() También se los conoce como mutex locks Originalmente llamadas P() y V() Puede implementarse un semáforo de cuenta S como un p Puede ser accedido solo por dos operaciones semáforo binario indivisibles (deben ser atómicas): Provee exclusión mutua wait (S): while S≤ 0 do no-op; Semáforo S; // inicializado en 1 S := S – 1; wait (S); Sección Critica signal (S): S := S + 1; signal (S); JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 5
  • 6. El Semáforo como Herramienta General de Sincronización Implementación de S con Semáforos Binarios Ejecute B en Pj solo después que A ejecute en Pi Estructuras de datos: Use el semáforo flag inicializado a 0 Código: var S1: binary-semaphore; S2: binary-semaphore; S3: binary-semaphore; binary semaphore; Pi Pj C: integer; M M A wait(flag) Initialización: signal(flag) B S1 = S3 = 1 S2 = 0 C = valor inicial del semaforo S JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Implementación de S (Cont.) Implementación del Semáforo operación wait wait(S3); Debe garantizar que dos procesos no puedan ejecutar wait () wait(S1); y signal () sobre el mismo semáforo al mismo tiempo C := C – 1; Entonces, la implementación se convierte en el problema de if C < 0 la sección crítica donde el código del wait y el signal son la then begin sección crítica. signal(S1); wait(S2); Podemos tener ahora espera ocupada en la end implementación de la sección crítica porque: else signal(S1); El código de implementación es corto signal(S3); operación signal Poca espera ocupada si la sección crítica está wait(S1); raramente invocada C := C + 1; Note que las aplicaciones pueden pasar y gastar mucho if C ≤ 0 then signal(S2); tiempo en secciones críticas, entonces esta no es una buena signal(S1); solución. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Implementación de Semáforo sin Espera Ocupada Implementación (Cont.) Las operaciones del semáforo se definen como Con cada semáforo hay asociada una cola de espera. Cada entrada en dicha cola tiene dos datos: wait(S): S.value := S.value – 1; valor (de tipo entero) if S.value < 0 then begin puntero al próximo registro en la lista agregue este proceso a S.L; block; Dos operaciones: end; signal(S): S.value := S.value + 1; block – ubica el proceso invocando la operación en la apropiada cola de espera . if S.value ≤ 0 then begin wakeup – remueve uno de los procesos en la cola remueva un proceso P de S.L; de espera y lo ubica en la cola de listos. wakeup(P); end; JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 6
  • 7. Interbloqueo e Inanición Problemas Clásicos de Sincronización Interbloqueo – dos o más procesos están esperando indefinidamente por un evento que puede ser causado por solo uno de los procesos que esperan. Sean S y Q dos semáforos inicializados a 1 Problema del Buffer Limitado P0 P1 Problema de Lectores y Escritores wait(S); wait(Q); Problema de los Filósofos Cenando wait(Q); wait(S); M M signal(S); signal(Q); signal(Q); signal(S); Inanición – bloqueo indefinido. Un proceso no puede ser removido nunca de la cola del semáforo en el que fue suspendido. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 4 Problema del Buffer Limitado Problema del Buffer Limitado (Cont.) Proceso Productor Datos compartidos repeat type item = … … var buffer = … produce un item en nextp … full, empty, mutex: semaphore; wait(empty); nextp, nextc: item; wait(mutex); full :=0; empty := n; mutex :=1; … agregue nextp al buffer … signal(mutex); signal(full); until false; JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Problema del Buffer Limitado(Cont.) Problema de los Lectores-Escritores Un conjunto de datos es compartido entre un número de procesos Proceso Consumidor concurrentes repeat Lectores – solo leen el conjunto de datos, no realizan wait(full) actualizaciones wait(mutex); Escritores – pueden leer y/o escribir … remueve un item de buffer a nextc Problema – permitir a múltiples lectores leer al mismo tiempo. Un p p p solo escritor puede acceder a los datos compartidos al mismo … tiempo. signal(mutex); Datos compartidos signal(empty); Conjunto de datos … consume el item en nextc Semáforo mutex inicializado a 1. … Semáforo wrt inicializado a 1. until false; Entero readcount inicializado a 0. JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 7
  • 8. Problema de los Lectores-Escritores Problema de los Lectores-Escritores Datos compartidos Proceso Lector var mutex, wrt: semaphore (=1); wait(mutex); readcount : integer (=0); readcount := readcount +1; if readcount = 1 then wait(wrt); signal(mutex); Proceso Escritor … wait(wrt); se realiza la lectura … … se realiza la escritura wait(mutex); … readcount := readcount – 1; signal(wrt); if readcount = 0 then signal(wrt); signal(mutex): JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Problema de los Filósofos Cenando Problema de los Filósofos Cenando Filósofo i: repeat wait(chopstick[i]) wait(chopstick[i+1 mod 5]) … comer … signal(chopstick[i]); signal(chopstick[i+1 mod 5]); … Datos compartidos pensar Fuente con arroz (conjunto de datos) … var chopstick: array [0..4] of semaphore;(=1 inicialmente) until false; JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 4 Problemas con Semáforos Monitores Es un constructor de sincronización de alto nivel que Incorrecto uso de las operaciones sobre permite compartir en forma segura un tipo de dato abstracto entre procesos concurrentes. semáforos: type monitor-name = monitor signal (mutex) …. wait (mutex) declaraciones de variables procedure entry P1 :(…); wait (mutex) … wait (mutex) begin b i … end; d procedure entry P2(…); begin … end; Omitir el wait (mutex) o el signal (mutex) (o M ambos) procedure entry Pn (…); begin…end; begin código de inicialización end JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos 8
  • 9. Vista esquemática de un Monitor Variables de Condición condición x, y; datos compartidos cola de entrada Dos operaciones sobre una variable de condición x.wait x wait () – el proceso que invoca esa ... operación es suspendido operaciones x.signal () – reinicia uno de los procesos (si hay alguno) que invocó x.wait () código inicialización JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Monitor con Variables de Condición Solución de los Filósofos Cenando type filósofos-cenando = monitor var state : array [0..4] of :(pensando, hambre, comiendo); datos var self : array [0..4] of condition; compartidos procedure entry pickup (i: 0..4); x cola de entrada begin y colas asociadas a las estado[i] := hambre, test (i); variables de condición x e y if estado[i] ≠ comiendo th self[i].wait, t d [i] i d then lf[i] it end; ... procedure entry putdown (i: 0..4); operaciones begin estado[i] := pensando; código test (i+4 mod 5); inicialización test (i+1 mod 5); end; JRA © 2009 Sistemas Operativos – Sincronización de Procesos 5 JRA © 2009 Sistemas Operativos – Sincronización de Procesos Solución de los Filósofos Cenando Solución de los Filósofos Cenando procedure test(k: 0..4); begin Cada filósofo invoca las operaciones pickup() y if estado[k+4 mod 5] ≠ comiendo putdown() en la siguiente secuencia: and state[k] = hambre and state[k+1 mod 5] ] ≠ comiendo then begin dp.pickup (i) estado[k] : comiendo; := self[k].signal; Comer end; end; dp.putdown (i) begin for i := 0 to 4 do estado[i] := pensando; end. JRA © 2009 Sistemas Operativos – Sincronización de Procesos 5 JRA © 2009 Sistemas Operativos – Sincronización de Procesos 9
  • 10. Ejemplos de Sincronización Sincronización en SOLARIS Solaris Implementa una variedad de locks para soportar multitasking, multithreading (incluyendo threads en Windows XP tiempo real), y multiprocesamiento. Linux Usa mutex adaptivos para mayor eficiencia en la protección de datos para segmentos de código cortos. Pthreads Usa variables de condición y locks lectores-escritores cuando grandes secciones de código necesitan acceder a los datos. Usa turnstiles para ordenar la lista de threads esperando para adquirir un mutex adaptivo o un lock lectores-escritores JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Sincronización Windows XP Sincronización en Linux Usa máscaras de interrupción para proteger el acceso a Linux: recursos globales en sistemas mono procesador Deshabilita las interrupciones para Usa spinlocks en sistemas multiprocesador implementar secciones críticas cortas Tambiém provee dispatcher objects los cuales actuan como mutex y semáforos Los Dispatcher objects pueden proveer eventos Linux provee: Un evento actúa como una variable de condición semaforos spin locks JRA © 2009 Sistemas Operativos – Sincronización de Procesos JRA © 2009 Sistemas Operativos – Sincronización de Procesos Sincronización en Pthreads APIs Pthreads son independientes de los SOs Proveen: Locks mutex Fin Variables de condición Extensiones no portables incluyen: Módulo 6 Locks lector-escritor spin locks Departamento de Ciencias e Ingeniería de la Computación Universidad Nacional del Sur JRA © 2009 Sistemas Operativos – Sincronización de Procesos 10