Sistemas operativos modernos

126 PROCESOS Y SUBPROCESOS #define N 5 /* número de filósofos */ void filosofo(lnt i) { while (TRUE) { pensar( ); tomar_tenedor(i): tomar_tenedor(i+1) % N); comer( ); dejar_tenedor{i): dejar_tenedor{i+1) % N); r i: núm. de filósofo, de 0 a 4 */ /* el filósofo está pensando V /• toma el tenedor izquierdo V r toma el tenedor derecho; % es el operador de módulo */ /* qué rico espagueti V r deja el tenedor izquierdo en la mesa */ r deja el tenedor derecho en la mesa */ Figura 2-32. Solución equivocada al problema de la cena de los filósofos. do en la mesa, esperar cierto tiempo y repetir el proceso. Esta propuesta también falla, pero por otra razón. Con un poco de mala suerte, todos los filósofos podrían iniciar el algoritmo en for­ ma simultánea, tomar los tenedores izquierdos, ver que los derechos no están disponibles, de­ jar los tenedores izquierdos en la mesa, esperar, tomar al mismo fiempo los tenedores izquierdos otra vez, y así para siempre. Una situación como ésta, en la que todos los progra­ mas se ejecutan de manera indefinida pero no logran avanzar, se denomina inanición. Usted podría pensar: “Si los filósofos esperan un tiempo aleatorio en lugar de un fiempo fijo después de fracasar en su intento por adquirir el tenedor derecho, la probabilidad de que las acciones sigan sincronizadas aunque sea por una hora sería pequeñísima”. Esta observación es válida, y en casi todas las aplicaciones la estrategia de reintentarlo después no causa proble­ mas. Por ejemplo, en la popular red local Ethernet, si dos computadoras envían un paquete al mismo fiempo, cada una espera un fiempo aleatorio y vuelve a intentarlo. En la práctica esta solución funciona bien, pero en unas cuantas aplicaciones sería preferible una solución que siempre funcione y no pueda fallar debido a una serie poco probable de números aleatorios. Pensemos en el control de seguridad de una planta nuclear. Una mejora a la figura 2-32, que no fiene bloqueo irreversible ni inanición, consiste en pro­ teger con un semáforo binario a cinco instrucciones que están después de la llamada a pensar. Antes de comenzar a tomar tenedores, el filósofo ejecutaría down en mutex. Luego de regresar los tenedores, haría un up en mutex. Desde un punto de vista teórico, esta solución es apropia­ da. Desde una perspectiva práctica, tiene un problema de desempeño: sólo un filósofo puede es­ tar comiendo en un momento dado. Habiendo cinco tenedores, deberíamos permitir que dos filósofos coman al mismo tiempo. La solución que se presenta en la figura 2-33 no fiene bloqueos irreversibles y permite el máximo de paralelismo para un número arbitrario de filósofos. Se ufiliza un arreglo, estado, para registrar si un filósofo está comiendo, pensando o hambriento (tratando de tomar tenedo­ res). Un filósofo puede pasar al estado donde está comiendo, sólo si ninguno de sus vecinos

RkJQdWJsaXNoZXIy MjI4NDcx