concurrencia

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 1 de 7 I. II. TEMA: CONCURRENCIA UTIIZANDO S

Views 203 Downloads 31 File size 166KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 1 de 7

I.

II.

TEMA: CONCURRENCIA UTIIZANDO SEMAFOROS POSIX

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 int sem_init

( sem_t *sem, int pshared, unsigned int value );

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, establece sus opciones de compartir, y le da a este un valor inicial entero. El parámetro pshared controla el tipo de semáforo. Si el valor de pshared es 0, entonces el semáforo es local al proceso actual. De otro modo, el semáforo puede ser compartido entre procesos. En nuestro caso, estamos interesados solo en los semáforos 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 semáforo.

MANEJO DE SEMÁFOROS El siguiente par de funciones controla el valor del semáforo y se declaran de la siguiente manera

#include int sem_wait ( sem_t * sem );

int sem_post ( sem_t * sem );

Ambos toman un puntero al objeto semáforo inicializado por una llamada a sem_init. La función sem_post incrementa atómicamente el valor del semáforo en 1. “Atómicamente” significa que, si dos hilos tratan simultáneamente de incrementar el valor del semáforo en 1, estos no interfieren, como ocurriría si dos programas leen, incrementan y escriben un valor a un archivo al mismo tiempo. El semáforo será siempre correctamente incrementado en valor a 2, puesto que dos hilos intentaron cambiarlo. La función sem_wait decrementa atómicamente el valor del semáforo en 1, pero siempre espera hasta que el semáforo tenga un valor diferente de 0 primero. Así, si se llama sem_wait sobre un semáforo con un valor de 2, el hilo continuará ejecutándose pero el semáforo se decrementará en 1. Si sem_wait se invoca sobre un semáforo con un valor 0, entonces la función esperará hasta que algún otro hilo incremente el valor de modo que este no sea más 0. 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, entonces solo uno de los dos procesos en espera podrá conseguir decrementar el semáforo y continuar; el otro continuará esperando. 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.

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. Esta función recoge el semáforo cuando no es requerido más. Esta función se declara de la siguiente manera: #include int sem_destroy

( sem_t * sem );

Esta función toma un puntero a un objeto semáforo y recoge cualquier recurso que este pueda tener. Si se intenta destruir un semáforo 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 aplicación que resuelva el problema del Productor/Consumidor utilizando semáforos Solución

/* * Nombre * Proposito

* Autor * FCreacion * FModificacion */ #include #include #include #include

: :

: : :



prodcons.c Resuelve el problema del Productor/Consumidor utilizando semaforos Edwin Carrasco 26/08/2004 06/12/2007

/*libreria de semaforos*/ /*libreria de hilos*/

#define BUFSIZE 5

/*numero de ranuras del buffer*/

int buffer[BUFSIZE];

/*buffer de elementos producidos*/

sem_t lleno;

/*semaforo que controla si el buffer esta lleno*/ /*semaforo que controla si el buffer esta vacio*/ /*semaforo que garantiza la exclusion mutua*/

sem_t vacio; sem_t mutex;

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 4 de 7

/* 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);

/*salir de la region critica*/ /*incrementa el contador de ranuras llenas*/ /*duerme 1 segundo*/

} pthread_exit(0); }

/* 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*/

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 5 de 7

/*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);

/*salir de la region critica*/ /*incrementa el contador de ranuras vacias*/

} pthread_exit(0); }

/* 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("\nTamaño 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); }

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 6 de 7

VII.

PRACTICAS DE LABORATORIO 1. Escriba una aplicación que resuelva el problema de los lectores/escritores utilizando semáforos. 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 múltiples procesos leyendo al mismo tiempo, pero si un proceso está actualizando, ninguno otro podrá acceder a ella, ni siquiera los lectores. 2. Escriba una aplicación que resuelva el problema de la barbería, cuyo enunciado es: Una barbería 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 número 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 más tiempo en el sofá y, si hay clientes de pie, el que ha entrado en la tienda hace más 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 aplicación que resuelva el problema de la cena de los filósofos, utilizando semáforos. 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 están sentados 5 filósofos que pasan su tiempo pensando. Cuando un filósofo 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 filósofo 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 Visión Aplicada”, 1ra edición. 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 edición. [L04]. Marquez, M. “UNIX. Programación Avanzada”. 2da edición. Editorial Alfaomega 2001. [L05]. Perez F, et. al. “Problemas De Sistemas Operativos. De La Base Al Diseño”. 2da edición. Editorial McGraw Hill, 2003. [L06]. Stallings, W. “Sistemas Operativos”. 5ta edición. Editorial Prentice Hall 2005 [L07]. Tanenbaum, A. “Sistemas Operativos. Diseño e Implementación”. 3ra edición. Editorial Prentice Hall 2006. [L08]. Tanenbaum, A. “Sistemas Operativos Modernos”. 2da edición. Editorial Prentice Hall 2001.

UNIVERSIDAD ANDINA DEL CUSCO SISTEMAS OPERATIVOS GUIA DE LABORATORIO ECP 7 de 7

REFERENCIAS WEB [W01]. Barney, B. “POSIX Threads Programming”. https://computing.llnl.gov/tutorials/pthreads/index.html. Tutorial de programación 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 semáforos. (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 semáforos POSIX. (fecha de visita: 11/01/2012). [W06]. Mirela D. http://www.csc.villanova.edu/~mdamian/threads/posixsem.html. sincronizando hilos con semáforos POSIX. (fecha de visita: 11/01/2012). [W07]. http://www.llnl.gov/computing/tutorials/pthreads/. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W08]. http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W09]. http://www.humanfactor.com/pthreads/. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W10]. http://users.actcom.co.il/~choo/lupg/tutorials/multi-thread/multi-thread.html. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W11]. http://www.ibm.com/developerworks/linux/library/l-posix1.html. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W12]. http://pages.cs.wisc.edu/~lhl/cs740/assignments/references/pthreads.ps. Tutorial de programación con hilos. (fecha de visita: 11/01/2012). [W13]. http://www.dmoz.org/Computers/Programming/Threads/POSIX/. Tutorial de programación con hilos. (fecha de visita: 11/01/2012).