PRÁCTICAS DE LABORATORIO DE SISTEMAS OPERATIVOS

TERCERA PRÁCTICA OBLIGATORIA (2001-02)

La panadería


  1. Enunciado.

    En esta práctica se intentará simular el comportamiento (la sincronización) de una panadería mediante llamadas a la API de Win32.

    En la panadería hay una mesa para amasar, un horno, un cesto donde se depositan los panes con capacidad para cincuenta panes, un conjunto de panel y dispensador de tickets de turno marca ACME®, un mostrador y una caja registradora.

    Los habitantes de la panadería y su rutina de vida son los siguientes:
    1. Un panadero:
      • Amasa pan en la mesa de amasar.
      • Hornea el pan.
      • Lleva el pan al cesto de panes. En el caso de que el cesto esté lleno, se espera a que haya un hueco para depositar el nuevo pan.
    2. Dos dependientes. Cada uno:
      • Pulsa el botón del panel marca ACME® para que aumente su número en una unidad.
      • Va al mostrador y espera a que el cliente de dicho número llegue y le pida pan.
      • Como todos los clientes piden un pan, va a por él al cesto de panes. Si no hay en esos momentos, espera a que el panadero deposite uno.
      • Entrega el pan al cliente.
      • Espera a que el cliente le pague. El pan cuesta un euro.
      • Introduce el dinero en la caja.
    3. Tres clientes. Cada uno:
      • Toma un ticket del dispensador de tickets de turno marca ACME®.
      • Espera a que llegue su turno.
      • Se dirige al mostrador del dependiente que pulsó el botón cuando apareció su número.
      • Pide un pan.
      • Espera a que el dependiente se lo dé y le paga.
      • Vuelve a su sitio y se come el pan.
    El número del primer ticket de turno es 1. En la caja no hay dinero al inicio de la simulación ni tampoco hay panes en el cesto de panes.

    Los clientes sufren una extraña enfermedad por la que deben comer panes continuamente, castigo del que se hicieron acreedores por ver la serie completa de "Operación Triunfo" y posteriores secuelas. Como la misericordia divina es infinita, y para compensar, disponen de un bolsillo donde no se acaba nunca el dinero. Aunque bien pensado, no deja de ser cruel tener tanto dinero y no poder gastarlo más que en pan, dicho sea de paso. En cambio, el que hace su agosto es el panadero que, a base de vender tanto pan, ha pasado a ser el hombre más rico de Salamanca y poder así gastar toda su fortuna en realizar un sueño que ambicionaba desde tiempo atrás: comprar en propiedad un piso de 30 metros cuadrados en la Rúa Mayor.

    El programa que se debe realizar es una aplicación de consola de Win32 cuyo nombre será pan.cpp. El ejecutable que resulte de la compilación de dicho programa por Visual C++ admitirá un único parámetro obligatorio en la línea de órdenes. Dicho parámetro especifica la velocidad de la simulación y será el valor que se pase a la función inicio de la biblioteca de enlace dinámico pansal.dll que se describe más abajo.

    Cada personaje de la simulación vendrá representado por un hilo de ejecución. Los hilos deberán sincronizarse para que la simulación sea razonable. Por ejemplo, el dependiente no puede dar un pan si no hay cliente que lo reciba. Cuando un hilo tenga que esperar por cualquier circunstancia, no deberá consumir CPU innecesariamente. La simulación durará 30 s, pasados los cuales el panadero dejará de producir pan. Esto provocará que todo el sistema acabe por bloquearse, con dos clientes esperando en el mostrador y los dos dependientes esperando por pan en el cesto. En este momento, se deberá comprobar que el número de clientes atendidos concuerda con el dinero recaudado en la caja. En caso de no ser así, para localizar al ladrón debéis comprobar si algún recurso compartido no ha sido protegido adecuadamente. El número de clientes atendidos (o el dinero recaudado) servirá para evaluar la práctica. Una vez la práctica esté bien (un cinco) la nota que se obtenga a partir de ahí será mayor cuanto más dinero se recaude en esos 30s.

  2. DLL de presentación

    Para descargaros del trabajo de realizar una presentación por pantalla del problema, para uniformizar dicha presentación y para que el programa diagnostique algunos posibles fallos de sincronización, haréis uso de una DLL que se os dará. El nombre de la DLL será pansal.dll y vendrá acompañada por un fichero de cabeceras pansal.h donde se especifica el prototipo de las funciones exportadas (en realidad un puntero al tipo de dichas funciones) y la definición de algunas macros para hacer el manejo de las funciones más sencillo. La DLL exportará las siguientes dos funciones que debéis usar en la práctica:


    La DLL comprueba algunos problemas de sincronización y avisa de ellos con un mensaje indicando qué proceso provocó el error. No permitirá la realización de más procesos para poder ver el mensaje y que no se produzcan más errores secundarios. Por desgracia, y como ya conocéis, el hecho de que la DLL no detecte ningún error en una o en cien ejecuciones concretas no significa que la práctica sea correcta. Por eso es muy adecuado hacer un buen diseño previo.

    Podéis conseguir aquí la DLL y el fichero de cabecera. No pulséis directamente sobre el enlace, sino con el botón derecho del ratón seleccionad la opción "Guardar destino como..." que aparece en el menú de contexto. Prestad atención a la página principal de la asignatura por si la DLL tuviera que ser actualizada.

  3. Pasos recomendados para realizar la práctica más fácilmente.

    1. Decidir qué elementos de sincronización se van a usar.
    2. Determinar cuál será su valor inicial.
    3. Hacer un esquema de las acciones y el uso de los elementos de sincronización por parte de cada tipo de proceso (panadero, dependiente y cliente). La información de estos tres primeros puntos se debe incluir en la documentación de la práctica.
    4. Comenzar el programa principal pan.cpp. Primero tenéis que cargar la bilbioteca de enlazado dinámico pansal.dll. Cuidad de comprobar el valor devuelto por LoadLibrary para ver que no ha habido problemas. Si todo va bien, la pantalla se limpiará y aparecerá durante dos segundos el mensaje:
      Biblioteca de enlazado dinámico pansal.dll
      © 2002 Guillermo González Talaván. Universidad de Salamanca
      
    5. Lo siguiente es lograr ejecutar una función de la biblioteca. La candidata ideal es inicio. Cuidado con el paso por referencia del puntero a la estructura struct datos_panaderIa. De nuevo, comprobad que no falla la función de la API GetProcAddress. Llamad a la función obtenida y comprobad que en la pantalla aparece el estado inicial del sistema.
    6. Haced que el intervalo que se le pasa a la función inicio sea el introducido en la línea de órdenes. Para ir probando la práctica, usad un intervalo largo (500 ms, por ejemplo) e idlo disminuyendo según progreséis.
    7. Ahora podéis intentar cargar la función accion y probarla haciendo que el panadero amase y vaya al horno.
    8. Es la hora de crear el hilo del panadero y que ejecute continuamente su ciclo de acciones. Cuando la cesta se llene, la DLL mostrará el error.
    9. Se puede introducir el elemento de sincronización para que el panadero no pueda echar un pan en la cesta llena y se quede bloqueado.
    10. Vamos con los hilos de los dependientes. Que pulsen el botón y que vayan al mostrador y se queden esperando a que llegue el cliente del número que corresponde y les pida pan.
    11. Se crean los hilos de los clientes. Haced que cojan un número y se queden esperando a que les toque. Yo recomiendo que todos los procesos se queden bloqueados y, cuando cualquier dependiente pulse el botón de turno, despierte a todos y, aquel cuyo número coincida con el de algún dependiente, acuda al mostrador correspondiente. Pero cuidado, porque puede que cuando el dependiente haya pulsado el botón aún ningún cliente haya cogido el número correspondiente.
    12. A partir de ahora, a la práctica se le va haciendo evolucionar paso a paso hasta completar el ciclo de dependientes y clientes. El cliente pide pan y espera a que se lo den.
    13. El dependiente va a por pan y espera a que le paguen. El dependiente no debe coger pan si la cesta está vacía, como es natural.
    14. El cliente paga y se va a comer y repetir el ciclo.
    15. El dependiente introduce el dinero en la caja y repite el ciclo.
    16. Ahora es el momento de poner el límite de 30s para que el panadero pare la producción.
    17. Finalizad reduciendo el intervalo de representación a cero y corregid errores que se puedan producir.
  4. Plazo de presentación.

    Hasta el miércoles 12 de junio de 2002, inclusive e improrrogable. Consultad la página web para ver la lista de prácticas entregadas el viernes 14 de junio y subsanar posibles errores (de 12:00 a 14:00).

  5. Normas de presentación.

    Acá están. Aunque esta práctica sea de Windows NT, debéis depositarla a tiempo en encina, como es habitual. Se debe incluir en la documentación entregada además del listado del programa un esquema sencillo de la solución propuesta, que incluya: los elementos de sincronización usados (semáforos, mutexes, etc.) y su valor inicial y, para cada tipo de proceso (panadero, dependiente y cliente) un esquema de las operaciones que realiza sobre los objetos de sincronización y las acciones que ejecuta en cada ciclo de ejecución.

  6. LPEs.



  7. Prácticas propuestas en años anteriores.


© 2002 Guillermo González Talaván.