UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO

ECP 1 de 7

I.

TEMA: CONCURRENCIA UTIIZANDO SEMAFOROS POSIX

II.

OBJETIVO DE LA PRACTICA

Al finalizar la presente práctica, el estudiante: 1. Conoce la semántica de los semáforos en Linux 2. Desarrolla aplicaciones concurrentes utilizando semáforos.

III.

TRABAJO PREPARATORIO. Para un trabajo con mejores resultados, es imprescindible que el estudiante: 1. Tenga conocimientos de programación en C en el sistema operativo Linux 2. Conozca la teoría de gestión de procesos en los sistemas operativos. 3. Conozca el marco teórico de funcionamiento de los semáforos.

IV.

MATERIALES. Para el desarrollo de la presente práctica 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

SEMAFOROS POSIX PARA EL CONTROL DE CONCURRENCIA

CREACIÓN DE SEMÁFOROS Un semáforo se crea con la función sem_init, que se declara de la siguiente manera:
#include <semaphore.h> int sem_init ( sem_t *sem, int pshared, unsigned int value );

como ocurriría si dos programas leen. Ambos toman un puntero al objeto semáforo inicializado por una llamada a sem_init. entonces solo uno de los dos procesos en espera podrá conseguir decrementar el semáforo y continuar.h> int sem_wait ( sem_t * sem ). . La función sem_wait decrementa atómicamente el valor del semáforo en 1. Así. y le da a este un valor inicial entero. “Atómicamente” significa que. incrementan y escriben un valor a un archivo al mismo tiempo. si dos hilos tratan simultáneamente de incrementar el valor del semáforo en 1. El parámetro pshared controla el tipo de semáforo. establece sus opciones de compartir. En nuestro caso. estos no interfieren. La habilidad de realizar un ‘test and set’ atómico en una sola función es lo que hace de los semáforos tan valiosos. pero siempre espera hasta que el semáforo tenga un valor diferente de 0 primero. int sem_post ( sem_t * sem ).UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 2 de 7 Esta función inicializa un objeto semáforo al cual se apunta mediante sem. Pasar un valor diferente de cero para pshared hará que la llamada falle. el semáforo puede ser compartido entre procesos. Si el valor de pshared es 0. Si sem_wait se invoca sobre un semáforo con un valor 0. MANEJO DE SEMÁFOROS El siguiente par de funciones controla el valor del semáforo y se declaran de la siguiente manera #include <semaphore. Si dos hilos están esperando en sem_wait porque el mismo semáforo tome un valor diferente de 0 y este es incrementado una vez por un tercer proceso. si se llama sem_wait sobre un semáforo con un valor de 2. el otro continuará esperando. De otro modo. El semáforo será siempre correctamente incrementado en valor a 2. La función sem_post incrementa atómicamente el valor del semáforo en 1. el hilo continuará ejecutándose pero el semáforo se decrementará en 1. estamos interesados solo en los semáforos que no son compartidos entre procesos. entonces el semáforo es local al proceso actual. entonces la función esperará hasta que algún otro hilo incremente el valor de modo que este no sea más 0. La variable value almacena el valor del semáforo. puesto que dos hilos intentaron cambiarlo.

h> int sem_destroy ( sem_t * sem ).UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 3 de 7 DESTRUIR SEMÁFOROS La última función sobre semáforos es sem_destroy.h> <string.h> <semaphore.h> /*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]. se retornará un error.c Resuelve el problema del Productor/Consumidor utilizando semaforos Edwin Carrasco 26/08/2004 06/12/2007 <stdio. VI. Esta función toma un puntero a un objeto semáforo y recoge cualquier recurso que este pueda tener. . sem_t lleno. Escribir una aplicación que resuelva el problema del Productor/Consumidor utilizando semáforos Solución /* * Nombre * Proposito : : * Autor * FCreacion * FModificacion */ #include #include #include #include : : : prodcons. Como muchas funciones de Linux. sem_t vacio. Esta función se declara de la siguiente manera: #include <semaphore.h> <pthread. 1. Esta función recoge el semáforo cuando no es requerido más. sem_t mutex. TRABAJO DE LABORATORIO. Si se intenta destruir un semáforo por el cual está esperando un hilo. estas funciones retornan 0 si tienen éxito.

