Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Semforos
Como parte de sistema THE Usados para exclusin mutua y planificacin De nivel ms alto que locks Wait(semaforo)
Decrementa semforo Bloquea hebra/proceso si el semforo es menor que cero, sino entonces permite a hebra/proceso continuar Operacion tambien llamada P(semaforo) o down(semaforo)
Signal(semforo)
Incrementa semforo en uno y si hay algn proceso/hebra esperando lo despierta Tambin llamada V(semaforo) o up(semaforo)
Inicializado en N
Usado como contador atmico
Implementacin de Semforos
typedef struct { int value; struct hebra *L; } semaphore; void wait(semaphore S) { S.value--; if (S.value < 0){ agregar hebra a S.L; block(); } } void signal(semaphore S){ S.value++; if (S.value <= 0){ remover hebra T de S.L; wakeup(T); } }
tiempo
Ejemplo planificacin
Tipos de Semforos
Binarios (mutex) Garantizan exclusin mutua a recurso Slo una hebra/proceso puede accesar seccin crtica a la vez Contador de semforo inicializado en 1 Contadores Representan recursos con ms de una unidad disponible Permiten accesar recursos de acuerdo al nmero de recursos disponibles Contador es inicializado en N, donde N es la cantidad de unidades disponibles del recurso
Problema Productor/Consumidor
Productor produce temes a ingresar al buffer Consumidor consume temes del buffer
C
Algoritmo Productor/Consumidor
int contador = 0; //indica nmero de items en buffer Tipo buffer[N]; int in = 0; int out = 0; Productor while (true) { /* produce un item en proxProd */ while (contador == N); //espera buffer[in] = proxProd; in = (in + 1) % N; contador++; } Consumidor while (true) { while (contador == 0); //espera proxCons = buffer[out]; out = (out + 1) % N; contador--; /* consume prodCons */ }
compartido?
Buffer de tamao limitado compartido entre productores y consumidores Productor escribe en buffer[in], in indica posicin de escritura en buffer Consumidor extrae de buffer[out], out indica posicin de extraccin de buffer Contador indica el nmero de elementos actuales en el buffer Mltiples productores deben manipular in, buffer[in] y contador atmicamente. Mltiples consumidores deben manipular out, buffer[out] y contador atmicamente Mltiples consumidores y productores deben manejar contador atmicamente
Ya presentadas Cuando buffer est lleno productores deben esperar a que exista una posicin vaca (generada por un consumidor) Cuando buffer esta vaco consumidores deben esperar a que exista un elemento en el buffer (generado por un productor) Acceso a buffer y contador debe realizarse atmicamente Mutex (inicializado en 1): para exclusin mutua de buffer, in, out y contador. Full (inicializado en 0). Para indicar cuntas posiciones llenas hay en el buffer Empty (inicializado en N). Para indicar cuantas posiciones vacas hay en el buffer
Proporcionar algoritmos
Ejemplos
http://www.inf.udec.cl/~chernand/so/ejemplos/prodconsLocks.cpp
http://www.inf.udec.cl/~chernand/so/ejemplos/prodconsSem.cpp
Problema lectores/escritor
lectores pueden accesar registro datos simultaneamente Slo un escritor puede escribir
L E Registro BD L
Si existe un escritor en BD otro escritor o lector debe esperar Cuando un escritor termina debe sealizar escritor o lector que espera Si podemos tener varios lectores debemos contarlos, para saber cuando existe uno
Si hay uno leyendo y llegan otros, otros tambien pueden leer Si solo hay uno y sale puede haber un escritor esperando accesar BD
Qu semforos necesitamos
Uno inicializado en 1 como mutex para manejar contador de lectores Uno tipo mutex para escritor y primer lector
Primer lector se bloquea si hay un escritor activo cualquier otro escritor se bloquea tambin Si un escritor espera porque existen lectores activos, el ltimo lector lo despierta cuando sale pueden otros lectores entrar cuando el escritor est esperando? Cuando un escritor sale, si hay un escritor y un lector esperando quien entra?
Cada filsofo tiene su plato de arroz, con 5 palitos 5 filsofos se sientan a la mesa. Piensan por un rato y cuando les da hambre comen Hay slo 5 palitos en la mesa (cada persona necesita 2 palitos para comer arroz a la manera china) Para poder comer cada filsofo tiene que obligatoriamente conseguir dos palitos
Starvation o espera indefinida Hebras/Procesos esperan indefinidamente para poder accesar un recurso.
Ejemplo, una hebra en la lista de espera de un semforo de la cual estn entrando y saliendo continuamente hebras y la lista de espera de semforo es LIFO
A pesar que se pueden usar para resolver cualquier problema de sincronizacin Son variables globales por lo tanto pueden ser accesadas de cualquier hebra directamente
no es buena tcnica de ingeniera de software
No hay conexin entre el semforo y el recurso para el cual se quiere controlar acceso Usados como mutex (ingreso a seccin crtica) y para coordinacin (planificacin, eleccin quien tiene acceso al recurso) No se puede controlar su uso, no hay garanta que el programador los use adecuadamente (fcil de cometer errores)
Resumen
Semforos primitivas de sincronizacin de ms alto nivel que locks No relacin entre semforo y recurso que controla Fcil de cometer errores que pueden producir deadlock y starvation
Importante
utilizarlos