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