Sistemas operativos modernos

Esta implementación no especifica dónde va el algoritmo de reemplazo de páginas. Lo más ordenado sería tenerlo en el paginador externo, pero tal enfoque tiene ciertos problemas. El prin­ cipal de ellos es que el paginador externo no tiene acceso a los bits i? y M de todas las páginas, que se usan en muchos de los algoritmos de paginación. Se necesitaría algún mecanismo para pasar esa información al paginador externo, o bien, colocar el algoritmo de reemplazo de pági­ nas en el kemel. En este úlfimo caso, el manejador de fallos le indica al paginador externo la pá­ gina que escogió para desalojar y proporciona los datos, sea estableciendo una correspondencia entre ellos y el espacio de direcciones del paginador externo, o bien, incluyéndolos en un men­ saje. De cualquier manera, el paginador externo escribe los datos en el disco. La principal ventaja de esta implementación es que el código es más modular y hay mayor flexibilidad. La principal desventaja es el gasto adicional que implica cruzar la frontera usua- úo-kemel varias veces, y el que requieren los diversos mensajes que se transfieren entre los componentes del sistema. De momento, el tema es motivo de muchas controversias, pero a me­ dida que aumenta la velocidad de las computadoras y el software se vuelve más complejo, lo más probable es que la mayoría de los implementadores llegue a considerar aceptable sacrifi­ car algo de desempeño a cambio de una mayor fiabilidad del software. 4.8 SEGMENTACION La memoria virtual que hemos tratado hasta ahora es unidimensional porque las direcciones virtuales van desde cero hasta alguna dirección máxima, y son consecutivas. En el caso de va­ rios problemas, podría ser mucho mejor tener dos o más espacios de direcciones distintos que sólo uno. Por ejemplo, un compilador tiene muchas tablas que se van creando a medida que avan­ za la compilación, y que podrían incluir: 1. El texto fuente que se guarda para el listado impreso (en sistemas por lotes). 2. La tabla de símbolos, que confiene los nombres y atributos de las variables. 3. La tabla que contiene todas las constantes enteras y de punto flotante empleadas. 4. El árbol de análisis sintáctico, que contiene el análisis del programa. 5. La pila empleada para las llamadas a procedimientos dentro del compilador. Las primeras cuatro tablas crecen en forma continua conforme avanza la compilación. La última crece y decrece de forma impredecible durante la compilación. En una memoria unidi­ mensional, tendrían que asignarse trozos contiguos de espacio de direcciones virtuales a estas cinco tablas, como en la figura 4-35. Consideremos qué sucede si un programa tiene un número excepcionalmente grande de va­ riables pero una cantidad normal de todo lo demás. El trozo del espacio de direcciones asigna­ do a la tabla de símbolos podría llenarse, pero podría haber espacio de sobra en las demás tablas. Desde luego, el compilador podría limitarse a emitir un mensaje en el sentido de que la compilación no puede continuar porque hay demasiadas variables, pero eso no parece muy ca­ balleroso si pensamos que queda espacio sin utilizar en las demás tablas.

RkJQdWJsaXNoZXIy MjI4NDcx