CC4302 – Sistemas Operativos Pauta Auxiliar N 2 - U

Anuncio
CC4302 – Sistemas Operativos
Pauta Auxiliar N◦2
Profesor: Luis Mateu
Auxiliar: Diego Rivera Villagra
5 de Abril de 2013
1.
Pregunta 1
1. Más de un thread puede cumplir con la condición *ppnodo==NULL y cada uno invocará el método
crearNodoHoja pero finalmente sólo uno va quedar asignado a *ppnodo. Para esto, considere el
caso con la llave “mesa” en la raiz, “árbol” a su izquierda, y “silla” a la derecha. Luego intentar
insertar “casa” y “dado” concurrentemente, quedando suspendido el primer thread justo antes
de llamar a crearNodoHoja.
2. Usar el semáforo sem para que la pregunta *ppnodo==NULL y luego la asignación sobre *ppnodo
no pueda ser interrumpida por otro thread.
void insertar(nSem sem, Nodo **ppnodo, char *llave; char *def) {
Nodo *pnodo;
nWaitSem(sem);
if (*ppnodo==NULL) {
*ppnodo= crearNodoHoja(llave, def);
nSignalSem(sem);
} else {
nSignalSem(sem);
pnodo= *ppnodo;
if (strcmp(llave, pnodo->llave) < 0) {
insertar(pnodo->semIzq, &pnodo->izq, llave, def);
} else {
insertar(pnodo->semDer, &pnodo->der, llave, def);
}
}
}
1
2.
Pregunta 2
int ticket_isla=0, ticket_cont=0;
int visor_isla=0, visor_cont=0;
nMonitor mon; /* = nMakeMonitor() en nMain */
void cruzarAIsla() {
nEnter(mon);
int mi_ticket = ++ticket_cont;
nNotifyAll(mon);
while(mi_ticket > visor_cont)
nWait(mon);
nExit(mon);
}
void cruzarAContinente() {
nEnter(mon);
int mi_ticket = ++ticket_isla;
nNotifyAll(mon);
while(mi_ticket > visor_isla)
nWait(mon);
nExit(mon);
}
int barcaza(){
int enContinente = TRUE;
int atiendo_cont, atiendo_isla;
for(;;){
nEnter(mon);
while(ticket_isla <= visor_isla
&& ticket_cont <= visor_cont)
nWait(mon);
atiendo_cont = atiendo_isla = FALSE;
if(enContinente && ticket_cont > visor_cont)
atiendo_cont = TRUE;
else if(!enContinente && ticket_isla > visor_isla)
atiendo_isla = TRUE;
nExit(mon);
if(enContinente)
navegarAIsla();
else
navegarAContinente();
enContinente = !enContinente;
if(atiendo_cont){
nEnter(mon);
visor_cont++;
nNotifyAll(mon);
nExit(mon);
} else if(atiendo_isla){
nEnter(mon);
visor_isla++;
nNotifyAll(mon);
nExit(mon);
}
}
}
2
Descargar