SlideShare una empresa de Scribd logo
1 de 3
Descargar para leer sin conexión
Sistemas Operativos




                                                                                  No sincronizados

                                                                                    Tiempo

                                                                                       3:00         Mira en la refri (no hay leche)

                                       Sistemas Operativos       Profesor:             3:05                     Ir a la tienda
          Your picture here
                                             Ciclo 2012-1    Diaz Muñante Jorge        3:10                                                         Mira en la refri (no hay leche)

                                                                                       3:15                     Compra leche

                                                                                       3:20                                                                     Ir a la tienda

                                                                                       3:25          Llega a casa, guarda la leche

                                                                                       3:30                                                                     Compra leche
                          Sincronizacion de Procesos                                   3:35                                                         Llega a casa, guarda la leche..
                                                                                                                                                               ya hay¡¡¡




                                                                                  Proceso Deposito / Retiro
        Servidor de un Banco

                                                                                    Los procesos pueden coincidir en accesar a datos comunes

                                                                                  Proceso Deposito                               Proceso Retiro
                                                                                  ….                                             …..
                                                                                  leer registro                                  lee Registro
                                                                                  Saldo = Saldo + deposito                       Saldo = Saldo – Retiro
                                                                                  Actualiza registro                             actualiza registro
                                                                                  …..                                            …..


                                                                                    Puedo Ocurrir desafortunamente:

                                                                                    Proceso Deposito                             Proceso Retiro
                                                                                     ……..
                                                                                  t1 Leer registro
       Problema en un Servidor:                                                   t2 Saldo = Saldo + deposito
       – Se da servicio a un conjunto de requerimientos                                                                            t3   Lee Registro

       – Hay que hacerlo sin corromper la base de datos                                                                            t4   Saldo = Saldo – Retiro
                                                                                                                                   t5   Actualiza el registro
       – Permitirlo puede costar mucho dinero                                     t6 Actualiza registro




        Sincronización de Procesos                                                Sincronización de Procesos


          Un proceso se ejecuta asíncronamente con respecto a otro,
                                                                                               Sección crítica: porción de código en la que se
          debido a que sus ejecuciones son independientes.                                     accede a un recurso compartido.
          Sin embargo hay instantes en que deben sincronizar sus
                                                                                               Exclusión mutua: garantizar que en cada
          actividades.                                                                         momento se pueda estar ejecutando como
          El acceso concurrente a datos compartidos puede resultar                             máximo una sección crítica asociada a un
                                                                                               recurso.
          en datos inconsistentes.
          Mantener la consistencia en los datos requiere de                             Proceso Deposito                                                         Proceso Retiro
          mecanismos que aseguren la ejecución ordenada de                              ….
                                                                                        <protocolo de entrada>
                                                                                                                                                    …..
                                                                                                                                                <protocolo de entrada>
          procesos concurrentes.                                                        leer registro                                               lee Registro
                                                                                        Saldo = Saldo + deposito                                    Saldo = Saldo – Retiro
                                                                                        Actualiza registro                                          actualiza registro

                                                                                         <protocolo de salida>                                   <protocolo de salida>
                                                                                        …..                                                         …..




