IIC 2332 -- Sistemas Operativos
Apuntes A02
1er Semestre 1996
- ¿Que pasa en Nachos cuando llamamos a ThreadTest?
- Sigue Thread::Yield y Scheduler::Run.
- Los dos operaciones de los variables de condición son wait
y signal.
- Wait significa que se suspende el proceso que llama la
operación hasta que otro llama signal. Si ningún proceso
espera, entonces la operación no tiene efecto.
- Usamos una variable de condición en el contexto de un lock. Por
lo menos el lock controla acceso a la variable, pero puede controlar
acceso a otros recursos compartidos.
- Un proceso tiene que retener el lock antes de llamar wait.
Pero si se bloquea el proceso reteniendo el lock, otros no lo pueden
adquirir. Entonces wait tiene que liberar el lock.
- Cuando se desperta el proceso, la rutina de wait continua
al punto inmediatamente después de la llamada de sistema que bloqueó
el proceso. Wait puede obtener el lock otra vez.
- Hay tiempo entre la llamada por otro proceso a signal y la
adquisición del lock por el proceso despertado. Cuando wait
vuelve, puede ser necesario que el proceso chequee el estado
compartido y tal vez espere otra vez.
Los filósofos empiezan en el estado pensando.
var estado: array[0..4] of (pensando, hambriento, comiendo)
var sí-mismo: array[0..4] of condition
var mutex of lock
tomar(i: 0..4)
acquire(mutex)
estado[i] := hambriento
probar(i)
if estado[i] <> comiendo then sí-mismo[i].wait(mutex)
release(mutex)
dejar(i: 0..4)
acquire(mutex)
estado[i] := pensando
probar(izquierda(i))
probar(derecha(i))
release(mutex)
probar(i: 0..4)
if estado[i] = hambriento
and estado[izquierda(i)] <> comiendo
and estado[derecha(i)] <> comiendo then
estado[i] := comiendo (* A *)
sí-mismo[i].signal(mutex)
¿Qué pasa si se coloca la línea A en tomar en
vez de probar?
Last edited April 16, 1996, by knabe@ing.puc.cl