Escolar Documentos
Profissional Documentos
Cultura Documentos
ECP 1 de 7
I.
II.
OBJETIVO DE LA PRACTICA
Al finalizar la presente prctica, el estudiante: 1. Conoce la semntica de los semforos en Linux 2. Desarrolla aplicaciones concurrentes utilizando semforos.
III.
TRABAJO PREPARATORIO. Para un trabajo con mejores resultados, es imprescindible que el estudiante: 1. Tenga conocimientos de programacin en C en el sistema operativo Linux 2. Conozca la teora de gestin de procesos en los sistemas operativos. 3. Conozca el marco terico de funcionamiento de los semforos.
IV.
MATERIALES. Para el desarrollo de la presente prctica es necesario contar con: 1. Computador con arquitectura x86. 2. Sistema operativo Linux instalado en el computador o en su defecto un liveCD o liveUSB que incluya el compilador GCC y un editor de texto pre instalado.
V.
MARCO TEORICO
CREACIN DE SEMFOROS Un semforo se crea con la funcin sem_init, que se declara de la siguiente manera:
#include <semaphore.h> int sem_init ( sem_t *sem, int pshared, unsigned int value );
Esta funcin inicializa un objeto semforo al cual se apunta mediante sem, establece sus opciones de compartir, y le da a este un valor inicial entero. El parmetro pshared controla el tipo de semforo. Si el valor de pshared es 0, entonces el semforo es local al proceso actual. De otro modo, el semforo puede ser compartido entre procesos. En nuestro caso, estamos interesados solo en los semforos que no son compartidos entre procesos. Pasar un valor diferente de cero para pshared har que la llamada falle. La variable value almacena el valor del semforo.
MANEJO DE SEMFOROS El siguiente par de funciones controla el valor del semforo y se declaran de la siguiente manera
Ambos toman un puntero al objeto semforo inicializado por una llamada a sem_init. La funcin sem_post incrementa atmicamente el valor del semforo en 1. Atmicamente significa que, si dos hilos tratan simultneamente de incrementar el valor del semforo en 1, estos no interfieren, como ocurrira si dos programas leen, incrementan y escriben un valor a un archivo al mismo tiempo. El semforo ser siempre correctamente incrementado en valor a 2, puesto que dos hilos intentaron cambiarlo. La funcin sem_wait decrementa atmicamente el valor del semforo en 1, pero siempre espera hasta que el semforo tenga un valor diferente de 0 primero. As, si se llama sem_wait sobre un semforo con un valor de 2, el hilo continuar ejecutndose pero el semforo se decrementar en 1. Si sem_wait se invoca sobre un semforo con un valor 0, entonces la funcin esperar hasta que algn otro hilo incremente el valor de modo que este no sea ms 0. Si dos hilos estn esperando en sem_wait porque el mismo semforo tome un valor diferente de 0 y este es incrementado una vez por un tercer proceso, entonces solo uno de los dos procesos en espera podr conseguir decrementar el semforo y continuar; el otro continuar esperando. La habilidad de realizar un test and set atmico en una sola funcin es lo que hace de los semforos tan valiosos.
DESTRUIR SEMFOROS La ltima funcin sobre semforos es sem_destroy. Esta funcin recoge el semforo cuando no es requerido ms. Esta funcin se declara de la siguiente manera:
#include <semaphore.h> int sem_destroy ( sem_t * sem );
Esta funcin toma un puntero a un objeto semforo y recoge cualquier recurso que este pueda tener. Si se intenta destruir un semforo por el cual est esperando un hilo, se retornar un error. Como muchas funciones de Linux, estas funciones retornan 0 si tienen xito.
VI.
TRABAJO DE LABORATORIO. 1. Escribir una aplicacin que resuelva el problema del Productor/Consumidor utilizando semforos Solucin
/* * Nombre * Proposito
: :
: : :
prodcons.c Resuelve el problema del Productor/Consumidor utilizando semaforos Edwin Carrasco 26/08/2004 06/12/2007
/*libreria de semaforos*/ /*libreria de hilos*/ /*numero de ranuras del buffer*/ /*buffer de elementos producidos*/ /*semaforo que controla si el buffer esta lleno*/ /*semaforo que controla si el buffer esta vacio*/ /*semaforo que garantiza la exclusion mutua*/
#define BUFSIZE 5 int buffer[BUFSIZE]; sem_t lleno; sem_t vacio; sem_t mutex;
/* Productor */ void *productor(void *arg) { int j; int indicep = 0; int producido; while (1) { /*producir un elemento (un caracter)*/ producido = (rand() % 26) + 65; sem_wait(&vacio); sem_wait(&mutex); /*decrementa el contador vacio*/ /*entrar en la region critica*/
/*Agregar elemento al buffer*/ buffer[indicep] = producido; /*Actualizar indicep */ indicep = (indicep + 1) % BUFSIZE; /*Mostrar elemento producido*/ printf("Agregando : %c\n", producido); /*Mostrar el buffer*/ for(j = 0; j < BUFSIZE; j++) printf("%c\t", buffer[j]); printf("\n\n"); sem_post(&mutex); sem_post(&lleno); sleep(1); } pthread_exit(0); } /*salir de la region critica*/ /*incrementa el contador de ranuras llenas*/ /*duerme 1 segundo*/
/* Consumidor */ void *consumidor(void *arg) { nt j; int indicec = 0; int consumido; while(1) { sleep(3); sem_wait(&lleno); sem_wait(&mutex);
/*el consumo toma 3 segundo*/ /*decrementa el contador lleno*/ /*entrar en la region critica*/
/*Sacar un elemento del buffer*/ consumido = buffer[indicec]; /*Actualizar indicec */ indicec = (indicec + 1) % BUFSIZE; /*Mostrar elemento consumido*/ printf("\t\t\t\t\tSacando : %c\n", consumido); sem_post(&mutex); sem_post(&vacio); } pthread_exit(0); } /*salir de la region critica*/ /*incrementa el contador de ranuras vacias*/
/* Modulo Principal */ main() { /*Declaracion de hilos*/ pthread_t idprod; /*Productor*/ pthread_t idcons; /*Consumidor*/ /*Inicializacion de semaforos*/ /*Inicialmente hay 0 elementos llenos*/ sem_init(&lleno, 0, 0); /*inicialmente hay BUFSIZE elementos vacios*/ sem_init(&vacio, 0, BUFSIZE); /*solo un hilo puede entrar en su seccion critica*/ sem_init(&mutex, 0, 1); printf("\nTamao del buffer %d\n\n", BUFSIZE); printf("Para terminar la simulacion presionar CTRL + C\n\n");
/*Creacion de hilos*/ /*Productor*/ pthread_create(&idprod, NULL, productor, NULL); /*Consumidor*/ pthread_create(&idcons, NULL, consumidor, NULL); /*Terminar hilos*/ pthread_join(idprod, NULL); pthread_join(idcons, NULL); }
VII.
PRACTICAS DE LABORATORIO 1. Escriba una aplicacin que resuelva el problema de los lectores/escritores utilizando semforos. El enunciado del problema es: existe un objeto compartido, por una serie de procesos concurrentes. Algunos procesos desean escribir (escritores) y otros leer (lectores). Es aceptable tener mltiples procesos leyendo al mismo tiempo, pero si un proceso est actualizando, ninguno otro podr acceder a ella, ni siquiera los lectores. 2. Escriba una aplicacin que resuelva el problema de la barbera, cuyo enunciado es: Una barbera tiene 3 sillas, tres barberos, una zona de espera en la que se pueden acomodar cuatro clientes en un sof y una sala de espera de pie para el resto de los clientes. Las medidas contra incendios limitan el nmero total de clientes en la tienda a 20. Un cliente no entra en la tienda si su capacidad est al completo con otros clientes. Una vez dentro, el cliente toma asiento en el sof o permanece de pie si el sof est lleno. Cuando un barbero esta libre, se atiende al cliente que ha estado ms tiempo en el sof y, si hay clientes de pie, el que ha entrado en la tienda hace ms tiempo toma asiento. Cuando finaliza el corte de pelo de un cliente, cualquier barbero puede aceptar el pago, pero, debido a que solo hay una caja registradora, solo se acepta el pago de un cliente a la vez. Los barberos dividen su tiempo entre cortar el pelo, aceptar pagos y dormir en su silla esperando clientes. 3. Escriba una aplicacin que resuelva el problema de la cena de los filsofos, utilizando semforos. El enunciado del problema es el siguiente: Sobre una mesa se encuentran 5 platos de comida y 5 tenedores dispuestos uno entre cada plato. A la mesa estn sentados 5 filsofos que pasan su tiempo pensando. Cuando un filsofo tiene hambre, debe tomar dos tenedores para poder comer: un tenedor de su derecha y otro de su izquierda. Si solo toma un tenedor; este debe esperar hasta que un filsofo de su lado deje de comer (ponga los tenedores sobre la mesa) y se ponga a pensar.
VIII.
BIBLIOGRAFIA
LIBROS [L01]. Carretero J, et. al Sistemas Operativos. Una Visin Aplicada, 1ra edicin. Editorial McGraw Hill 2001 [L02]. Deitel, H Operating Systems. Editorial Addison Wesley 1990. [L03]. Deitel & Deitel, Como Programar En C/C++. Editorial Prentice Hall 2da edicin. [L04]. Marquez, M. UNIX. Programacin Avanzada. 2da edicin. Editorial Alfaomega 2001. [L05]. Perez F, et. al. Problemas De Sistemas Operativos. De La Base Al Diseo. 2da edicin. Editorial McGraw Hill, 2003. [L06]. Stallings, W. Sistemas Operativos. 5ta edicin. Editorial Prentice Hall 2005 [L07]. Tanenbaum, A. Sistemas Operativos. Diseo e Implementacin. 3ra edicin. Editorial Prentice Hall 2006. [L08]. Tanenbaum, A. Sistemas Operativos Modernos. 2da edicin. Editorial Prentice Hall 2001.
REFERENCIAS WEB [W01]. Barney, B. POSIX Threads Programming. https://computing.llnl.gov/tutorials/pthreads/index.html. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W02]. Carrasco E. http://www.uandina.edu.pe/dais/ecarrasco. Sitio web de la asignatura. (fecha de visita: 11/01/2012). [W03]. Ingargiola G. http://www.cis.temple.edu/~ingargio/cis307/readings/spinsem.html. tutorial sobre semforos. (fecha de visita: 11/01/2012). [W04]. Ippolito G. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html. Tutorial de programacion con hilos. (fecha de visita: 11/01/2012). [W05]. Lakshman S. http://www.sarathlakshman.com/2010/10/16/producer-consumerproblem-using-posix-semaphores/. El problema del productor consumidor urtilizando semforos POSIX. (fecha de visita: 11/01/2012). [W06]. Mirela D. http://www.csc.villanova.edu/~mdamian/threads/posixsem.html. sincronizando hilos con semforos POSIX. (fecha de visita: 11/01/2012). [W07]. http://www.llnl.gov/computing/tutorials/pthreads/. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W08]. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W09]. http://www.humanfactor.com/pthreads/. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W10]. http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W11]. http://www.ibm.com/developerworks/linux/library/l-posix1.html. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W12]. http://pages.cs.wisc.edu/~lhl/cs740/assignments/references/pthreads.ps. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012). [W13]. http://www.dmoz.org/Computers/Programming/Threads/POSIX/. Tutorial de programacin con hilos. (fecha de visita: 11/01/2012).