Diaz Muñante Jorge                                                                                                                                                                    1
Sistemas Operativos




       Sección criticas                                                                      Soluciones al Problema de la sección crítica
                                                                                               Condiciones obligatorias

                                                                                               1. Exclusión Mutua. Si un proceso Pi esta ejecutando su sección crítica,
                               A ingresa a sección critica                                     entonces ningún otro proceso puede ejecutar su sección crítica.
                                                               A libera la sección critica
        Proceso A

                                                                                               2. Ningún proceso que esta fuera de su sección crítica puede bloquear a otros.

                                         B intenta            B ingresa         B libera
                                         ingresar a           a sección         la sección     3. Ningún proceso puede ser esperar un tiempo arbitrariamente grande para
                                         sección critica      critica           critica        entrar en su sección crítica.

        Proceso B                                                                              4. No se puede asumir la velocidad o rapidez de los procesos.
                                           B bloqueado

                          T1          T2                 T3               T4




       ¿Adónde vamos con la sincronización?                                                  Los semáforos

        Programas                   Programas compartidos
                                                                                                          P1                                    Recurso                      Semáforo:
                                                                                                                                                                             Variable entera no
          Alto                                                                                                                                                               negativa, con las
          Nivel
                               Locks        Semaforos Monitores                                           P3                                     P2
                                            Send/Receive                                                                                                                     siguientes
          API                                                                                                      P4
                                                                                                                                                                             operaciones

        Hardwar                Load/Store        Disable Ints             Test&Set
           e                                    Comp&Swap                                                                   S
                                                                                             Dos operaciones:
       Vamos implementar varias primitivas de sincronizacion usando
       operaciones atomicas                                                                  P(S):                                             V(S):
                                                                                              if ( S > 0 ) then                          if (alguien espera por S) then
                                                                                                   S:=S-1                                    lo transita a listo
                                                                                              else                                       else
                                                                                                   bloquea al proceso                        S:=S+1




       Tipo y uso de semáforos                                                               Productor / Consumidor
           Uso                                   Descripción
           Concurrencia acotada                  Semáforo contador o general
                                                 Cuando un recurso será asignado,
                                                 tomándolo de un conjunto de                 Produce un elemento
                                                 recursos idénticos                          Guarda el elemento
                                                 Semáforo es inicializado con el                                                Productor
                                                 número de recursos existentes
           Exclusión mutua                       Semáforo binario
                                                 Inicializado en 1. Un proceso antes
                                                                                                                                                                               Buffer
                                                 de ingresar a la sección critica                    X Y                                                                         Z
                                                 realiza la operación “P” y cuando
                                                 termina la operación “V”                            0 1       2   3    4   5 ............................................      99
           Señalización                          Semáforo sincronizador
                                                 P1 con enunciado S1
                                                 P2 con enunciado S2                                                            Consumidor
                                                 Se desea que S2 sea ejecutado
                                                 después de que S1 haya terminado                                                                                 Saca un elemento
                                                                                                                                                                  Consume el elemento




