Está en la página 1de 11

[ Sistemas Operativos ]

PROCESOS
SOP3161 Semestre 2005-I Eduardo Pea J.

Universidad de Magallanes Facultad de Ingeniera Departamento de Ingeniera en Computacin

Edopena

Sistemas Operativos

[ Procesos ]

Problemas clsicos de comunicacin

Problema de filsofos comensales

Edopena

Sistemas Operativos
Prsentat ion

[ Procesos ]

Filsofos comensales

5 filsofos sentados en una mesa redonda. Cada uno tiene un plato con espagueti especialmente resbaladizo. Es tan resbaladizo que el filsofo debe ocupar dos tenedores para comerlo. Entre cada plato hay un tenedor. La vida del filsofo consta de 2 perodos alternados de pensar y comer. Cuando un filsofo siente hambre toma el tenedor de la izquierda y luego el de la derecha. Si logra tomar los dos tenedores, toma unos bocados y luego deja los tenedores en la mesa.

Edopena

Sistemas Operativos
Prsentat ion

[ Procesos ]
#define N 5 philosopher(i) int i; { while (TRUE) { think(); take_fork(i); take_fork((i+1) % N); eat(); put_fork(i); put_fork((i+1) % N); } }

Filsofos comensales
/* Nmero de filsofos */ /* Nmero de filsofo 0-4 */

/* filsofo meditando */ /* tomar tenedor de la izquierda */ /* tomar tenedor de la derecha */ /* comer */ /* dejar tenedor izquierdo en la mesa */ /* dejar tenedor derecho en la mesa */

Solucin obvia pero errnea. Suponga que los 5 filsofos toman los tenedores al mismo tiempo. Ninguno de ellos podr tomar el tenedor derecho y habr un estancamiento.
4 Sistemas Operativos
Prsentat ion

Edopena

[ Procesos ]

Filsofos comensales

Se podra modificar el programa de manera que despus de tomar el tenedor de la izquierda, el programa verifique si esta disponible el tenedor de la derecha. Si no lo est, el filsofo baja el de la izquierda, espera un tiempo y despus repite todo el proceso.
Esta proposicin tambin fracasa, aunque por una razn diferente. Si todos los filsofos dan inicio al algoritmo en forma simultnea verifican el tenedor de la izquierda luego ven que no esta disponible el de la derecha y retornan el izquierdo a la mesa, esperando, volviendo a levantar al mismo tiempo los tenedores de la izquierda y as sucesivamente. Si esto ocurre indefinidamente y no hay ningn progreso, se llama PROCESO INCOMPLETO POR FALTA DE 5 Sistemas Operativos INSUMOS.
Prsentat ion

Edopena

[ Procesos ]

Filsofos comensales

Por otro lado si los filsofos esperaran un tiempo arbitrario en lugar del mismo perodo de tiempo despus de que no pueden tomar el tenedor del lado derecho, la oportunidad de que todo siga en un ciclo cerrado hasta por una hora es pequea. En algunas aplicaciones se preferira una solucin que siempre funcione y no pueda fracasar debido a una serie improbable de nmeros seleccionados al azar. (piense lo que ocurrira en el control de la seguridad en una planta de energa nuclear).

Edopena

Sistemas Operativos
Prsentat ion

[ Procesos ]
#define N 5 #define LEFT (i-1)%N #define RIGHT (i+1)%N #define THINKING 0 #define HUNGRY 1 #define EATING 2 typedef int semaphore; int state[N];
semaphore mutex =1; semaphore s[N];

Filsofos comensales
/* Nmero de filsofos */ /* N del vecino de la izquierda de i */ /* N del vecino de la derecha de i */ /* el filsofo est meditando */ /* el filsofo intenta tomar los tenedores */ /* el filsofo est comiendo */ /* los semforos son de tipo especial int */ /* arreglo para llevar el control del estado de todos los filsofos */ /* exclusin mutua de regiones crticas */ /* un semforo por filsofo */

philosopher(i) int i; { while (TRUE) { think(); take_forks(i); eat(); put_forks(i); } }


Edopena

/* Nmero de filsofo 0 a N-1 */

/* filsofo meditando */ /* tomar dos tenedores o bloquearse */ /* comer */ /* dejar dos tenedores en la mesa */

Sistemas Operativos
Prsentat ion

[ Procesos ]
take_forks(i) int i; { down(mutex); state[i]=HUNGRY; test(i); up(mutex); down(s[i]);

Filsofos comensales

/* meter en la regin crtica */ /* registrar que el filsofo i tiene hambre */ /* intentar tomar dos tenedores */ /* salir de la regin crtica */ /* bloquearse si no se tomaron los tenedores */

Edopena

Sistemas Operativos
Prsentat ion

[ Procesos ]

Filsofos comensales

test(i) int i; { if(state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING) { state[i]=EATING; /* registrar que el filsofo i tiene hambre */ up(s[i]); /* desbloquearse */ }

Edopena

Sistemas Operativos
Prsentat ion

[ Procesos ]
put_forks(i) int i; { down(mutex); state[i]=THINKING; test(LEFT); test(RIGHT); up(mutex); }

Filsofos comensales

/* meter en la regin crtica */ /* filsofo ha terminado de comer */ /* ver ahora si puede comer el vecino de la izquierda */ /* ver ahora si puede comer el vecino de la izquierda */ /* salir de la regin crtica */

Edopena

10

Sistemas Operativos
Prsentat ion

[ Procesos ] Prximo tema:

Planificacin de un Proceso

Edopena

11

Sistemas Operativos
Prsentat ion

También podría gustarte