Sie sind auf Seite 1von 5

El Oso y las Abejas

Proyecto Unidad #1

Profesor: Ayudante: Alumno: Fecha final:

Federico Meza Sebastin Guerra Alex Rojas A ms tardar Martes 29 de Noviembre

Ingeniera Civil en Computacin :: Facultad de Ingenieras

El Oso y las Abejas

Introduccin
Como se ha visto a lo largo del curso, hemos trabajado bastante los aspectos de hilos (en adelante threads), semforos, sincronizacin, y retardos. Por esto, se presenta en este documento el primer proyecto perteneciente a la unidad 1 del mdulo de Sistemas Operativos, en el cual se abarcan todas las reas antes mencionadas.

Descripcin de la solucin obtenida


La Problemtica
El proyecto de la Unidad #1 presentaba un problema de sincronizacin de Threads llamado El Oso y las Abejas, el cual trataba acerca de una cierta cantidad de abejas (n para ser ms especfico) y un oso hambriento, que comparten un recipiente para almacenar miel. En su primera etapa, dicho recipiente se encuentra vaco, y tiene una capacidad de almacenaje (al igual que la abejas, ingresada por el usuario) denotada por H. El ciclo del problema es bastante sencillo de entender. Primeramente, el oso se encuentra durmiendo y se mantiene as hasta que el recipiente se encuentre lleno en su totalidad, entonces l se despierta para disfrutar de tan rico manjar. Una vez terminado todo el recipiente, se acomoda y vuelve a dormir. Al ser un ciclo normal de la naturaleza, las abejas vuelven a elaborar la tan exquisita y deseada miel, colocndola posteriormente, en el recipiente. Cabe recalcar que cada abeja elabora solo una porcin de miel a la vez. Finalmente, una vez que el proceso iterativo culmina llenndose nuevamente el recipiente, la ltima abeja en poner su porcin es la encargada de despertar al oso y as avisarle que su comida esta lista.

Las Restricciones
Algunas de las caractersticas que deba poseer nuestro programa fueron las siguientes: 1. La implementacin concurrente del escenario antes expuesto, utilizando pthreads y sus primitivas de sincronizacin. 2. Representar, a los actores del programa (Oso y Abejas) como threads independientes. 3. Utilizar semforos para la sincronizacin de ser necesaria. 4. As como tambin, usar retardos para una mejor evaluacin. 5. El ingreso de los datos n y H (vistos en la seccin de problemtica), debieron ser ingresados a travs de la lnea de comandos del programa. 6. A su vez, se deba mostrar por pantalla salidas que permitieran seguir la ejecucin del programa. 7. Y finalmente, que nuestra solucin estuviera libre de deadlock. En cuanto a la forma de trabajo y entrega, se debi trabajar individualmente con fecha de entrega a ms tardar el da 29 de Noviembre de 2011, a las 10:00 hrs.

Sistemas Operativos

Pgina 2

El Oso y las Abejas


La Solucin
Para poder realizar este proyecto, revis una serie de tareas relacionadas con la temtica del problema (threads, semforos, retardos, entre otros), llegando a la idea de que la idea de El Oso y las Abejas era una mezcla de los dos primeras tareas de laboratorio que nosotros habamos realizado. Por ende, para poder desarrollar el programa, revis ambas tareas paso por paso para ver qu parte de cada una poda rescatar y reutilizar en el proyecto de la unidad. De stas, recog la forma de utilizar los semforos como bien aparece documentado dentro del cdigo...
/* * Cdigo reutilizado desde las tareas anteriores (por la similitud) * para la implementacin de semaforos. */ void init(sem_t *sem, int valor_inicial){ if(sem_init(sem, 0, valor_inicial)){ printf("Error inicializando semaforo\n"); exit(EXIT_FAILURE); } } void p(sem_t *sem){ if(sem_wait(sem)){ printf("Error fatal haciendo sem_wait()\n"); exit(EXIT_FAILURE); } } void v(sem_t *sem){ if(sem_post(sem)){ printf("Error fatal haciendo sem_post()\n"); exit(EXIT_FAILURE); } }