Diaz Muñante Jorge                                                                                                                                                                                2
Sistemas Operativos




                                                                                                     #define N 100                    /* Número de espacios en el almacen (buffer) */
       Problema de productor consumidor                                                              int cont = 0;                    /* Número de elementos en el almacen (buffer) */

                                                                                                     typedef int semaphore
           #define N 100                   /* Número de espacios en el almacen (buffer) */
           int cont = 0;                   /* Número de elementos en el almacen (buffer) */          semaphore ocupado = 1;
                                                                                                     semaphore vacio = N;                        Solución prob. prod-cons usando semáforos
                                                                                                     semaphore lleno = 0;
           void productor( )
            {
              int elemento;                                                                          void productor( )
                                                                                                     {
                while (TRUE){                        /* ciclo infinito                 */              int elemento;
                  produce_elem(&elemento);           /* genera el siguiente elemento           */
                  if (cont == N)                     /* si el almacen (buffer) esta lleno      */        while (TRUE) {                          /* ciclo infinito                    */
                      sleep();                       /* entonces se duerme             */                  produce_elem(&elemento);             /* genera el siguiente elemento       */
                  intro_elem(elemento);              /* colocar elemento en almacen             */         P(&vacio);                           /* decrementa contador espacios vacíos */
                  cont = cont+1                      /* incrementa conta. elementos alma.       */         P(&ocupado);                         / * entra en la sección crítica        */
                  if (cont == 1)                     /* estaba vacio el almacen (buffer)       */          intro_elem(elemento);                /* colocar elemento en el almacen         */
                       wake_up(consumidor);
                }                                                                                          V(&ocupado);                         /* sale de la sección crítica         */
           }                                                                                               V(&lleno);                           /* incrementa cont entradas ocupadas */
                                                                                                         }
                                                                                                     }

           void consumidor( )                                                                        void consumidor( )
           {                                                                                         {
              int elemento;                                                                             int elemento;
                while (TRUE) {                        /*   ciclo infinito                      */        while (TRUE) {                         /*   ciclo infinito                      */
                  if (cont == 0)                      /*   si el almacen (buffer) esta vacío   */
                      sleep();                        /*   entonces se duerme                  */           P(&lleno);                          /*   decrementa cont. entradas ocupadas */
                  retira_elem(&elemento);             /*   retira elemento del almacen */                   P(&ocupado);                        /*   entra en la sección crítica         */
                  cont = cont - 1;                    /*   decrementa conta. elementos alma */              retira_elem(elemento);              /*   toma un elemento del almacen       */
                  if (cont == N-1)                    /*   estaba lleno el almacen (buffer)    */           V(&ocupado);                        /*   sale de la sección crítica         */
                      wakeup(productor);                                                                    V(&vacio);                          /*   incrementa contador entradas vacías */
                  consume_elem(elemento);             /* consume el elemento                   */           haz_algo(elemento);                 /*   hace algo con el elemento          */
            }                                                                                             }
           }                                                                                         }




       Ejemplo de corrida del algoritmo                                                                                  Continuación del ejemplo

          Valores iniciales: ocupado=1 vacio=N                      lleno=0
                                                                                                     PRODUCTOR                                                        CONSUMIDOR
        PRODUCTOR                                                       CONSUMIDOR

        produce_elem(&elemento)                                                                      P(&vacio)
        P(&vacio)                                                                                           vacio=98
                  vacio=99                                                                           P(&ocupado)
        P(&ocupado)                                                                                                                                    Temina quantum, cambio CPU
                  ocupado= 0                                                                                proceso espera liberación
                  intro_elem(elemento)                                                                      de la variable ocupado
        V(&ocupado)
                  ocupado=1                                 Temina quantum, cambio CPU
                                                                                                                                                                      V(&ocupado)
                                                                        P(&lleno)                                                                                       envio señal a quien
                                                                           proceso                                                                                      esperaba ocupado
                 Temina quantum, cambio CPU                                bloqueado
                                                                                                                                                                      V(&vacio)
        V(&lleno)                                                                                                                                                        vacio=99
                 envio señal que proceso                                                                     Temina quantum, cambio CPU                               haz_algo(elemento)
                 esperaba
        produce_elem(&elemento)
                                                           Temina quantum, cambio CPU                proceso despierta
                                                                        proceso despierta                   intro_elem(elmento)
                                                                        P(&ocupado)
                                                                            ocupado=0                V(&ocupado)
                    Temina quantum, cambio CPU                              retira_elem(...                 ocupado=1

                                                                                                                          :
                                                                                                                          :




       Lectores / escritores

                                         W

                                                                              R
                                              R
                                                                          R


       Motivacion: Considere compartir una BD
       – Hay 2 clases de usuarios:
        • Lectores – no modifica la BD
        • Escritores – leen y modifican la BD
       – Tendremos muchos lectores a la vez y un solo escritor a
         la vez




Diaz Muñante Jorge                                                                                                                                                                             3

Más contenido relacionado

Más de Julio Pari

Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...
Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...
Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...Julio Pari
 
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesLinks kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesJulio Pari
 
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesComandos - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesJulio Pari
 
Indice General Tesis Sistemas UPC
Indice General Tesis Sistemas UPCIndice General Tesis Sistemas UPC
Indice General Tesis Sistemas UPCJulio Pari
 
Arquitectura Web FISI UNMSM
Arquitectura Web FISI UNMSMArquitectura Web FISI UNMSM
Arquitectura Web FISI UNMSMJulio Pari
 
Jelastic Enterprise
Jelastic EnterpriseJelastic Enterprise
Jelastic EnterpriseJulio Pari
 
Marketing Examen Parcial Profesor Osorio
Marketing Examen Parcial Profesor OsorioMarketing Examen Parcial Profesor Osorio
Marketing Examen Parcial Profesor OsorioJulio Pari
 
Ingenieria Software Examen Parcial 2013 2 Profesor Cordero
Ingenieria Software Examen Parcial 2013 2 Profesor CorderoIngenieria Software Examen Parcial 2013 2 Profesor Cordero
Ingenieria Software Examen Parcial 2013 2 Profesor CorderoJulio Pari
 
Documento de Arquitectura
Documento de ArquitecturaDocumento de Arquitectura
Documento de ArquitecturaJulio Pari
 
Solucion Examen Parcial Sistemas Digitales UNMSM FISI
Solucion Examen Parcial Sistemas Digitales UNMSM FISISolucion Examen Parcial Sistemas Digitales UNMSM FISI
Solucion Examen Parcial Sistemas Digitales UNMSM FISIJulio Pari
 
Práctica de Inventarios - Investigación Operativa II
Práctica de Inventarios - Investigación Operativa IIPráctica de Inventarios - Investigación Operativa II
Práctica de Inventarios - Investigación Operativa IIJulio Pari
 
Armas silenciosas para guerras tranquilas
Armas silenciosas para guerras tranquilasArmas silenciosas para guerras tranquilas
Armas silenciosas para guerras tranquilasJulio Pari
 
Formato de presentación de Proyecto UNMSM FISI
Formato de presentación de Proyecto UNMSM FISIFormato de presentación de Proyecto UNMSM FISI
Formato de presentación de Proyecto UNMSM FISIJulio Pari
 
Cuento para nuestro hijo y nuestra hija
Cuento para nuestro hijo y nuestra hijaCuento para nuestro hijo y nuestra hija
Cuento para nuestro hijo y nuestra hijaJulio Pari
 
Ingeniería de Software Examen Parcial
Ingeniería de Software Examen ParcialIngeniería de Software Examen Parcial
Ingeniería de Software Examen ParcialJulio Pari
 
Sistemas Distribuidos Examen Parcial
Sistemas Distribuidos Examen ParcialSistemas Distribuidos Examen Parcial
Sistemas Distribuidos Examen ParcialJulio Pari
 
Php07 consultas bd
Php07 consultas bdPhp07 consultas bd
Php07 consultas bdJulio Pari
 
Php06 instalacion my_sql
Php06 instalacion my_sqlPhp06 instalacion my_sql
Php06 instalacion my_sqlJulio Pari
 
Php05 funciones usuario
Php05 funciones usuarioPhp05 funciones usuario
Php05 funciones usuarioJulio Pari
 

Más de Julio Pari (20)

Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...
Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...
Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes #Ibm virtual la...
 
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesLinks kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Links kubernetes - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
 
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en KubernetesComandos - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
Comandos - Evento - Virtual Lab Despliegue de aplicaciones en Kubernetes
 
Indice General Tesis Sistemas UPC
Indice General Tesis Sistemas UPCIndice General Tesis Sistemas UPC
Indice General Tesis Sistemas UPC
 
Arquitectura Web FISI UNMSM
Arquitectura Web FISI UNMSMArquitectura Web FISI UNMSM
Arquitectura Web FISI UNMSM
 
Jelastic Enterprise
Jelastic EnterpriseJelastic Enterprise
Jelastic Enterprise
 
Marketing Examen Parcial Profesor Osorio
Marketing Examen Parcial Profesor OsorioMarketing Examen Parcial Profesor Osorio
Marketing Examen Parcial Profesor Osorio
 
Ingenieria Software Examen Parcial 2013 2 Profesor Cordero
Ingenieria Software Examen Parcial 2013 2 Profesor CorderoIngenieria Software Examen Parcial 2013 2 Profesor Cordero
Ingenieria Software Examen Parcial 2013 2 Profesor Cordero
 
Documento de Arquitectura
Documento de ArquitecturaDocumento de Arquitectura
Documento de Arquitectura
 
Solucion Examen Parcial Sistemas Digitales UNMSM FISI
Solucion Examen Parcial Sistemas Digitales UNMSM FISISolucion Examen Parcial Sistemas Digitales UNMSM FISI
Solucion Examen Parcial Sistemas Digitales UNMSM FISI
 
Práctica de Inventarios - Investigación Operativa II
Práctica de Inventarios - Investigación Operativa IIPráctica de Inventarios - Investigación Operativa II
Práctica de Inventarios - Investigación Operativa II
 
Armas silenciosas para guerras tranquilas
Armas silenciosas para guerras tranquilasArmas silenciosas para guerras tranquilas
Armas silenciosas para guerras tranquilas
 
UML Java
UML JavaUML Java
UML Java
 
Formato de presentación de Proyecto UNMSM FISI
Formato de presentación de Proyecto UNMSM FISIFormato de presentación de Proyecto UNMSM FISI
Formato de presentación de Proyecto UNMSM FISI
 
Cuento para nuestro hijo y nuestra hija
Cuento para nuestro hijo y nuestra hijaCuento para nuestro hijo y nuestra hija
Cuento para nuestro hijo y nuestra hija
 
Ingeniería de Software Examen Parcial
Ingeniería de Software Examen ParcialIngeniería de Software Examen Parcial
Ingeniería de Software Examen Parcial
 
Sistemas Distribuidos Examen Parcial
Sistemas Distribuidos Examen ParcialSistemas Distribuidos Examen Parcial
Sistemas Distribuidos Examen Parcial
 
Php07 consultas bd
Php07 consultas bdPhp07 consultas bd
Php07 consultas bd
 
Php06 instalacion my_sql
Php06 instalacion my_sqlPhp06 instalacion my_sql
Php06 instalacion my_sql
 
Php05 funciones usuario
Php05 funciones usuarioPhp05 funciones usuario
Php05 funciones usuario
 

C4 sincronizacion procesos_ssoo_mododecompatibilidad_

  • 1. Sistemas Operativos No sincronizados Tiempo 3:00 Mira en la refri (no hay leche) Sistemas Operativos Profesor: 3:05 Ir a la tienda Your picture here Ciclo 2012-1 Diaz Muñante Jorge 3:10 Mira en la refri (no hay leche) 3:15 Compra leche 3:20 Ir a la tienda 3:25 Llega a casa, guarda la leche 3:30 Compra leche Sincronizacion de Procesos 3:35 Llega a casa, guarda la leche.. ya hay¡¡¡ Proceso Deposito / Retiro Servidor de un Banco Los procesos pueden coincidir en accesar a datos comunes Proceso Deposito Proceso Retiro …. ….. leer registro lee Registro Saldo = Saldo + deposito Saldo = Saldo – Retiro Actualiza registro actualiza registro ….. ….. Puedo Ocurrir desafortunamente: Proceso Deposito Proceso Retiro …….. t1 Leer registro Problema en un Servidor: t2 Saldo = Saldo + deposito – Se da servicio a un conjunto de requerimientos t3 Lee Registro – Hay que hacerlo sin corromper la base de datos t4 Saldo = Saldo – Retiro t5 Actualiza el registro – Permitirlo puede costar mucho dinero t6 Actualiza registro Sincronización de Procesos Sincronización de Procesos Un proceso se ejecuta asíncronamente con respecto a otro, Sección crítica: porción de código en la que se debido a que sus ejecuciones son independientes. accede a un recurso compartido. Sin embargo hay instantes en que deben sincronizar sus Exclusión mutua: garantizar que en cada actividades. momento se pueda estar ejecutando como El acceso concurrente a datos compartidos puede resultar máximo una sección crítica asociada a un recurso. en datos inconsistentes. Mantener la consistencia en los datos requiere de Proceso Deposito Proceso Retiro mecanismos que aseguren la ejecución ordenada de …. <protocolo de entrada> ….. <protocolo de entrada> procesos concurrentes. leer registro lee Registro Saldo = Saldo + deposito Saldo = Saldo – Retiro Actualiza registro actualiza registro <protocolo de salida> <protocolo de salida> ….. ….. Diaz Muñante Jorge 1
  • 2. Sistemas Operativos Sección criticas Soluciones al Problema de la sección crítica Condiciones obligatorias 1. Exclusión Mutua. Si un proceso Pi esta ejecutando su sección crítica, A ingresa a sección critica entonces ningún otro proceso puede ejecutar su sección crítica. A libera la sección critica Proceso A 2. Ningún proceso que esta fuera de su sección crítica puede bloquear a otros. B intenta B ingresa B libera ingresar a a sección la sección 3. Ningún proceso puede ser esperar un tiempo arbitrariamente grande para sección critica critica critica entrar en su sección crítica. Proceso B 4. No se puede asumir la velocidad o rapidez de los procesos. B bloqueado T1 T2 T3 T4 ¿Adónde vamos con la sincronización? Los semáforos Programas Programas compartidos P1 Recurso Semáforo: Variable entera no Alto negativa, con las Nivel Locks Semaforos Monitores P3 P2 Send/Receive siguientes API P4 operaciones Hardwar Load/Store Disable Ints Test&Set e Comp&Swap S Dos operaciones: Vamos implementar varias primitivas de sincronizacion usando operaciones atomicas P(S): V(S): if ( S > 0 ) then if (alguien espera por S) then S:=S-1 lo transita a listo else else bloquea al proceso S:=S+1 Tipo y uso de semáforos Productor / Consumidor Uso Descripción Concurrencia acotada Semáforo contador o general Cuando un recurso será asignado, tomándolo de un conjunto de Produce un elemento recursos idénticos Guarda el elemento Semáforo es inicializado con el Productor número de recursos existentes Exclusión mutua Semáforo binario Inicializado en 1. Un proceso antes Buffer de ingresar a la sección critica X Y Z realiza la operación “P” y cuando termina la operación “V” 0 1 2 3 4 5 ............................................ 99 Señalización Semáforo sincronizador P1 con enunciado S1 P2 con enunciado S2 Consumidor Se desea que S2 sea ejecutado después de que S1 haya terminado Saca un elemento Consume el elemento Diaz Muñante Jorge 2
  • 3. Sistemas Operativos #define N 100 /* Número de espacios en el almacen (buffer) */ Problema de productor consumidor int cont = 0; /* Número de elementos en el almacen (buffer) */ typedef int semaphore #define N 100 /* Número de espacios en el almacen (buffer) */ int cont = 0; /* Número de elementos en el almacen (buffer) */ semaphore ocupado = 1; semaphore vacio = N; Solución prob. prod-cons usando semáforos semaphore lleno = 0; void productor( ) { int elemento; void productor( ) { while (TRUE){ /* ciclo infinito */ int elemento; produce_elem(&elemento); /* genera el siguiente elemento */ if (cont == N) /* si el almacen (buffer) esta lleno */ while (TRUE) { /* ciclo infinito */ sleep(); /* entonces se duerme */ produce_elem(&elemento); /* genera el siguiente elemento */ intro_elem(elemento); /* colocar elemento en almacen */ P(&vacio); /* decrementa contador espacios vacíos */ cont = cont+1 /* incrementa conta. elementos alma. */ P(&ocupado); / * entra en la sección crítica */ if (cont == 1) /* estaba vacio el almacen (buffer) */ intro_elem(elemento); /* colocar elemento en el almacen */ wake_up(consumidor); } V(&ocupado); /* sale de la sección crítica */ } V(&lleno); /* incrementa cont entradas ocupadas */ } } void consumidor( ) void consumidor( ) { { int elemento; int elemento; while (TRUE) { /* ciclo infinito */ while (TRUE) { /* ciclo infinito */ if (cont == 0) /* si el almacen (buffer) esta vacío */ sleep(); /* entonces se duerme */ P(&lleno); /* decrementa cont. entradas ocupadas */ retira_elem(&elemento); /* retira elemento del almacen */ P(&ocupado); /* entra en la sección crítica */ cont = cont - 1; /* decrementa conta. elementos alma */ retira_elem(elemento); /* toma un elemento del almacen */ if (cont == N-1) /* estaba lleno el almacen (buffer) */ V(&ocupado); /* sale de la sección crítica */ wakeup(productor); V(&vacio); /* incrementa contador entradas vacías */ consume_elem(elemento); /* consume el elemento */ haz_algo(elemento); /* hace algo con el elemento */ } } } } Ejemplo de corrida del algoritmo Continuación del ejemplo Valores iniciales: ocupado=1 vacio=N lleno=0 PRODUCTOR CONSUMIDOR PRODUCTOR CONSUMIDOR produce_elem(&elemento) P(&vacio) P(&vacio) vacio=98 vacio=99 P(&ocupado) P(&ocupado) Temina quantum, cambio CPU ocupado= 0 proceso espera liberación intro_elem(elemento) de la variable ocupado V(&ocupado) ocupado=1 Temina quantum, cambio CPU V(&ocupado) P(&lleno) envio señal a quien proceso esperaba ocupado Temina quantum, cambio CPU bloqueado V(&vacio) V(&lleno) vacio=99 envio señal que proceso Temina quantum, cambio CPU haz_algo(elemento) esperaba produce_elem(&elemento) Temina quantum, cambio CPU proceso despierta proceso despierta intro_elem(elmento) P(&ocupado) ocupado=0 V(&ocupado) Temina quantum, cambio CPU retira_elem(... ocupado=1 : : Lectores / escritores W R R R Motivacion: Considere compartir una BD – Hay 2 clases de usuarios: • Lectores – no modifica la BD • Escritores – leen y modifican la BD – Tendremos muchos lectores a la vez y un solo escritor a la vez Diaz Muñante Jorge 3