S.O.: Concurrencia 2 - lsub.orglsub.org/itso/traspas/3.pdf · I Latencia vs. carga procesador I No...

91
Evitar espera activa Rendezvous qlock Barrera Sem´ aforos Sem´ aforos en Plan 9 Sem´ aforos:usos Implementaci´on Lectores/Esc 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

Transcript of S.O.: Concurrencia 2 - lsub.orglsub.org/itso/traspas/3.pdf · I Latencia vs. carga procesador I No...

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