Está en la página 1de 5

Sistemas Operativos II I (1 C.

2009)
Prof. Mara Feldgen

Trabajo Prctico N 1: Ejercicio de concurrencia con IPC

Fecha de entrega: 26 de mayo de 2009. MODALIDAD DE ENTREGA DEL TRABAJO PRCTICO RESUELTO:
El trabajo prctico se debe resolver en forma individual y se debe enviar por e-mail a sd.mfeldgen@gmail.com obligatoriamente en la fecha de vencimiento o antes, asista o no asista Ud. a clases, de la siguiente forma: Subject: sisop09 tp1 Armar un directorio con su apellido y zipearlo. El directorio debe contener: El archivo tp1_cartula.pdf completando todos los campos indicados como obligatorios en el archivo tp1_cartula.doc. y sin alterar o eliminar sus campos. Un archivo tp1_informe.pdf con los ejercicios que correspondan a preguntas, justificaciones, decisiones de diseo, grficos o diagramas, conceptos tericos, etc. El informe debe tener las hojas numeradas. La resolucin del TP conteniendo y listo para correr desde el Desktop del Knoppix con un directorio con su apellido y con la estructura que se describe: ! un archivo de texto (puro) llamado leame.txt conteniendo " con una lista de los programas y archivos que requiere " explicacin de como se compilan " explicacin de como se corren los programas ! un directorio Prog: con los fuentes de los programas: ! Los primeros renglones del programa fuente contienen el nombre del autor y una breve descripcin del programa. ! un directorio Ejec: con los ejecutables con el mismo nombre del fuente, para correr en las computadoras de la facultad usando Knoppix. ! un directorio Comp: con los makefiles para compilarlos. ! un directorio Archivos: con los archivos que requieran los ejercicios

Sistemas Operativos II I (1 C. 2009)


Prof. Mara Feldgen

Trabajo Prctico N 1: Ejercicio de concurrencia con IPC

Trabajo Prctico de Concurrencia con IPC


Repaso de conceptos de concurrencia
Ver apunte de concurrencia que se deja en el blog con el nombre de concurre.pdf A continuacin se explican brevemente las primitivas de semforos y la clase t_sem que se deber usar en la materia. Para pipes, colas de mensajes y shared memory se usarn las primitivas provistas por UNIX, con las restricciones que se indican a continuacin. 1. Semforos La implementacin de semforos en UNIX es particularmente oscura. En esta gua (y en la materia, en las prcticas y trabajos prcticos) se usar un conjunto de primitivas para enfocarnos en el diseo de programas concurrentes mas que en los detalles de UNIX. Las primitivas a usar se basan en las definiciones clsicas de semforos dadas por Dijkstra.
P (s) Operacin P sobre un semforo S. Conocida adems como down o wait

equivale al siguiente seudocdigo:


while s-(s==0) <bloquear>

Esta primitiva funciona en conjunto con V(S) Conocida adems como up o signal.
s++ <liberar un proceso bloqueado en s>

Segn la definicin y el uso que le daremos, no se puede acceder al valor del semforo. A continuacin se listan las primitivas en C++, del archivo t_sem.h.
#ifndef t_sem_h #define t_sem_h #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <unistd.h> class t_sem{ char id; key_t clave; // la clave para obtener el semaforo bool existe; // si ha sido creado public: int semid; // El handler del semaforo t_sem(key_t clave); // crea establece identificadores // y/o accede a un semaforo ya existente bool IniSem(int n); // da un valor inicial al semaforo bool P(); // operacion de p (wait) (Proveeren) bool V(); // operacion de v (signal) (Verhoogen) bool EliSem(); // dispone del semaforo };

Sistemas Operativos II I (1 C. 2009)


Prof. Mara Feldgen

Trabajo Prctico N 1: Ejercicio de concurrencia con IPC


#endif

3. Colas de mensajes: Se usarn las siguientes primitivas del UNIX: para el manejo de colas de mensajes, con tipos de mensajes: o o o o int msgget( ) para crear una cola o conectarse a una cola int msgrcv( ) para recibir mensajes int msgsnd( ) para enviar mensajes int msgctl ( ) con IPC_RMID para disponer (destruir o liberar) la cola.

4. Shared memory: Se usarn las siguientes primitivas del UNIX: para el manejo de shared memory (no use arreglos de mensajes con este tipo de primitivas): o int shmget( ) para crear una cola o conectarse a una cola o int shmat( ) para mapear el segmento en el espacio de datos del proceso que quiera utilizarlo. o int shmdt( ) para desmapearlo. o int shmctl ( ) con IPC_RMID para disponer (destruir o liberar) el segmento. 5. Problemas Todos los problemas que siguen, salvo los mas simples, tienen aplicacin en el ambiente de comunicaciones y en la construccin de un Sistema Operativo. Al distribuirlos la solucin se va a complicar enormemente. Todos los programas se deben resolver usando procesos (NO SE ADMITEN THREADS), y cada proceso, si es producto de un fork, se carga con un exec de algn tipo. Recuerde: no usar funciones con buffer para mostrar informacin en pantalla, ya que puede perderse la secuencia real de acciones y el entrelazado de ejecucin de los distintos procesos. Debe usar el system call write sobre el file descriptor stdout (ver en el ejemplo). Ejemplo de uso de fork y exec y de la estructura de un programa en C:
/* Parte de un programa que crea los procesos para resolver el problema. * Descripcion: describir la funcion del programa * Sintaxis: como se invoca el programa y sus parametros * Usa: funciones propias que invoca */ #include "xx.h" /* include que contiene las constantes y definiciones y bibliotecas */ void finhijos(); /* funcion que espera que terminen los hijos */ /* instrucciones del programa principal */ int main (int argc, char** argv) { int parametro; /* parametro a pasar la proceso hijo */ unsigned childpid; /* pid del hijo */ char mostrar[80]; /* mensaje para mostrar en pantalla */ char *pname; /* nombre del programa */ static char el_parametro[15]; /* parametro para el proceso hijo */

