Sistemas operativos modernos
después de un up con un semáforo con procesos inactivos, el semáforo seguirá siendo O, pero habrá un proceso inactivo menos esperándolo. La operación de incrementar el semáforo y acti var un proceso también es indivisible. Ningún proceso se bloquea jamás ejecutando up, así co mo ninguno se bloqueaba ejecutando wakeup en el modelo anterior. Por cierto, en su artículo original Dijkstra usó los nombres P y V en vez de down y up, respectivamente, pero dado que no tienen connotaciones mnemónicas para quienes no hablan holandés (y no muchas para quienes sí lo hablan), preferimos usar los términos down y up, que se introdujeron por primera vez en Algol 68 . Resolución del problema del productor-consumidor empleando semáforos Los semáforos resuelven el problema del despertar perdido, como se muestra en la figura 2-24. Es indispensable que se implementen de manera indivisible. El procedimiento normal es im plementar down y up como llamadas al sistema y que el sistema operativo inhabilite en forma breve todas las interrupciones, mientras está probando y actualizando el semáforo, así como poniendo el proceso a dormir, si es necesario. Dado que todas estas acciones sólo requieren unas cuantas instrucciones, la inhabilitación de las interrupciones no es perjudicial. Si se están utilizando múltiples CPUs, cada semáforo deberá protegerse con una variable de bloqueo, uti lizándose la instrucción T S L para garantizar que sólo una CPU a la vez examine el semáforo. Debe entender que el uso de T S L para evitar que varias CPUs tengan acceso simultáneo al se máforo es muy distinto de la espera activa-del productor o el consumidor para que el otro vacíe o llene el búfer. La operación de semáforo apenas tardará unos cuantos microsegundos, mien tras que el productor o el consumidor podrían tardar un tiempo arbitrario. Esta solución utiliza tres semáforos; uno llamado llenas, para contar el número de ranuras ocupadas, otro llamado vacias, para contar el número de ranuras desocupadas, y el último lla mado mutex, para asegurar que el productor y el consumidor no tengan acceso al búfer al mis mo tiempo. En un principio, llenas es O, vacias es igual al número de ranuras del búfer y mutex es 1. Los semáforos a los que se asigna el valor inicial 1 y que son utilizados por dos o más procesos para garantizar que sólo uno de ellos pueda estar en su región crítica en un momento dado, se denominan semáforos binarios. Si cada proceso ejecuta down justo antes de entrar en su región crítica y up justo después de salir de ella, la exclusión mutua estará garantizada. Ahora que contamos con una buena primitiva de comunicación entre procesos, examine mos otra vez la sucesión de interrupciones de la figura 2-5. En un sistema que usa semáforos, la forma natural de ocultar las interrupciones es tener un semáforo, con valor inicial O, asocia do con cada dispositivo de E/S. Inmediatamente después de poner en marcha un dispositivo de E/S, el proceso administrador ejecuta down en el semáforo correspondiente y se bloquea de inmediato. Cuando llega la interrupción, el manejador de interrupciones ejecuta up en el se máforo correspondiente, lo que pone al proceso en cuestión en condiciones de ejecutarse de nuevo. En este modelo, el paso 5 de la figura 2-5 consiste en ejecutar up en el semáforo del dispositivo, de modo que en el paso 6 el calendarizador pueda ejecutar al administrador del dis positivo. Desde luego, si ahora hay varios procesos listos, el calendarizador podría optar por ejecutar a continuación otro aún más importante. En una sección posterior del capítulo exami naremos algunos de los algoritmos empleados para calendarizar.
RkJQdWJsaXNoZXIy MjI4NDcx