Sistemas Operativos - prof.usb.ve.

Anuncio
Universidad Simón Bolívar!
Departamento de Electrónica y Circuitos!
EC3731 – Arquitectura del Computador II!
Prof. Juan C. Regidor
Interbloqueo (Deadlock)
Sistemas Operativos
Interbloqueo e Inanición
• Definición de interbloqueo e inanición !
• El problema de los filósofos
Basado en S.O. de William Stallings / 5ed. y S.O. de Jesús Carretero (y otros).
!1
Universidad Simón Bolívar
Interbloqueo (Deadlock)
Inanición
• Se dice que existe interbloqueo cuando dos o más
procesos están bloqueados en espera de recursos que
están asignados a los otros.!
!
!2
!
• Sean tres procesos, P1, P2 y P3, que intercambian
información entre ellos.!
!
• Sean los procesos P1 y P2.!
• P1 necesita un recurso X asignado a P2!
• P2 necesita un recurso Y asignado a P1!
• P1 se bloquea y mantiene el recurso Y!
• P2 se bloquea y no puede terminar su ejecución sin el
recurso Y; mantiene el recurso X!
• P1 tampoco puede terminar su ejecución al no
conseguir X, de modo que ambos quedan bloqueados
permanentemente.
Universidad Simón Bolívar
!3
• Puede ocurrir una situación en que P1 y P2 se comuniquen
repetidamente, mientras que P3 se bloquea esperando un
recurso acaparado por P1.!
• No hay interbloqueo, pues P1 y P2 están activos.!
• Se dice que P3 sufre inanición.
Universidad Simón Bolívar
!4
Problema de los Filósofos
Problema de los Filósofos-1ª solución
Posible
interbloqueo
/* program diningphilosophers */ !
semaphore fork [5] = {1}; !
!
void philosopher (int i) !
{!
while (true) { !
think(); !
wait (fork[i]); !
wait (fork [(i+1) mod 5]); !
eat(); !
signal(fork [(i+1) mod 5]); !
signal(fork[i]); !
}!
}!
!
void main() !
{!
parbegin (philosopher (0), philosopher (1), philosopher
(2), philosopher (3), philosopher (4)); !
}
Universidad Simón Bolívar
!5
Problema de los Filósofos-2ª solución
/* program diningphilosophers */ !
No ocurre
semaphore fork[5] = {1}; !
interbloqueo
semaphore room = {4}; !
Inanición?
!
void philosopher (int i) !
{!
while (true) { !
think(); !
wait (room); !
wait (fork[i]); !
wait (fork [(i+1) mod 5]); !
eat(); !
signal (fork [(i+1) mod 5]); !
signal (fork[i]); !
signal (room); !
}!
}!
void main() { !
parbegin (philosopher (0), philosopher (1), philosopher
(2), philosopher (3), philosopher (4)); !
}!
!
Universidad Simón Bolívar
!7
Universidad Simón Bolívar
!6
Problema de los Filósofos - Inanición
#define LEFT (i-1)%5!
/* number of i"s left neighbor */ !
#define RIGHT (i+1)%5! /* number of i"s right neighbor */ !
#define THINKING 0!!
/* philosopher is thinking */ !
#define HUNGRY 1! !
/* philosopher is trying to get forks */ !
#define EATING 2! !
/* philosopher is eating */ !
int state[5];!
!
!
/* array to keep track of everyone"s state */ !
semaphore mutex = 1;! /* mutual exclusion for critical regions */ !
semaphore s[5];!
!
/* one semaphore per philosopher */ !
void philosopher(int i) {! /* i: philosopher number, from 0 to 4 */ !
!
while (TRUE) {! !
/* repeat forever */ !
!
!
think();! !
/* philosopher is thinking */ !
!
!
take forks(i);! /* acquire two forks or block */ !
!
!
eat();!
!
/* yum-yum, spaghetti */ !
!
!
put forks(i);!
/* put both forks back on table */ !
!
}!
}!
void take forks(int i) {!!
/* i: philosopher number, from 0 to 4 */ !
!
wait(&mutex);! !
/* enter critical region */ !
!
state[i] = HUNGRY;! /* record fact that philosopher i is hungry */ !
!
test(i);!
!
!
/* try to acquire 2 forks */ !
!
signal(&mutex);!!
/* exit critical region */ !
!
wait(&s[i]);!
!
/* block if forks were not acquired */ !
}!
void put forks(int i) {! !
/* i: philosopher number, from 0 to 4 */ !
!
wait(&mutex);! !
/* enter critical region */ !
!
state[i] = THINKING;!/* philosopher has finished eating */ !
!
test(LEFT);!
!
/* see if left neighbor can now eat */ !
!
test(RIGHT);! !
/* see if right neighbor can now eat */ !
!
signal(&mutex);!!
/* exit critical region */ !
}
• Solución elegante pero
incorrecta, hay riesgo de
inanición.!
• Considerar el caso de
filósofos "glotones": dos
de ellos pueden pasar
todo el tiempo comiendo
y bloquean a los demás,
que sufren inanición.
void test(int i) {!/* i: philosopher number, from 0 to 4 */ !
!
if (state[i] == HUNGRY && !
!
!
!
!
state[LEFT] != EATING &&!
!
!
!
!
state[RIGHT] != EATING) { !
!
!
state[i] = EATING; !
!
!
signal(&s[i]); !
!
}!
}
Universidad Simón Bolívar
!11
Descargar