lector:
consulta(…){
enterRead();
…
exitRead();
}
escritor:
modificacion(…){
enterWrite();
…
exitWrite();
}
-Lectura en paralelo
-escritura en exclusión mutura con otras lect. o escrit.
Sol con monitores
nMonitor c; /*=nMakeMonitor*/
int readers=0;
int writing=False;
void enterRead(){
nEnter(c);
while(writing)
[nWait(c);]
reader++;
nExit(c);
}
void exitRead(){
nEnter(c);
reader–;
[nNotifyAll(c);]
nExit(c);
}
void enterWrite(){
nEnter(c);
while(readers>0||writing)
[nWait(c);]
writing=TRUE;
nExit(c);
}
void exitWrite(){
nEnter(c)
writing=FALSE;
[nNotifyAll(c);]
nExit(c);
}
– Nunca hacer busy-waiting pq es ineficiente y si se hace mientras esta tomado un monitor, nunca se va a liberar (deadlock)
Fairness(justicia): ausencia de hambruna
Estrategia para lograr soluciones «fair» (justa)
enterWrite | enterWrite | enterWrite (Pendiente) | … | enterWrite |
No puede entrar ninguno que sigue si uno queda pendiente
Estrategia: Autorizar entradas en orden FIFO (First In First Out)
– Metáfora de la Isapre
nMonitor c; /*=nMakeMonitor*/
int readers=0;
int writing=False;
int visor=0; dist=0;
void enterRead(){
int miturno;
nEnter(c);
miturno=dist++;
while(writing||visor!=miturno)
nWait(c);
readers++;
visor++; nNotifyAll(c);
nExit(c);
}
void exitRead(){
nEnter(c);
reader–;
nNotifyAll(c);
nExit(c);
}
void enterWrite(){
int miturno;
nEnter(c);
miturno =dist++
while(writing || readers>0 ||visor!=miturno)
nWait(c);
writing=TRUE;
visor++; nNotifyAll(c); (no es estrictamente necesario este notify all)
nExit(c);
}
void exitWrite(){
nEnter(c)
writing=FALSE;
nNotifyAll(c);
nExit(c);
}
-Solucion eficiente eliminando los writing de los read
-Ejercios resueltos en el apunte en la pagina del profe
-Controles sin apuntes, con torpedo de una pagina
Ejercicio: Implementar un semáforo a partir de monitores.
– No necesariamente FIFO
– Que sea FIFO