Sistemas Operativos II I (1 C. 2009)


Prof. Mara Feldgen

Trabajo Prctico N 1: Ejercicio de concurrencia con IPC

pname = argv[0]; /* obtiene el nombre del programa en ejecucion */ /* /* Instrucciones con todas las inicializaciones /* y creacin de los IPC */ (void) signal(SIGCHLD, finhijos); /* * CREACION DE UN PROCESO HIJO */ if ((childpid = fork()) < 0) { perror("Error en el fork"); /* muestra el mensaje de error que corresponde al contenido del errno */ exit(1); } else if (childpid == 0) { /* * PROCESO HIJO (child) */ /* se muestra un mensaje en la pantalla indicando el contenido del parametro que se pasa al programa que se invoca con la exec */ sprintf (mostrar,"%s: parametro que va a recibir el proceso %d\n", parametro); write(fileno(stdout), mostrar, strlen(mostrar)); /* se convierte en este caso, el parametro de integer a string */ sprintf(el_parametro, "%d\n",parametro); /* /* /* se reemplaza el ejecutable con el del el nuevo programa */ execlp("./pepe", "pepe", el_parametro, (char *)0); /* si sigue es que no se ejecuto correctamente el execlp */ perror("Error al lanzar el programa pepe"); exit(3); } /* * PROCESO PADRE, sigue ejecutando */ /* siguen las instrucciones del proceso principal */ } /* fin del programa */ /* * Procedimiento finhijos: */ void finhijos() { union wait status; while (wait3((int *)&status, WNOHANG, (struct rusage *)0) >= 0); } Elimina Procesos-hijos que terminaron

Sistemas Operativos II I (1 C. 2009)


Prof. Mara Feldgen

Trabajo Prctico N 1: Ejercicio de concurrencia con IPC Enunciado:


La heladera.

Considere el siguiente sistema de una heladera que vende 2 tipos de helado: de fruta y de crema. Hay 4 gustos de cada uno. Cada tipo de helado est en un puesto de servicio distinto. Y hay 4 tamaos de vaso de kilo, 1 kilo, 1 kilo y 2 kilos. El cliente llega a las cajas ponindose en una cola. El cajero le pregunta que tamao de vaso quiere y en base a eso le cobra y lo pone en otra cola. Hay mltiples vendedores, que atienden la cola de clientes que pagaron. El vendedor obtiene el vaso y le pregunta al cliente cuantos gustos quiere. Calcula cuantos gramos de helado debe poner de cada gusto en el vaso. Por cada gusto le pregunta cual quiere y por cada tipo, solo un vendedor por vez puede estar sirviendo ese tipo de helado. Completa la carga del gusto y lo pesa en la balanza (hay una sola balanza), si falta completa, si sobra saca un poco, por lo cual debe acceder nuevamente al puesto de servicio. Mientras pesa, otro vendedor puede cargar helados de ese tipo. As procede con todos los gustos. El sistema lleva la cuenta de cuantos gramos de helados se vendieron, por tipo y por gusto, y cuantos vasos se usaron de cada tipo. Cada cajero, vendedor y balanza son procesos separados. Los helados y los vasos son recursos compartidos. Hay una cantidad mxima de vasos. Los helados hay suficiente para cumplir con todos los pedidos siempre. Simule los clientes que llegan por medio de proceso que lee de un archivo. Simule la cantidad y los gustos por medio de azar, lo mismo el uso de la balanza y el peso. Simule los dos puestos de servicio y los vasos por medio de una memoria compartida. 1. Disee inicialmente el sistema para dos cajeros y dos vendedores. Haga un esquema de su comportamiento. Inserte las acciones adecuados tal que los cajeros se sincronicen entre s con la obtencin de vasos y los vendedores entre si con cada tipo de helado (informe) 2. Implemente el sistema anterior. Compruebe y muestre que el sistema funciona en todos los casos. 3. Extienda el sistema a mas cajeros y vendedores. 4. Extienda el problema suponiendo que hay porciones de 1/8 kilo de helado y es el mnimo que el cliente puede comprar de un gusto. Hay 10 porciones de cada gusto y hay repositor de gustos de helado (otro proceso) que repone los gustos de ambos tipos ( hay solo capacidad para a lo sumo 10 porciones de cada gusto). El vendedor no sabe sumar, asi que por cada pedido accede tantas veces a la balanza hasta que completa el pedido del cliente. 4.1. Muestre como se modifica su diseo anterior (informe) 4.2. Implemente y compruebe. 5. Extienda el sistema anterior con un mximo de porciones de helado de cada gusto. Si no alcanza y el cliente no quiere otros gustos o no hay, uno de los cajeros debe devolverle dinero y debe atenderlo antes que al prximo cliente. 5.1. Muestre como se modifica su diseo anterior (informe) 5.2. Implemente y compruebe.

También podría gustarte