Sistemas operativos modernos

vo compartido; la ubicación de la memoria compartida no altera la naturaleza de la comuni­ cación ni los problemas que se presentan. Para ver cómo funciona en la práctica la comunica­ ción entre procesos, consideremos un ejemplo sencillo pero común: el spooler de impresión. Cuando un proceso quiere imprimir un archivo, coloca su nombre en un directorio de spooler especial. Otro proceso, el demonio de impresora, ve en forma periódica si hay algún archivo por imprimir y, si lo hay, lo imprime y borra su nombre del directorio. Imaginemos que nuestro directorio de spooler tiene un gran número de ranuras, numeradas O, 1, 2, ..., cada una de las cuales puede contener un nombre de archivo. Asimismo, imagine­ mos que hay dos variables compartidas: out, que apunta al siguiente archivo que se imprimirá, e in, que apunta a la siguiente ranura desocupada del directorio. Estas dos variables bien podrían guardarse en un archivo de dos palabras, accesible para todos los procesos. En un momento determinado, las ranuras Oa 3 están vacías (los archivos ya se imprimieron) y las ranuras 4 a 6 están ocupadas (con los nombres de archivos en cola para imprimirse). De forma casi simultá­ nea, los procesos A y B deciden que quieren mandar un archivo a impresión. Esta situación se muestra en la figura 2-18. Proceso Proceso Directorio de spool abo prog.c prog.n out = 4 in = 7 Figura 2-18. Dos procesos que quieren tener acceso a la nnemoria compartida al mismo tiempo. En jurisdicciones donde impera la ley de Murphy,^ podría suceder lo siguiente. El proce­ so A lee in y guarda su valor, 7, en una variable local llamada siguiente_ranura_desocupada. Justo en ese momento hay una interrupción de reloj y la CPU decide que el proceso A ya se ejecutó durante suficiente tiempo, así que cambia al proceso B. Éste también lee in, y también obtiene un 7, valor que almacena en su variable local siguiente_ranura_desocupada. En este momento, ambos procesos creen que la siguiente ranura disponible es la 7. Ahora el proceso B continúa su ejecución. Coloca el nombre de su archivo en la ranura 7 y actualiza in a 8 . Luego se pone a hacer otras cosas. En algún momento, el proceso A se ejecuta otra vez, a partir del punto en donde se quedó. A continuación examina siguiente_ranura_desocupada, encuentra un 7 y escribe su nombre de ar­ chivo en la ranura 7, borrando el nombre que el proceso B acaba de poner. Después calcula si- tSi algo puede salir mal, saldrá mal.

RkJQdWJsaXNoZXIy MjI4NDcx