Sistemas operativos modernos

while (TRUE) { while (turnol= 0) region_critica( ); turno=1; region_no_critica( ); } (a) while (TRUE){ /★ciclo */ ; while (turno 1= 1) region_critica{ ); turno = 0; region_no_critica( } (b) /* ciclo */ Figura 2-20. Solución propuesta al problema de la región crítica, a) Proceso 0. b) Proceso 1. En ambos casos, observe los signos de punto y coma con que terminan las instrucciones while. Cuando el proceso O sale de la región crítica, establece turno a 1, y ello permite al proce­ so 1 entrar en su región crítica. Supongamos que el proceso 1 termina rápido su región crítica, de modo que ambos procesos están en sus regiones no críticas y turno es 0. Ahora el proceso Oejecuta rápido todo su ciclo, sale de su región crítica y establece turno a 1. En este momen­ to, turno es 1 y ambos procesos se están ejecutando en sus regiones no críticas. De repente, el proceso O termina su región no crítica y vuelve al principio de su ciclo. Desafortunadamente, no se le permite entrar en su región crítica porque turno es 1, y el proce­ so 1 está ocupado con su región no crítica. El proceso Osigue dando vueltas en su ciclo while hasta que el proceso 1 establece turno a 0. Visto así, turnarse no es buena idea cuando uno de los procesos es mucho más lento que el otro. Esta situación viola la condición 3 de una buena solución: el proceso Oestá siendo bloqueado por un proceso que no está en su región crítica. Volviendo al ejemplo del directorio de spooler, si ahora asociamos la región crítica a la lectura y escritura del directorio de spooler, no se permi­ tiría al proceso Oimprimir otro archivo, porque el proceso 1 está haciendo otra cosa. De hecho, esta solución requiere que los dos procesos se alternen estrictamente para ingre­ sar en su región crítica. Por ejemplo, en el spool de archivos, no se permitiría que dos proce­ sos mandaran a spool dos archivos seguidos. Aunque este algoritmo evita todas las competencias, no es un buen candidato de solución porque viola la condición 3. Solución de Peterson Combinando la idea de turnarse con la idea de variables de bloqueo y variables de advertencia, un matemático holandés, T. Dekker, fue el primero en idear una solución en software para el problema de la exclusión mutua que no requiere alternancia estricta. Puede hallarse un análi­ sis del algoritmo de Dekker en Dijkstra (1965). En 1981, G. L. Peterson descubrió una forma mucho más sencilla de lograr exclusión mu­ tua, lo que volvió obsoleta la solución de Dekker. El algoritmo de Peterson se muestra en la fi­ gura 2-21. Consta de dos procedimientos escritos en ANSI C, lo que implica que es preciso incluir prototipos para todas las funciones que se definan y usen. Sin embargo, a fin de ahorrar espacio, no mostraremos los prototipos en este ejemplo ni en los subsiguientes.

RkJQdWJsaXNoZXIy MjI4NDcx