sem_wait(&mutex). while (1) { /*producir un elemento (un caracter)*/ producido = (rand() % 26) + 65. printf("\n\n"). j < BUFSIZE. /*Mostrar el buffer*/ for(j = 0. /*el consumo toma 3 segundo*/ /*decrementa el contador lleno*/ /*entrar en la region critica*/ . } /*salir de la region critica*/ /*incrementa el contador de ranuras llenas*/ /*duerme 1 segundo*/ /* Consumidor */ void *consumidor(void *arg) { nt j. sem_wait(&vacio). int producido. sem_post(&mutex). /*decrementa el contador vacio*/ /*entrar en la region critica*/ /*Agregar elemento al buffer*/ buffer[indicep] = producido. /*Actualizar indicep */ indicep = (indicep + 1) % BUFSIZE. while(1) { sleep(3). sem_wait(&mutex). int indicep = 0. sem_post(&lleno). producido). buffer[j]). } pthread_exit(0). sleep(1). int consumido. int indicec = 0.UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 4 de 7 /* Productor */ void *productor(void *arg) { int j. j++) printf("%c\t". sem_wait(&lleno). /*Mostrar elemento producido*/ printf("Agregando : %c\n".

sem_post(&mutex). printf("\nTamaño del buffer %d\n\n". sem_post(&vacio). NULL). /*Terminar hilos*/ pthread_join(idprod. /*Actualizar indicec */ indicec = (indicec + 1) % BUFSIZE. /*Productor*/ pthread_t idcons. NULL). 0. BUFSIZE). 0). consumido). productor. consumidor. 1). /*Consumidor*/ pthread_create(&idcons. pthread_join(idcons. /*Creacion de hilos*/ /*Productor*/ pthread_create(&idprod. printf("Para terminar la simulacion presionar CTRL + C\n\n"). 0. NULL.UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 5 de 7 /*Sacar un elemento del buffer*/ consumido = buffer[indicec]. 0. } . /*Consumidor*/ /*Inicializacion de semaforos*/ /*Inicialmente hay 0 elementos llenos*/ sem_init(&lleno. BUFSIZE). /*Mostrar elemento consumido*/ printf("\t\t\t\t\tSacando : %c\n". NULL). } /*salir de la region critica*/ /*incrementa el contador de ranuras vacias*/ /* Modulo Principal */ main() { /*Declaracion de hilos*/ pthread_t idprod. NULL). /*solo un hilo puede entrar en su seccion critica*/ sem_init(&mutex. /*inicialmente hay BUFSIZE elementos vacios*/ sem_init(&vacio. } pthread_exit(0). NULL.

et. Cuando un barbero esta libre. 2da edición. ni siquiera los lectores. Los barberos dividen su tiempo entre cortar el pelo. El enunciado del problema es: existe un objeto compartido. debe tomar dos tenedores para poder comer: un tenedor de su derecha y otro de su izquierda. 3. Tanenbaum. Editorial Alfaomega 2001. aceptar pagos y dormir en su silla esperando clientes. “Sistemas Operativos”. Una Visión Aplicada”. Programación Avanzada”. Cuando un filósofo tiene hambre. De La Base Al Diseño”. Deitel & Deitel. El enunciado del problema es el siguiente: Sobre una mesa se encuentran 5 platos de comida y 5 tenedores dispuestos uno entre cada plato. pero. A la mesa están sentados 5 filósofos que pasan su tiempo pensando. [L06]. “UNIX. Editorial Prentice Hall 2005 [L07]. se atiende al cliente que ha estado más tiempo en el sofá y. al “Sistemas Operativos. Stallings. por una serie de procesos concurrentes. Editorial McGraw Hill 2001 [L02]. Cuando finaliza el corte de pelo de un cliente. 2da edición. [L05]. 5ta edición. el cliente toma asiento en el sofá o permanece de pie si el sofá está lleno. cualquier barbero puede aceptar el pago. debido a que solo hay una caja registradora.UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 6 de 7 VII. al. Una vez dentro. utilizando semáforos. A. Escriba una aplicación que resuelva el problema de la cena de los filósofos. Carretero J. [L04]. Algunos procesos desean escribir (escritores) y otros leer (lectores). Editorial McGraw Hill. solo se acepta el pago de un cliente a la vez. 2003. et. [L03]. Un cliente no entra en la tienda si su capacidad está al completo con otros clientes. H “Operating Systems”. “Sistemas Operativos. 1ra edición. Escriba una aplicación que resuelva el problema de los lectores/escritores utilizando semáforos. Si solo toma un tenedor. Perez F. W. “Problemas De Sistemas Operativos. PRACTICAS DE LABORATORIO 1. A. [L08]. el que ha entrado en la tienda hace más tiempo toma asiento. Editorial Prentice Hall 2da edición. pero si un proceso está actualizando. VIII. “Sistemas Operativos Modernos”. 2da edición. 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. Editorial Prentice Hall 2001. . Tanenbaum. Diseño e Implementación”. si hay clientes de pie. 3ra edición. Editorial Prentice Hall 2006. ninguno otro podrá acceder a ella. Escriba una aplicación que resuelva el problema de la barbería. BIBLIOGRAFIA LIBROS [L01]. “Como Programar En C/C++”. Editorial Addison Wesley 1990. cuyo enunciado es: Una barbería tiene 3 sillas. 2. tres barberos. Las medidas contra incendios limitan el número total de clientes en la tienda a 20. Es aceptable tener múltiples procesos leyendo al mismo tiempo. Marquez. M. Deitel. este debe esperar hasta que un filósofo de su lado deje de comer (ponga los tenedores sobre la mesa) y se ponga a pensar.

[W12].html. Carrasco E.edu/~ingargio/cis307/readings/spinsem. Lakshman S. [W05].html. [W06]. Tutorial de programación con hilos.com/pthreads/.yolinux. Tutorial de programación con hilos. Tutorial de programación con hilos. [W13].html. [W09]. (fecha de visita: 11/01/2012).edu/~mdamian/threads/posixsem. [W11]. Tutorial de programacion con hilos. Ingargiola G.cs. (fecha de visita: 11/01/2012). Tutorial de programación con hilos. Tutorial de programación con hilos. [W07].edu/~lhl/cs740/assignments/references/pthreads.yolinux. http://www.villanova.humanfactor.dmoz. (fecha de visita: 11/01/2012). sincronizando hilos con semáforos POSIX. “POSIX Threads Programming”.csc.uandina.llnl. http://www.html.UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 7 de 7 REFERENCIAS WEB [W01]. (fecha de visita: 11/01/2012). [W10]. http://www. (fecha de visita: 11/01/2012).ibm. http://www. Tutorial de programación con hilos.cis. tutorial sobre semáforos. Barney. http://www. B. (fecha de visita: 11/01/2012).pe/dais/ecarrasco. (fecha de visita: 11/01/2012).co. (fecha de visita: 11/01/2012).llnl.com/developerworks/linux/library/l-posix1.temple.com/TUTORIALS/LinuxTutorialPosixThreads.actcom. http://users.html. (fecha de visita: 11/01/2012).gov/computing/tutorials/pthreads/. http://www. http://pages. Tutorial de programación con hilos. Ippolito G.wisc. http://www.com/TUTORIALS/LinuxTutorialPosixThreads. [W03].edu. [W04].html. [W08]. http://www. https://computing. Sitio web de la asignatura.ps. http://www. Mirela D.gov/tutorials/pthreads/index. (fecha de visita: 11/01/2012).il/~choo/lupg/tutorials/multi-thread/multi-thread. http://www. (fecha de visita: 11/01/2012). Tutorial de programación con hilos.org/Computers/Programming/Threads/POSIX/. El problema del productor – consumidor urtilizando semáforos POSIX. .com/2010/10/16/producer-consumerproblem-using-posix-semaphores/. (fecha de visita: 11/01/2012). (fecha de visita: 11/01/2012). [W02].sarathlakshman.html.