Y el mtodo para la creacin de los threads, dando como ejemplo el thread Oso...
/* * Creacin del thread oso. * Existe solamente un oso comiln. */ printf("main(): creando thread oso\n"); printf("Oso durmiendo... zZz...\n"); if(pthread_create(&bruin, NULL, bear, NULL)){

Sistemas Operativos

Pgina 3

El Oso y las Abejas


printf("Error creando thread oso\n"); exit(EXIT_FAILURE); }

Por otro lado, utilic dos funciones para los hilos, una denominada bee, encargada de generar las porciones portions, y de decidir en algn momento de la ejecucin si se deba llamar a otra abeja para seguir produciendo o bien despertar al oso para que comiera...
//Funcion de los threads abeja. void *bee(void *honey){ long full = (long)honey; while(1){ p(&mutex); portions++; printf("Se almacena la porcion %d en el recipiente...\n", portions); if(portions == full){ printf("Recipiente lleno, ultima abeja le avisa al oso!\n"); sleep(rand()%MAX_DELAY); //Retraso en ir a avisarle al oso. v(&recipient); } else{ sleep(rand()%MAX_DELAY); //Retraso en almacenar la miel cada abeja. v(&mutex); //Continua la siguiente abeja. } } }

Y la otra descrita como bear, que slo se encarga de que cuando el thread oso recibe el recipiente, vaciarlo y avisar a las abejas de que ya comi...
//Funcin del thread oso. void *bear(void * aux){ while(1){ p(&recipient); //Oso despierta, y pide el recipiente. portions = 0; printf("El oso se ha comido todo el recipiente!, vuelve a dormir... zZz...\n\n"); sleep(rand()%MAX_DELAY); //Retraso en que el oso se quede dormido. v(&mutex); } }

La funcin principal main slo se encarga de inicializar y crear algunas cosas, adems de recibir los parmetros necesarios para buena ejecucin del programa.

Sistemas Operativos

Pgina 4

El Oso y las Abejas


La Sincronizacin
Para poder sincronizar los hilos y el trabajo de las funciones tanto de las abejas como del oso, realic lo siguiente: 1. A partir de las tareas de Lectores Escritores y Productores Consumidores un algunas partes que me fueron siendo tiles a medida que pensaba como abarcar el problema. 2. Con esto, me di cuenta de que los ciclos en los que se trabajara eran infinitos por lo tanto, ese era un punto a considerar, lo cual incorpor mediante el uso de while(1) abarcando gran parte del cdigo de las funciones bee y bear como se vio con anterioridad. Cabe sealar que tambin se pudo haber realizado con alguna otra alternativa como un fot(), pero esto slo lograba aumentar la cantidad de cdigo y por ende malas prcticas. 3. Fue esencial utilizar dos semforos. El primero mutex utilizado en la exclusin mutua de los hilos, y el otro recipient dedicado especialmente a la sincronizacin entre las abejas y el oso, a partir de la competencia por los recursos que significaba el recipiente. 4. Lo dems, es trabajo de una variable global llamada portions la cual se encarga de contar las porciones que las abejas van dejando en el recipiente y una vez que se llena, con la utilizacin de los semforos, se vaca para volver a comenzar el ciclo natural.

Las Limitaciones
o Si bien, el programa qued funcionando con las entregas solicitadas, qued un aspecto por mejorar que es la verificacin ms completa de las entradas, es decir, revisar que los parmetros que el usuario ingresa sean realmente enteros vlidos. Como solucin, ms adelante se debera incorporar una funcin de verificacin de enteros a partir del string que ingresa el usuario.

o Otro punto, es la cota mxima que le di al tamao de la lista de threads de abejas. Obviamente es configurable, pero no se especificaban limitaciones en el enunciado. En consecuencia, decid dejarle un mximo de 100. Como agregu anteriormente, esta parte del programa es configurable, slo dej una cota de 100 por defecto, simplemente para efectos de tiempo, ya que utilizamos en el proyecto retardos de tiempo para una mejor visualizacin de las salidas y la sincronizacin.

Sistemas Operativos

Pgina 5

Das könnte Ihnen auch gefallen