Post on 06-May-2018
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
S.O.: Concurrencia 2
Gorka Guardiola
Laboratorio de Sistemas,Grupo de Sistemas y Comunicaciones,
URJC
27 de octubre de 2010
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
(cc) 2008 Grupo de Sistemas y Comunicaciones.
Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Attribution-ShareAlike.
Para obtener la licencia completa, vease http://creativecommons.org/licenses/by-sa/2.1/es. Tambien puede
solicitarse a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Evitar la espera activa
I Desperdicia procesador
I Latencia vs. carga procesador
I No es justa (no es FIFO, sino casi aleatoria)
I Puede haber inanicion, starvation, no en teorıa, pero en lapractica sı (ejecuta al cabo de mucho)
I Evitar la contienda (contention), mantener las regionescrıticas pequenas
I Pero ¿y si podemos evitarla del todo. . . ?
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Evitar la espera activa
I Nos puede ayudar el planificador
I ¿Que pasaba con un proceso cuando yo llamaba a sleep()?
I Bloquear un proceso
I Despertar un proceso
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Bloquear un hilo de ejecucion
I Para evitar espera activa: mecanismo para bloquear un proceso
I Primitiva de sincronizacion: llamada al sistema (en el kernel)o de librerıa
I Bloquear un procesoI cambia el estado a bloqueadoI se le echa del procesador
I Despertar un procesoI cambia el estado a listo para ejecutar
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Bloquear un proceso
I Se puede hacer con un pipe
I Para un proceso lo pongo a leer (ojo, no escribo: buffering)
I Para despertar a uno escribo en el pipe
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Rendezvous, cita
I llamada al sistema rendezvous(2)
void* rendezvous(void* tag, void* value)
I Entre dos (cita romantica)
I es simetrica, el primero que llega se bloquea
I garantiza: que lo de antes se ha ejecutado en los dos procesos
I se usa un identificador, tag, (identifica una pareja)
I intercambian dos valores
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Rendezvous, cita
RENDEZVOUSTag = 3
Valor = 84
RENDEZVOUSTag = 3
Valor = 84
No hay nadie bloqueado en el Tag 3:se queda en
Rendez
Proceso 1 Proceso 2
Como ya hay uno enTag = 3 en estado Rendez (bloqueado) se desbloquean los dos
TODO LO DEANTES DEL
RENDEZVOUSSE HA EJECUTADODESPUES DE QUE
AMBOS RETORNEN
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
variable local
void *val, *oval, *tag;
tag = (void *)38;
if (rfork(RFPROC|RFMEM) == 0) {
print("hijo: antes");
val = (void *)1;
oval = rendezvous(tag, val);
print("hijo: despues %p\n", oval);
}
else{
print("padre: antes\n");
val = (void *)0;
oval = rendezvous(tag, val);
print("padre: despues %p\n", oval);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Rendezvous, cita
I ¿Que se usa en tag?
I normalmente un puntero reservado antes con malloc
I un valor unico para esta pareja acordado
I espacio de tags diferente en cada grupo creado con rfork conla flag RFREND
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Rendezvous, cita
I ¿Que se usa en el valor?
I un valor que quiero intercambiar
I normalmente intercambio punteros, el valor del puntero, no sucontenido.
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
qlock
I Interfaz igual que el de lock
I estos son justos (tienen una cola, por eso la q)
I no hacen espera activa, usan rendezvous
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Ejemplo de uso de qlock
//me declaro QLock l; como variable global
if (rfork(RFPROC|RFMEM) == 0) {
qlock(&l);
i++;
print("%#p %d\n", &i, i);
qunlock(&l);
}
else{
qlock(&l);
i++;
print("%#p %d\n", &i, i);
qunlock(&l);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
qlock v.s. lock
I Latencia: acotada con qlock, aunque mas alta si no haycontienda
I Sleep vs Rendez
I Orden Fifo vs orden Aleatorio
I qlock si funciona con threads (hay una implementacion derendezvous para threads)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
qlock: implementacion
I lista enlazada
I hago rendezvous en los punteros
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
qlock: implementacion
0x37032 0x2e003
0
0x3704a
0x3703e 0x37032
0x37036
0x3703a
0x3703e
0x37042
0x37046
0x3704a
0x3704e
0x37052
0x37056
LOSTAGS DE RENDEZVOUS SON
LAS DIRECCIONES
Por ejemplo, en esteqlock hay un proceso
bloqueado enrendezvous(0x37032, 0);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Barrera
I otra primitiva de sincronizacion
I como rendezvous pero para N procesos
I se van bloqueando hasta que hay N, cuando hay N sedesbloquean
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Barrera de 4, ejemplo
tiempo
Cuando llega el cuartovuelven a ejecutar todosbarrier(4, b)
barrier(4, b)
barrier(4, b)
barrier(4, b)
P2 P3P1 P4
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos (semaphores, seinpalen, 1965 Dijkstra)
I Otra primitiva de sincronizacion
I Mas general
I Como un cuenco de fichas con N fichas (puede empezar a 0)
I Coger ficha (si no hay fichas, espero), wait, down, acquire, P(probeer)
I Soltar ficha (si alguien esperando, le despierto), signal, up,release, V (verhoren, verlaag)
I No hay inanicion (no necesariamente fifo aunque es una formade hacerlo)
I No hay un numero maximo de fichas en el cuenco
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos en Plan 9
int semacquire(long *addr, int block);
long semrelease(long *addr, long count);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos (semaphores, seinpalen, 1965 Dijkstra)
I block puedo suponer que siempre es 1
I addr es la direccion del long que representa el semaforo
I count es el numero de fichas para poder soltar mas de unaficha a la vez
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos: usos
I Para que solo entre uno en la region crıtica
I Se inicializa a 1
I Se llama mutex
I Similar a un lock
I down() → lock()
I up() → unlock()
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Ejemplo de uso de mutex
//globales
long sem = 1;
//local
if (rfork(RFPROC|RFMEM) == 0) {
semacquire(&sem, 1);
i++;
semrelease(&sem, 1);
}
else{
semacquire(&sem, 1);
i++;
semrelease(&sem, 1);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos: usos
I Para que solo entren N en la region crıtica
I Se inicializa a N
I down() antes de entrar
I up() al salir
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Semaforos: usos
I Para esperar
I Se inicializa a 0
I down() para esperar
I up() para levantarlo
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Ejemplo de uso de semaforo para esperar
//globales
long sem;
//local
if (rfork(RFPROC|RFMEM) == 0) {
print("hijo antes\n);
semacquire(&sem, 1); //espero
print("hijo despues\n);
}
else{
print("padre antes\n);
semrelease(&sem, 1);
print("padre despues\n);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
¿Como implemento semaforos?
I Con pipesI up(): escribir en el pipeI down(): leer del pipe
I Puedo usar rendezvous(2) como con qlock(2)
I Necesito un contador de fichas (ojo, compartido, proteger conlocks)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
El problema de los lectores escritores
I Region crıtica con dos tipos de hilos que acceden
I Un tipo de hilos lectores pueden acceder varios a la vez
I Otro escritores solo puede acceder uno
I Hay exclusion mutua entre ambos tipos (o lectores oescritores)
I Otra forma de verla es dos tipos de formas de coger un cierre
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 0 (mala)
I un mutex para la region crıtica
I solo puede entrar un lector (y quiero que puedan entrar varios)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 0 (mala): escritor
//globales
long mutexesc = 1;
//local
semacquire(&mutexesc, 1);
//region critica
semrelease(&mutexesc, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 0 (mala): lector
semacquire(&mutexesc, 1);
//region critica
semrelease(&mutexesc, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 1 (injusta)
I Dos semaforos, un mutex para la region crıtica
I Un mutex para proteger el contador de lectores
I Un contador del numero de lectores
I El primero echa el cierre y el ultimo lo suelta
I Ojo! con el orden y quien se queda bloqueado
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 1 (injusta): escritor
//globales
long mutexesc = 1;
long mutexnl = 1;
int nl;
//local
semacquire(&mutexesc, 1);
//region critica
semrelease(&mutexesc, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 1 injusta: lector
semacquire(&mutexnl, 1);
if(nl++ == 0)
semacquire(&mutexesc, 1);
semrelease(&mutexnl, 1);
//region critica
semacquire(&mutexnl, 1);
if(--nl == 0)
semrelease(&mutexesc, 1);
semrelease(&mutexnl, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 1 injusta
I Uso peculiar de mutex entrelazados, ojo!!
I Es injusta, los lectores se apropian del cierre y se lo pasan soloentre ellos.
I Si hay un escritor esperando, no deberıa dejar entrar a maslectores
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Idea general, torniquetes (turnstile)
I Para evitar injusticias como las anteriores
I Uso peculiar de semaforos
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
torniquetes (turnstile)
//globales
long torn = 1;
//local
semacquire(&torn, 1);
semacquire(&mutexesc, 1);
semrelease(&torn, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
torniquetes (turnstile)
semacquire(&torn, 1);
semrelease(&torn, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
torniquetes (turnstile)
I Si espera para el mutex, tiene el torniquete
I El torniquete deja pasar en orden justo (es un semaforo)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 2 justa: escritor con torniquete
//globales
long mutexesc = 1;
long mutexnl = 1;
long torn = 1;
int nl;
//local
semacquire(&torn, 1);
semacquire(&mutexesc, 1);
semrelease(&torn, 1);
//region critica
semrelease(&mutexesc, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion 2 justa: lector con torniquete
semacquire(&torn, 1);
semrelease(&torn, 1);
semacquire(&mutexnl, 1);
if(nl++ == 0)
semacquire(&mutexesc, 1);
semrelease(&mutexnl, 1);
//region critica
semacquire(&mutexnl, 1);
if(--nl == 0)
semrelease(&mutexesc, 1);
semrelease(&mutexnl, 1);
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Productor/consumidorI Tenemos un hilo que produce fichasI Tenemos otro hilo que las consumeI Problema muy muy comun:
I Hilo que lee del micro produce audio , programa lo consume(telefono)
I Hilo que lee de la red, hilo que lo consume (programa que usala red)
I Hilo que que produce datos, hilo que los manda a otramaquina (programa que usa la red)
I Hilo que que produce datos, hilo que los procesa, se lo mandaa otro hilo. . . (procesado de senal)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Productor/consumidor
I El productor deja las cosas en un buffer (con N huecos)
I El consumidor las recoge
I El buffer tiene que ser circular (mod N)
I El buffer es compartido, mutex
I ¿Y si no hay nada, espera activa?
I Puedo usar semaforos
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
productor
//global
long fichsem;
long holesem = N;
char *buf[N];
//local
int i;
char *fich;
i = 0;
while(fich = produce()){
semacquire(&holesem, 1);
buf[i++] = fich;
i %= N;
semrelease(&fichsem, 1);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
consumidor
//local
int i;
char *fich;
i = 0;
while(1){
semacquire(&fichsem, 1);
fich = buf[i++];
i %= N;
semrelease(&holesem, 1);
consume(fich)
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
productor/consumidor (N=8)
Productor
Consumidor
U
U
UU
01
2
3 4
5
67
5
1
U
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
productor/consumidor
Productor
Consumidor
U
U
UU
01
2
3 4
5
67
5
2U
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
productor/consumidor
Productor
Consumidor
U
U
UU
01
2
3 4
5
67
6
2U
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Productor/consumidor
I Solucion mala, da miedo, el buffer no tiene mutex (¿lonecesita?), por si acaso, es una variable compartida, lo pongo
I ¿Que pasa si hay mas de un productor o consumidor?
I Necesito que compartan i y j, uso el mutex general paraacceder a todas las cosas compartidas
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
compartido
//global
long mutex = 1;
long fichsem;
long holesem = N;
char *buf[N];
int i, j;
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
productor
//local
char *fich;
while(fich = produce()){
semacquire(&holesem, 1);
semacquire(&mutex, 1);
buf[i++] = fich;
i %= N;
semrelease(&mutex, 1);
semrelease(&fichsem, 1);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
consumidor
//local
int i;
char *fich;
while(1){
semacquire(&fichsem, 1);
semacquire(&mutex, 1);
fich = buf[j++];
j %= N;
semrelease(&mutex, 1);
semrelease(&holesem, 1);
consume(fich)
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Productor/consumidor
I Podrıa tener dos mutex, uno para i y otro para j
I el buffer no tiene mutex (¿lo necesita?)
I ¿Que pasa si no quiero sacarlos en orden?
I ¿Y si no es un buffer y es otro tipo de recurso?
I Mantra: un recurso compartido, uso un mutex. . .
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Problema de los filosofos cenando (aka pollos en lamarmita)
I Tengo N filosofos (hilos de ejecucion) en una mesa
I Cada filosofo necesita dos tenedores para comer
I Un filosofo duerme/come
I Cada filosofo es un proceso independiente
I Un filosofo se puede quedar dormido hasta que suceda unacondicion
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Problema de los filosofos: deadlock
I Si un filosofo coge primero el tenedor izquierdo y luego elderecho
I Puede pasar que todos los filosofos cojan el tenedor derecho
I Se quedan durmiendo esperando cada uno al siguientealrededor de la mesa
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Alternativas de solucion
I Tengo un mutex y cojo dos palillos a la vezI Produce hambruna si dos filosofos se alternan
I Uso un camareroI Serializo todas las peticionesI Desperdicia recursos pero no hay hambruna
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Solucion con hambruna
I Coger los dos palillos
I Tener cuidado con como se hace que esperen (no bloquearmecon un mutex. . . )
I Ver la solucion de los pollos (mismo problema)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
monitores
I C. A. R. Hoare y Per Brinch Hansen
I Asociado al lenguaje
I Objeto, ADT o modulo especial que actua como mecanismode sincronizacion
I Tengo el estado compartido dentro del monitor
I Una serie de operaciones para acceder a el
I Hay el equivalente a un cierre global escondido asociado almonitor
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
monitores
I Estoy ”fuera” o ”dentro” del monitor, automaticamente seecha el cierre al entrar, se suelta al salir (reentrante)
I Se entra al monitor al llamar a uno de los metodos ofunciones del monitor
I Si estoy dentro puedo llamar a otros metodos del monito
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
variables condicion
I Asociadas a un monitor
I Para esperar, necesito un mecanismo (no veo el cierre delmonitor)
I condwait(cv) condsignal(cv)
I condwait(cv) se duerme y suelta el cierre
I condsignal(cv) se despierta y coge el cierre, una solaoperacion para que no se cuele gente y cambie la condicion
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
variables condicion
I Si no hay nadie esperando a la condicion, se pierde
I la variable no lleva asociada la condicion, solo es una cola yun timbre
I Ha varios tipos, en unos condsignal(cv) es lo ultimo a loque puedo llamar, (o condsignalreturn(cv)) en otros solose despierta cuando abandono el monitor. . .
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Monitores
I Pocos lenguajes tienen soporte de monitores
I Se puede (y se debe) pensar en monitores al implementar unmodulo, ADT u objeto
I En Plan 9 hay soporte para implementar variables condicionrsleep(2)
I Una variable condicion es una variable de tipo Rendez
I Van asociadas a un QLock.
I Tengo que poner el campo l apuntando al QLock del monitoral inicializar mi variable Rendez
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Variables condicion en Plan 9
typedef struct Rendez {
QLock *l;
...
} Rendez;
void rsleep(Rendez *r)
int rwakeup(Rendez *r)
int rwakeupall(Rendez *r)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Variables condicion en Plan 9
Rendez empty;
QLock l;
int var;
void
init(void){
full->l = &l;
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Variables condicion en Plan 9
void
set(int b)
{
qlock(&l);
if(var == 0)
rsleep(&empty);
...
qunlock(&l);
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Variables condicion en Plan 9
int
dothings(int a)
{
qlock(&l);
var = 1;
rwakeup(&empty);
...
qunlock(&l);
return;
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Paso de mensajes
I CSP 1978 C. A. R. Hoare
I Convertir productor/consumidor en una primitiva
I Bloqueante (para permitir sincronizacion)
I Usar un proceso para que ejecute las regiones crıticas(transferir la propiedad junto con la comunicacion)
I Similar a pipes (salvo que aquı puedo mandar punteros), salvopor eso la idea es parecida
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I incluir thread.h
#include <thread.h>
I main es de la librerıa de threads, uso threadmain (el main deverdad viene de la librerıa de threads)
void threadmain(int argc, char *argv[])
I tamano de la pila con mainstacksize, variable global (hay unvalor por defecto)
int mainstacksize
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I Creo threads (colaborativos, de usuario) y procesos(expulsivos, de kernel)
int
proccreate(void (*fn)(void*), void *arg, uint stacksize)
int
threadcreate(void (*fn)(void*), void *arg, uint stacksize)
I Cada proceso con viene con un thread encima (incluido main)
I Para salir
void threadexits(char *status)
void threadexitsall(char *status)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I Para identificar un thread (como pids)
int threadid(void)
I Para poner nombre a un thread (para tstack y errores engeneral)
void threadsetname(char *name)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplo
I tid.c, ejemplo tonto
I tincr.c, ejemplo contador con threads
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I El primer parametro es un puntero a funcion
int
proccreate(void (*fn)(void*), void *arg, uint stacksize)
int
threadcreate(void (*fn)(void*), void *arg, uint stacksize)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I El primer parametro es un puntero a funcion
I El nombre de una funcion es su direccion (valor para pasar alpuntero)
I Un puntero tiene un tipo, que es el de una funcion
I Una funcion para un thread o un proc tiene que tener esteaspecto:
void procfunct(void *v)
I Ojo con los parametros, puede haber condiciones de carrera
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2)
I Los threads tienen memoria compartida
I Su pila vive en el segmento de datos, memoria compartida
I Pueden usar qlock (hay una implementacion de rendezvous)
I Mejor si uso canales (forma diferente de pensar, modelodiferente)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Canal
I Tiene que verlo todos los implicados
I Implementa un productor/consumidor
I Un canal es como un buzon
I Se puede mandar a traves de el (send) o recibir (recv)
I Puede tener espacio (buffering) dentro o no
I Si no hay espacio (no lo hay buffering o esta lleno) send sebloquea hasta que alguien reciba
I Si no hay nada en el buffer y no hay nadie bloqueadomandando, recv se bloquea hasta que alguien mande
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Canal
I Declaro un canal
Channel *c;
I creo un canal
Channel* chancreate(int elsize, int nel)
I elsize es el tamano de un elemento (puedo mandar cosasdiferentes)
I nel es el tamano del buffer, si es cero no hay buffering
I libero un canal
void chanfree(Channel *c)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Canal
I Para mandar y recibir, primitivas
int recv(Channel *c, void *v)
int send(Channel *c, void *v)
I Son como memmove(2), copian la memoria al canal (si no haybuffering, al destino)
I Por eso recibe un puntero al trozo de memoria que copia
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
Canal
I Para mandar y recibir, funciones especializadas, reciben unvalor, no un puntero
void* recvp(Channel *c)
ulong recvul(Channel *c)
int sendp(Channel *c, void *v)
int sendul(Channel *c, ulong v)
I Se usan mas que las otras pero es importante entender lasotras para entender alt que veremos mas adelante
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplos
I tcnt.c contador con threads
I tpc.c, productor consumidor
I pong.c ping pong canales intercambiando un valor
I pong2.c lo mismo especializado con sendul recvul
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplo
I tticker.c, ejemplo paneles
I Cada panel se corresponde con un descriptor de fichero
I Tengo que pensar en terminos de procesos conectados porcanales
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), operaciones
I operaciones con mas de un canal a la vez
int alt(Alt *alts);
I cada operacion
typedef struct Alt Alt;
struct Alt {
Channel *c;
void *v;
int op;
};
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), operaciones
I cada constante una operacion
I mejor usar enum
#define CHANEND 0 //indica el final de alts
#define CHANSND 1 //para mandar
#define CHANRCV 2 //para recibir
#define CHANNOP 3 //nop (no usar)
#define CHANNOBLK 4 //no bloqueante (no usar)
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplo
I dentro de la funcion que hace el alt
enum{
WR = 0,
EXIT,
END,
};
int i; //ambos canales de enteros
Alt a[] = {
[WR] {wrc,&i,CHANRCV},
[EXIT] {exitc,&i,CHANRCV},
[END] {nil,nil,CHANEND},
};
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplo
switch(alt(a)){
case WR:
//lo que hace WR
return;
case EXIT:
//lo que hace EXIT
break;
default:
sysfatal("bad alt");
break;
}
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplo
I etticker.c, ejemplo paneles
I quiero anadir mensajes de temperatura, tiempo
I uso alt(2) para decorar el thread
I el canal de broadcast no cambia su interfaz y me aisla
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplos
I mouse.c, eventos de raton con canales
I resize.c eventos de raton y eventos de resize
I slider.c es una slider, barra de desplazamiento
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), ejemplos
I texec.c, como hacer un exec(2) con un proceso usandolibthread
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), como organizar un programa
I Un proc para cada llamada bloqueante
I sleep, read, write por ejemplo.
I Un thread representante de esos procs en un proc con datoscompartidos
I Un thread por cada hilo separado de ejecucion
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), como organizar un programa
I Para comunicacion de N a 1
I Se pueden usar valores de un canal
I O alternativamente usar alt
I Depende del problema
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), condiciones de carrera tıpicas
I Usar un canal no me libra
I Ejemplo, compartir los canales de respuesta y de peticion(¿quien se lleva el mensaje?).
I Mando un puntero a un canal para que me respondan por el
I Recordar liberarlo con chanfree
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC
Evitar espera activa Rendezvous qlock Barrera Semaforos Semaforos en Plan 9 Semaforos:usos Implementacion Lectores/Escritores Productor/consumidor Filosofos Monitores Monitores Variables condicion Variables condicion Canales Intro libthread Ejemplos Errores comunes
libthread(2), deadlock
I Es normal si no tengo cuidado
I Igual que antes, dependencias circulares mandando/recibiendo
I Ojo con alt
I Intento hacerme dependencias y comunicacion sencillas
S.O.: Concurrencia 2 Laboratorio de Sistemas, Grupo de Sistemas y Comunicaciones, URJC