Sistemas operativos modernos
#define N 5 #definelZQ {i+N-1)%N #define DER {i+1)%N #define PENSANDO O #define HAMBRE 1 #define COMIENDO 2 typedef int semaphore; int estado[N]; semaforo mutex = 1; semáforo s[N]; void filosofo(int i) { while (TRUE) { pensar( ); tomar_tenedor(i): comer( ); dejarjenedor(i); } } void tomar_tenedor(int i) í down(&mutex): estado[i] = HAMBRE; probar(i): up(&mutex); down(&s[i]); } void dejar_tenedor(i) { down(&mutex); estado[i] = PENSANDO; probar(IZQ); probar(DER); up(&mutex); /* número de filósofos */ /* vecinos izquierdos de i V /* vecinos derechos de i V /* el filósofo está pensando V /* está tratando de tomar tenedores V /* el filósofo está comiendo */ /* los semáforos son int especiales V /* arreglo para ver el estado de cada uno V /* exclusión mutua en regiones críticas V r un semáforo por filósofo */ r i: núm. de filósofo, de Oa N-1V r se repite indefinidamente */ /* el filósofo está pensando V r obtiene dos tenedores o se bloquea*/ /* qué rico espagueti V /* deja ambos tenedores en la mesa */ /* i: núm. de filósofo, de Oa N-1 */ /* entra en región crítica V /* registra que el filósofo i tiene hambre V /* trata de tomar 2 tenedores */ r sale de región crítica V r se bloquea si no obtuvo 2 tenedores V /* i: núm. de filósofos, de Oa N-1 */ /* entra en región crítica */ r el filósofo terminó de comer V /* ve si el vecino izquierdo puede comer V /* ve si el vecino derecho puede comer */ /* sale de región crítica V void probar(i) /* i: núm. de filósofo, de Oa N-1 V { If (estado[i] == HAMBRE && estado[IZQ] != COMIENDO && estado[DER] 1=COMIENDO) { estado[i] = COMIENDO; up(&s[i]); } } Figura 2-33. Una solución al problema de la cena de filósofos.
RkJQdWJsaXNoZXIy MjI4NDcx