You are on page 1of 45

316

Sistemas operativos. Una visin aplicada

Tabla 5.1 Comparativa de los esquemas de gestin de la memoria del sistema. Esquema de gestin Registros lmite Registro base y lmite Segmentacin Paginacin Seg. paginada global Seg. paginada local SASOS Resolucin/R.mdulos Compilador/montador Compilador/montador Compilador/montador Compilador/montador Compilador/montador Compilador/montador Compilador/montador R. regiones R. procesos Montador Cargador Montador MMU MMU (seg) Montador MMU (pg) MMU (seg) MMU (seg) MMU (pg) Montador Cargador R. global MMU (pg) MMU (pg)

Aclaracin 5.7. En algunas arquitecturas, las direcciones que se usan para acceder a memoria (llamadas capabilities), adems de la referencia a la posicin de memoria propiamente dicha, incluyen uno o ms bits de informacin de proteccin, que, entre otras cosas, identifican que se trata de una direccin de acceso a memoria. El aspecto interesante de las capabilities es que slo se pueden modificar estando en modo privilegiado. Por tanto, slo en dicho modo se pueden generar direcciones vlidas de acceso a memoria. Un proceso podr usar las posiciones de memoria que le ha asignado el sistema operativo, puesto que ste le ha proporcionado las capabilities requeridas para acceder a las mismas. Sin embargo, no podr acceder a otras direcciones, puesto que la unidad de control del procesador asegura que una capability slo se puede modificar en modo privilegiado. El mecanismo de capabilities asegura la proteccin requerida, permitiendo usar direcciones fsicas directamente, lo que elimina el problema de las autorreferencias. La reubicacin necesaria se puede realizar por software. El nico problema de este mecanismo, que ha limitado considerablemente su impacto, es que requiere un procesador con una arquitectura muy especfica. Para terminar esta seccin, se plantea la tabla 5.1, que sirve de recapitulacin de la misma y muestra una comparativa de los distintos esquemas de gestin de memoria estudiados, mostrando cmo se llevan a cabo las distintas etapas identificadas en la seccin 5.2.5.

5.5. MEMORIA VIRTUAL


En prcticamente todos los sistemas operativos de propsito general actuales se usa la tcnica de memoria virtual. Hasta el momento, por motivos pedaggicos, se han presentado los diversos esquemas de memoria sin apenas hacer referencia a esta tcnica. En esta seccin se estudiar esta tcnica mostrando cmo se integra con estos esquemas de gestin de memoria. En el primer captulo ya se presentaron los fundamentos de la memoria virtual, explicando aspectos tales como la jerarqua de memoria o la proximidad de referencias, por lo que no se volver a incidir en los mismos. Como se apreciar a lo largo de esta seccin, la memoria virtual resuelve dos de los objetivos del sistema de memoria identificados al principio del captulo: ejecutar ms procesos de los que caben en la memoria principal, y ejecutar un proceso cuyo mapa no cabe en la memoria. Antes de la aparicin de la memoria virtual, esas dos necesidades ya existan y se intentaban resolver de la mejor manera posible, teniendo en cuenta la tecnologa presente por entonces. Esta seccin, por tanto, comenzar presentando las tcnicas de intercambio y de overlays como precedentes de la memoria virtual. A continuacin, se analizarn las diversas polticas de administracin de la memoria virtual, especialmente, las estrategias de reemplazo y las polticas de reparto de la memoria entre los procesos.

5.5.1. Intercambio
Como se coment previamente, la tcnica del intercambio (swapping) signific en su momento una manera de permitir que en los sistemas del tiempo compartido existieran ms procesos de los que caben en memoria.

Gestin de memoria

317

Se puede considerar que se trata de un mecanismo antecesor de la memoria virtual. En este apartado se presentarn de forma breve los fundamentos de esta tcnica. El intercambio se basa en utilizar un disco o parte de un disco como respaldo de la memoria principal. Esta zona de almacenamiento se denomina dispositivo de swap. Cuando no caben en memoria todos los procesos activos (por ejemplo, debido a que se ha creado uno nuevo), se elige un proceso residente y se copia en swap su imagen en memoria. El criterio de seleccin puede tener en cuenta aspectos tales como la prioridad del proceso, el tamao de su mapa de memoria, el tiempo que lleva ejecutando y, principalmente, su estado. Es preferible expulsar (swap out) procesos que estn bloqueados. Cuando se expulsa un proceso, no es necesario copiar toda su imagen al dispositivo de swap. Los huecos en el mapa no es preciso copiarlos, ya que su contenido es intrascendente. Tampoco se tiene que copiar el cdigo, puesto que se puede volver a recuperar directamente del ejecutable. Evidentemente, un proceso expulsado tarde o temprano debe volver a activarse y cargarse en memoria principal (swap in). Slo se deberan volver a cargar aquellos procesos que estn listos para ejecutar. Esta readmisin en memoria se activar cuando haya espacio de memoria disponible (por ejemplo, debido a que se ha terminado un proceso) o cuando el proceso lleve un cierto tiempo expulsado. Tngase en cuenta que al tratarse de un sistema de tiempo compartido, se debe repartir el procesador entre todos los procesos. Por ello, en numerosas ocasiones hay que expulsar un proceso para poder traer de nuevo a memoria a otro proceso que lleva expulsado un tiempo suficiente. La estrategia que decide cundo expulsar un proceso a swap y cundo reincorporarlo a memoria se corresponde con la planificacin a medio plazo presentada en el captulo 4. En cuanto al dispositivo de swap, hay dos alternativas en la asignacin de espacio: Con preasignacin: Al crear el proceso ya se reserva espacio de swap suficiente para albergarlo. Si el proceso nunca se expulsa, se desperdicia el espacio asignado. Sin preasignacin. Slo se reserva espacio de swap cuando se expulsa el proceso. Puede haber problemas si se intenta expulsar un proceso a swap para traer a otro proceso y no hay espacio en el dispositivo. Un ltimo aspecto a tener en cuenta es que no debera expulsarse un proceso mientras se estn realizando operaciones de entrada/salida por DMA vinculadas a su imagen de memoria, ya que provocara que el dispositivo accediera al mapa de otro proceso.

5.5.2. Overlays
En los tiempos en los que todava no se haba propuesto la tcnica de memoria virtual y las memorias tenan una capacidad limitada, se presentaba con cierta frecuencia el problema de que un determinado programa no cupiera en memoria. Para resolver dentro de lo posible este problema, se ide la tcnica de los overlays. Se trataba de un esquema que no era transparente al programador, puesto que ste tena que determinar si ciertos mdulos de su programa no requeran estar simultneamente en memoria en tiempo de ejecucin y que, por tanto, podran usar la misma zona de memoria en distintas fases de ejecucin del programa. El programador usaba un lenguaje de definicin de overlays para notificar al montador esta informacin. El montador generaba un fichero ejecutable en el que inclua automticamente cdigo para cargar y descargar los mdulos del programa. En la llamada desde un mdulo a una funcin definida en otro mdulo, el montador inclua cdigo que comprobaba si el mdulo destino estaba ya cargado en memoria. En caso de no estarlo, el cdigo incluido por el montador cargaba ese mdulo, usando para ello, si es necesario, el espacio ocupado por otro mdulo cuya presencia no se requiere segn indica la informacin suministrada al montador.

5.5.3. Fundamento de la memoria virtual


Como se estudi en el primer captulo, la memoria en un sistema est organizada como una jerarqua de niveles de almacenamiento entre los que se mueve la informacin dependiendo de las necesidades de los procesos

318

Sistemas operativos. Una visin aplicada

en un determinado instante. La tcnica de memoria virtual se ocupa de la transferencia de informacin entre la memoria principal y la secundaria. La memoria secundaria est normalmente soportada en un disco (o particin). Dado que, como se ver ms adelante, la memoria virtual se implementa sobre un esquema de paginacin, este dispositivo se denomina dispositivo de paginacin. Tambin se usa el trmino dispositivo de swap. Aunque este trmino proviene de la tcnica del intercambio, por tradicin se usa frecuentemente y se utilizar indistintamente en esta exposicin. En cualquier caso, hay que resaltar que la memoria secundaria no slo est formada por el dispositivo de paginacin, sino que tambin forma parte de la misma el sistema de ficheros. Tngase en cuenta que, como se analizar en esta seccin, al ser expulsadas, algunas pginas se transferirn al dispositivo de paginacin, mientras que otras lo harn al sistema de ficheros. Es importante recordar en este punto que, como se explic en el primer captulo, el buen rendimiento del sistema de memoria virtual est basado en que los procesos presentan la propiedad de proximidad de referencias. Esta propiedad permite que un proceso genere muy pocos fallos aunque tenga en memoria principal slo una parte de su imagen de memoria (conjunto residente). El objetivo del sistema de memoria virtual es intentar que la informacin que est usando un proceso en un determinado momento (conjunto de trabajo) est residente en memoria principal, es decir, que el conjunto residente del proceso contenga su conjunto de trabajo. Algunos beneficios del uso de memoria virtual son los siguientes: Se produce un aumento del grado de multiprogramacin al no ser necesario que todo el mapa de memoria de un proceso est en memoria principal para poder ejecutarlo. Este aumento implica una mejora en el rendimiento del sistema. Sin embargo, como se analiz en el segundo captulo, si el grado de multiprogramacin se hace demasiado alto, el nmero de fallos de pgina se dispara y el rendimiento del sistema baja drsticamente. Esta situacin se denomina hiperpaginacin y se estudiar ms adelante. Se pueden ejecutar programas ms grandes que la memoria principal disponible. Hay que resaltar que el objetivo de la memoria virtual no es acelerar la ejecucin de un programa. En algunos casos, puede hacerlo, especialmente, en situaciones donde el proceso no accede a todo su cdigo o a todos sus datos durante su ejecucin, no siendo necesario, por tanto, leerlos del ejecutable. Sin embargo, en otras ocasiones, puede incluso ralentizar la ejecucin, debido a la sobrecarga asociada a las transferencias entre la memoria principal y la secundaria. Esto hace que esta tcnica no sea apropiada para sistemas de tiempo real, adems de por hacer que sea poco predecible el comportamiento de los procesos. Como se ha analizado en los apartados anteriores, la memoria virtual se construye generalmente sobre un esquema de paginacin, ya sea paginacin simple o segmentacin paginada. Por tanto, las unidades de informacin que se transfieren entre la memoria principal y la secundaria son pginas. Las transferencias desde la memoria secundaria hacia la principal se realizan normalmente bajo demanda (paginacin por demanda). Cuando un proceso necesita acceder a una pgina que no est en memoria principal (a lo que se denomina fallo de pgina), el sistema operativo se encarga de transferirla desde la memoria secundaria. Si al intentar traer la pgina desde memoria secundaria, se detecta que no hay espacio en la memoria principal (no hay marcos libres), ser necesario expulsar una pgina de la memoria principal y transferirla a la secundaria. Por tanto, las transferencias desde la memoria principal hacia la secundaria se realizan normalmente por expulsin. El algoritmo para elegir qu pgina debe ser expulsada se denomina algoritmo de reemplazo y se analizar ms adelante. Dado que se est usando la paginacin para construir un esquema de memoria virtual, se puede usar indistintamente el trmino de direccin lgica y el de direccin virtual para referirse a las direcciones que genera un programa. Para construir un esquema de memoria virtual sobre un procesador que ofrezca paginacin, se utiliza el bit de la entrada de la tabla de pginas que indica si la pgina es vlida. Estarn marcadas como invlidas todas las entradas correspondientes a las pginas que no estn residentes en memoria principal en ese instante. Dado que se utiliza el bit validez para marcar la ausencia de una pgina y este mismo bit tambin se usa para indicar que una pgina es realmente invlida (una pgina que corresponde a un hueco en el mapa), es necesario que el sistema operativo almacene informacin asociada a la pgina para distinguir entre esos dos casos. En caso de que la pgina sea vlida pero no residente, el sistema operativo tambin deber guardar informacin de en qu bloque de la memoria secundaria est almacenada la pgina. De esta forma, cuando se

Gestin de memoria
Fichero Fallo Memoria

319

Expulsin y modificada

Figura 5.67 Ciclo de vida de una pgina de una regin compartida con soporte. produzca un acceso a una de estas pginas, se producir una excepcin (fallo de pgina) que activar al sistema operativo, que ser el encargado de traerla desde la memoria secundaria.

5.5.4. Ciclo de vida de una pgina


Antes de analizar los distintos aspectos vinculados con la memoria virtual, es conveniente analizar cmo evoluciona una pgina en un sistema con memoria virtual, dependiendo de a qu tipo de regin pertenece, fijndose en dos caractersticas de la misma: si es privada o compartida y si tiene soporte o es annima. Pgina de una regin compartida con soporte en un fichero. Cada vez que se produzca un fallo al acceder a esta pgina por no estar presente en memoria principal, habr que leerla del fichero que la contiene. Por otra parte, al ser expulsada estando modificada, habr que volverla a escribir en el fichero, puesto que los cambios sobre una regin compartida deben revertir al fichero. La figura 5.67 muestra cmo es la evolucin de este tipo de pginas. Pgina de una regin privada con soporte en un fichero. Mientras no se modifique la pgina, estar vinculada al soporte y todos los fallos se servirn leyendo del fichero. En cuanto se modifique una vez, queda desvinculada del soporte original, y al ser expulsada, se escribir en swap. Los fallos posteriores se servirn de swap, y las expulsiones que encuentren la pgina modificada la escribirn en swap. Esta es la esencia de una regin privada: los cambios sobre la misma no afectan al soporte original. Para entender la utilidad de este modo de operacin, recuerde que se utiliza con la regin de datos con valor inicial de un programa o de una biblioteca dinmica. Despus de acceder a una variable global con valor inicial para modificarla, cuando sea expulsada la pgina que la contiene, no podemos volver a escribirla en el fichero ejecutable, puesto que estaramos cambiando el propio programa. La figura 5.68 muestra la evolucin de una pgina de estas caractersticas. Pgina de una regin annima, ya sea privada o compartida. Por motivos de seguridad, cuando se accede por primera vez a una pgina de este tipo, se rellena con ceros el marco de pgina usado para la misma, no requiriendo un acceso a disco. Si la pgina se expulsa sin ser modificada (lo cual es bastante improbable puesto que, al no tener un valor inicial, lo ms habitual es que el primer acceso sea de escritura), no es necesario escribirla en el disco. El siguiente fallo volver a rellenar el marco elegido con ceros. En cuanto se modifique una vez la pgina, al ser expulsada, se escribir en swap. Los fallos posteriores se servirn de swap y las expulsiones que encuentren la pgina modificada la escribirn en swap. Recuerde que la regin de datos sin valor inicial de un programa o de una biblioteca dinmica son de este tipo, teniendo, adems, carcter privado. Tambin entra en esta categora una zona de memoria compartida que no est basada en un fichero. La figura 5.69 muestra la evolucin de una pgina de este tipo.

5.5.5. Polticas de administracin de la memoria virtual


Como se analiz en el primer captulo, el modo de interaccin entre dos niveles de la jerarqua queda definido por un conjunto de polticas que establecen de qu forma se realizan las transferencias entre ambos. En el

320

Sistemas operativos. Una visin aplicada


Fichero Fallo (mientras no modificada una vez) Memoria

Expulsin y modificada

Fallos y expulsiones una vez modificada

Swap

Figura 5.68 Ciclo de vida de una pgina de una regin privada con soporte. caso de la memoria virtual, los niveles implicados son la memoria principal y la secundaria, y las polticas que definen el comportamiento de un sistema de memoria virtual son las siguientes: Poltica de localizacin. Permite localizar una determinada pgina dentro de la memoria secundaria. Poltica de extraccin. Define cundo se transfiere una pgina desde la memoria secundaria a la principal. Poltica de ubicacin. Si hay varios marcos libres, establece cul de ellos se utiliza para almacenar la pgina que se trae a memoria principal. Poltica de reemplazo. En caso de que no haya marcos libres, determina qu pgina debe ser desplazada de la memoria principal para dejar sitio a la pgina entrante. Poltica de actualizacin. Rige cmo se propagan las modificaciones de las pginas en memoria principal a la memoria secundaria. Poltica de reparto de espacio entre los procesos. Decide cmo se reparte la memoria fsica entre los procesos existentes en un determinado instante. Sobre las polticas de ubicacin y de actualizacin hay poco que comentar. Con respecto a la primera, en principio, se puede usar cualquier marco libre para albergar una pgina leda de la memoria secundaria. Sin embargo, algunos sistemas operativos intentan seleccionar el marco de manera que se mejore el rendimiento de la memoria cach. Esta tcnica, denominada coloracin de pginas, intenta que las pginas residentes en memoria en un momento dado estn ubicadas en marcos cuya distribucin en las lneas de la cach sea lo ms uniforme posible. En cuanto a la poltica de actualizacin, dada la enorme diferencia entre la velocidad de transferencia de la memoria principal y la de la secundaria, no es factible usar una poltica de actualizacin inmediata, utilizndose, por tanto, una poltica de escritura diferida: slo se escribir una pgina a memoria secundaria cuando sea expulsada de la memoria principal estando, adems, modificada. En las prximas secciones se analizarn las cuatro polticas restantes.

Fallo (mientras no modificada una vez)

Rellenar con ceros Memoria

Expulsin y modificada

Fallos y expulsiones una vez modificada

Swap

Figura 5.69 Ciclo de vida de una pgina de una regin annima.

Gestin de memoria
Fichero F Swap (SW1)
0 8192 R-X Comp. F Bl. inicial 0 8192 8192 RW- Privada F Bl. inicial 2

321

Cd. 0 Cd. 1 DVI 0


Fichero DVI 1

Bloq. 0 Bloq. 1 Bloq. 2 Fichero Bloq. 3 .........

.........

Mapa de memoria de P1
0 8192 16384 20480 Regin 1 (R-X) Regin 2 (RW-) Regin 3 (RW-) ......... .........

BCP de P1
t. de regiones t. pginas

16384 4096 RW- Privada Annima

Memoria
Marco 0 Marco 1

00004 V R-X 00000 I 000 00001 I SW1 00000 I 000 00000 I 000 00000 I 000 .........

Pgina 0 de P1 .........................

Marco 2 Marco 3 Marco 4 ........

Figura 5.70 Posibles ubicaciones de una pgina.

5.5.6. Poltica de localizacin


Como se coment al principio de esta seccin, la paginacin por demanda se basa en hacer creer a la MMU que la pgina no residente es invlida para que produzca una excepcin de fallo de pgina cuando se acceda a la misma. De esta manera, el sistema operativo puede activarse para tratar la excepcin y traer la pgina de memoria secundaria. Sin embargo, es necesario que el sistema operativo pueda saber si la pgina realmente es vlida, y, en caso de serlo, cmo localizarla. Con respecto a la determinacin de la validez, la mayora de los sistemas operativos consultan la tabla de regiones buscando en qu regin est englobada la direccin de fallo. Dado que un proceso puede tener un nmero elevado de regiones, para agilizar la operacin de comprobar si la direccin es vlida, la tabla de regiones se organiza como una estructura de datos que permita una bsqueda eficiente y elimine la necesidad de un recorrido lineal de la tabla. Habitualmente, se utiliza un rbol binario ordenado por la direccin de comienzo de cada regin. De esta forma, el tiempo de bsqueda es logartmico con respecto al nmero de regiones del proceso en vez de lineal. Adems, esta estructura permite realizar eficientemente operaciones de insercin y borrado de regiones. En caso de que la direccin que provoca el fallo no encaje en ninguna regin, se trata de una pgina invlida, que corresponde a un hueco en el mapa de memoria del proceso, por lo que se abortar el proceso o se le mandar una seal. En el ejemplo mostrado en la figura 5.70, la sexta entrada de la tabla de pginas se corresponde con un hueco en el mapa del proceso. Si el proceso intenta acceder a una direccin incluida en ese hueco, como la 20500, se producir una excepcin de fallo de pgina, dentro de cuyo tratamiento el sistema operativo determinar que el acceso es invlido, al no estar incluida en ninguna regin la direccin de fallo. Para entender el proceso de localizacin, hay que analizar qu cuatro casos se pueden presentar para una pgina vlida, como se muestra en la figura 5.70. Pgina residente en memoria. Se trata de una pgina a la que se ha accedido y en este momento est residente en memoria. La entrada de la tabla de pginas identifica al marco que contiene la pgina. La primera entrada de la tabla de pginas de la figura se corresponde con este caso, estando almacenada en el marco 4.

322

Sistemas operativos. Una visin aplicada

Pgina no residente almacenada en un fichero. Corresponde a una pgina no residente cuyo contenido est almacenado en un bloque de un fichero. Cuando se produzca un fallo, el sistema operativo localizar la regin a la que pertenece la pgina y podr comprobar en el descriptor de la regin que se trata de una regin con soporte en un fichero, obteniendo informacin acerca de qu fichero se trata y a qu parte del mismo corresponde la regin. Calculando el desplazamiento de la pgina con respecto al inicio de la regin y sabiendo en qu posicin del fichero comienza la regin, se puede determinar en qu bloque del fichero se ubica la pgina. La segunda y cuarta entradas de la tabla de pginas de la figura son ejemplos de esta situacin. La segunda entrada est vinculada a la regin 1. El descriptor de esa regin indica que se trata de una regin con soporte en el fichero F, estando ubicada al principio del mismo. Dado que se trata de la segunda pgina de esa regin, habr que leer el bloque 1 del disco para obtener su contenido. En cuanto a la cuarta entrada, est incluida en la regin 2, cuyo descriptor indica que tambin tiene soporte en el fichero F, pero, comenzando en el bloque 2 del mismo. Como se trata de la segunda pgina de esta regin, habr que leer el bloque 3 del disco para obtener su contenido. Pgina no residente de tipo annima. Se trata de una pgina no residente perteneciente a una regin sin soporte. Cuando se produzca un fallo al acceder a esta pgina y se detecta que la regin es de este tipo, basta con buscar un marco libre y, por motivos de seguridad, rellenarlo con ceros. La quinta entrada de la figura 5.70 corresponde a una pgina de este tipo. Cuando se produzca un fallo al intentar acceder a la misma, se detectar que pertenece a una regin annima y se proceder a rellenarla con ceros. Es interesante resaltar que en el sistema operativo Linux, en el inicio del sistema y durante todo el tiempo que est arrancado, se reserva un marco de pgina de slo lectura relleno con ceros. De esta forma, en vez de rellenar la pgina con ceros explcitamente, se comparte, usando COW, que ser explicado ms adelante, hasta que el programa haga alguna modificacin sobre la misma. Pgina en swap. Como se explic anteriormente, las pginas de las regiones sin soporte y de las regiones privadas, una vez modificadas, si se expulsan, son escritas en el dispositivo de paginacin. En este caso, la informacin de ubicacin de la pgina en el disco no puede almacenarse en el descriptor de la regin, a no ser que habilitemos espacio para cada una de las pginas de la misma. En su lugar, la mayora de los sistemas operativos optan por almacenar la informacin de ubicacin en el swap dentro de la propia entrada de la tabla de pginas. Esta informacin suele consistir en un identificador del dispositivo de swap, ya que, normalmente, se permiten mltiples dispositivos de swap en el sistema, junto con un nmero de bloque dentro del dispositivo. Ntese que, dado que cuando una entrada de la tabla de pginas es invlida el valor de los campos de la misma es intrascendente, se aprovecha para almacenar la informacin de swap en esos campos. La tercera entrada de la tabla de pginas de la figura 5.70 corresponde a este caso. Se trata de una pgina de una regin privada con soporte en fichero que ya ha sido modificada alguna vez y que, por tanto, est vinculada al swap. Cuando se produzca un fallo sobre esta pgina, despus de realizar la validacin de la direccin, se detectar que la entrada de la tabla de pginas tiene un valor distinto de cero (en los dems casos de pginas vlidas pero no residentes, se habrn rellenado con ceros todos los campos de la entrada de la tabla de pginas). Se usar el valor almacenando en la entrada (en este caso, dispositivo SW1 y bloque 1 del mismo) para saber qu bloque leer.

5.5.7. Poltica de extraccin


La memoria virtual, en su forma ortodoxa, opera bajo demanda: slo se trae a memoria principal una pgina cuando el proceso accede a la misma. Sin embargo, casi todos los sistemas operativos implementan algn tipo de agrupamiento de pginas o de lectura anticipada de pginas, de manera que cuando se produce un fallo de pgina, no slo se trae a memoria la pgina involucrada, sino tambin algunas pginas prximas a la misma, puesto que, basndose en la propiedad de proximidad de referencias que caracteriza a los programas, es posible que el proceso las necesite en un corto plazo de tiempo. Estas tcnicas suelen englobarse bajo el trmino de prepaginacin. La efectividad de las mismas va a depender de si hay acierto en esta prediccin,

Gestin de memoria

323

es decir, si finalmente las pginas tradas van a ser usadas, puesto que, en caso contrario, se ha perdido tiempo en traerlas, expulsando, adems, de la memoria principal a otras pginas que podran haber sido ms tiles. Hay que resaltar que en el sistema de ficheros tambin se utilizan tcnicas de lectura anticipada, lo cual no puede sorprender por la fuerte interaccin, y progresiva fusin, entre estos dos componentes. Dado que en la fase de arranque de un programa es donde ms se hace patente la sobrecarga de la memoria virtual, al producirse numerosos fallos mientras el conjunto de trabajo del programa va cargndose en memoria, en algunos sistemas operativos se realiza un seguimiento de los primeros segundos de la ejecucin del programa, guardando informacin sobre los fallos de pgina que provoca. De esta manera, cuando arranca nuevamente un programa, se puede realizar una lectura anticipada dirigida de las pginas que probablemente va a usar el mismo durante su fase inicial. Volviendo a la paginacin por demanda, que es la mdula espinal de la memoria virtual, la mayor parte de la lgica que controla esta tcnica est articulada alrededor de la rutina del tratamiento del fallo de pgina. A continuacin, se analizan con ms detalle las operaciones vinculadas con un fallo de pgina. Tratamiento del fallo de pgina La paginacin por demanda est dirigida por la aparicin de excepciones de fallo de pgina que indican al sistema operativo que debe traer una pgina de memoria secundaria a primaria, puesto que un proceso la requiere. A continuacin, se especifican los pasos tpicos en el tratamiento de un fallo de pgina: La MMU del procesador produce una excepcin, dejando, habitualmente, en un registro especial la direccin que provoc el fallo. Se activa el sistema operativo que comprueba si se trata de una direccin correspondiente a una pgina realmente invlida o se corresponde con una pgina ausente de memoria. Para ello, como se coment previamente, acceder a la tabla de regiones para encontrar a qu regin pertenece la direccin que produjo el fallo. Si no pertenece a ninguna, la pgina es invlida, por lo que se aborta el proceso o se le manda una seal. En caso contrario, se realizan los pasos que se describen a continuacin. Evidentemente, si la direccin es del sistema y el proceso estaba en modo usuario cuando se produjo el fallo, ser tambin invlida. Se consulta la tabla de marcos para buscar uno libre. Si no hay un marco libre, se aplica el algoritmo de reemplazo para seleccionar la pgina que se expulsar. El marco seleccionado se desconectar de la pgina a la que est asociado poniendo como invlida la entrada correspondiente. Si la pgina est modificada, previamente hay que escribir su contenido a la memoria secundaria: Si la pgina pertenece a una regin de tipo compartida y con soporte en fichero, hay que escribirla en el bloque correspondiente del fichero. En el resto de los casos, hay que escribirla en swap, almacenndose en la entrada de la tabla de pginas la identificacin del bloque de swap que contiene la pgina. Una vez que se obtiene el marco libre, ya sea directamente o despus de una expulsin, se inicia la carga de la nueva pgina sobre el marco y, al terminar la operacin, se rellena la entrada correspondiente a la pgina para que est marcada como vlida y apunte al marco utilizado. La localizacin de la pgina se realizar tal como se explic en el apartado anterior. Tngase en cuenta que, en el peor de los casos, un fallo de pgina puede causar dos operaciones de entrada/salida al disco. En contraste, puede no haber ninguna operacin sobre el disco si hay marcos libres o la pgina expulsada no est modificada y, adems, la pgina que caus el fallo se corresponde con una regin annima que todava no se ha modificado ninguna vez. Para terminar, es conveniente realizar algunas consideraciones sobre el caso de que se produzca un fallo de pgina cuando el proceso estaba en modo sistema: Si la direccin de fallo corresponde a una direccin lgica de usuario y se estaba ejecutando una llamada al sistema, el fallo se produce debido a que se ha accedido al mapa de usuario del proceso para leer o escribir algn parmetro de la llamada. El tratamiento del fallo es el habitual (comprobar si est incluido en alguna regin, buscar un marco libre, etc.)

324

Sistemas operativos. Una visin aplicada


0 8192 R-X Comp. F Bl. inicial 0 8192 8192 RW- Privada F Bl. inicial 2
Memoria

BCP de P1
t. de regiones t. pginas

.............

Tablas de pginas de segundo nivel V V I I

V I Tabla de pginas de primer nivel I I I I

I I

Figura 5.71 Creacin de tablas de pginas por demanda. En caso de que la direccin de fallo corresponda a una direccin lgica de usuario y se estuviera ejecutando una interrupcin, se tratara de un error en el cdigo del sistema operativo, puesto que, dado que una interrupcin tiene un carcter asncrono y no est directamente vinculada con el proceso en ejecucin, no debe acceder al mapa de usuario del proceso en ninguna circunstancia. El tratamiento sera el habitual ante un error en el sistema operativo (podra ser, por ejemplo, sacar un mensaje por la consola y realizar una parada ordenada del sistema operativo). Si la direccin de fallo es una direccin lgica de sistema, a su vez, podran darse varios casos: Si se trata de un sistema operativo que permite que pginas del sistema se expulsen a disco, se comprobara si la direccin corresponde a una de esas pginas y, si es as, se leera de disco. Si se usa un procesador que tiene una tabla nica para direcciones de usuario y de sistema, y en el que, por tanto, se duplican las entradas correspondientes al sistema operativo en las tablas de pginas de todos los procesos, el fallo puede deberse a que se ha aadido una nueva entrada del sistema en la tabla de un proceso, pero no se ha propagado a los restantes. De esta forma, la propagacin de este cambio se hace tambin por demanda, no tratndose de un error. En todos los dems casos, se correspondera con un error en el cdigo del sistema operativo. Creacin de tablas de pginas por demanda Si se analiza el proceso de localizacin de las pginas explicado previamente, se puede apreciar en el mismo que las entradas de la tabla de pginas slo se usan cuando las pginas estn residentes, o cuando estn almacenadas en swap, siendo la tabla de regiones el elemento clave de la gestin. Basndose en este hecho, se puede extender la poltica de operacin bajo demanda a la propia creacin de las tablas de pginas intermedias requeridas en los sistemas de paginacin multinivel. De la misma manera que cuando se crea una regin en un sistema con memoria virtual no es necesario asignarle marcos hasta que no se acceda a las pginas de la regin, como se analizar en la seccin 5.5.14, se puede diferir la creacin de las tablas de pginas intermedias requeridas por la regin hasta que se produzca ese acceso. De esta forma, el proceso inicialmente slo dispone de la tabla de pginas de nivel superior con todas las entradas marcadas como invlidas. Cuando se produce un fallo y se detecta que las tablas de pginas intermedias requeridas por esa pgina no se han creado todava, se reserva memoria para las mismas en ese momento, inicindolas como invlidas. En la figura 5.71 se muestra un ejemplo de uso de este mecanismo. En el mismo, el proceso slo ha accedido a dos pginas. El primer acceso provoc un fallo que se produ-

Gestin de memoria

325

jo en la tabla de primer nivel. Una vez que se comprueba que la direccin es vlida usando la tabla de regiones, se reserva la tabla de segundo nivel, adems del propio marco que alojar la pgina. El segundo acceso ha provocado un fallo en la tabla de segundo nivel, por tanto, slo requiere reservar el marco para la pgina. Con este mecanismo, la tabla de regiones es el elemento conductor del proceso y slo es necesario tener desplegadas las tablas de pginas para las pginas residentes, lo cual resulta especialmente beneficioso para procesos con un espacio de direcciones disperso. Realmente, con el esquema que hemos planteado, tambin hara falta tener desplegadas las tablas si contienen entradas que se refieren a bloques de swap, aunque este ltimo requisito podra eliminarse si se almacena esta informacin en otra estructura de datos, como, por ejemplo, la tabla de regiones.

5.5.8. Poltica de reemplazo


Una de las polticas principales de un sistema de memoria virtual, y una de las que puede afectar ms a su rendimiento, es la que determina qu pgina expulsar cuando hay que traer otra de memoria secundaria y no hay espacio libre. Este mismo problema se presenta en todos los niveles de la jerarqua y, aunque, en cierta medida, hay similitudes, en cada nivel se presentan aspectos especficos debido a las diferencias intrnsecas entre los distintos componentes de memoria usados en la jerarqua, en cuanto a su velocidad y capacidad. Por otra parte, hay que resaltar que el problema de gestionar la transferencia de informacin entre la memoria principal y el disco no se restringe al sistema de memoria virtual, sino que aparece en la gestin de la cach del sistema de ficheros, as como en los sistemas gestores de bases de datos. Aunque muchos algoritmos usados en estos mbitos son similares a los utilizados en la memoria virtual, hay que tener en cuenta que existe una importante diferencia entre el modo de operacin del sistema de ficheros, o de un gestor de base de datos, y el sistema de memoria. En los primeros, existe una peticin explcita por parte de la aplicacin para acceder a la informacin, pudiendo, por tanto, el sistema operativo (o el gestor de base de datos) tener control sobre qu accesos se van realizando. En cambio, en la memoria, el proceso accede directamente a la misma sin que el sistema operativo sea consciente de ello. El sistema operativo slo toma control cuando se produce un fallo de pgina. Existen numerosos trabajos, tanto tericos como experimentales, sobre algoritmos de reemplazo de pginas. En esta seccin se describirn los algoritmos de reemplazo ms habituales, intentando mostrar las ltimas tendencias en este campo que, despus de un cierto periodo con pocas innovaciones, ha presentando importantes contribuciones en los ltimos tiempos. Las estrategias de reemplazo se pueden clasificar en dos categoras: reemplazo global y reemplazo local. Con una estrategia de reemplazo global se puede seleccionar para satisfacer el fallo de pgina de un proceso un marco que actualmente tenga asociada una pgina de otro proceso. Esto es, un proceso puede quitarle un marco de pgina a otro. La estrategia de reemplazo local requiere que para servir el fallo de pgina de un proceso slo puedan usarse marcos de pginas libres o marcos ya asociados al proceso. Todos los algoritmos que se describirn a continuacin pueden utilizarse tanto para estrategias globales como locales. Cuando se aplica un algoritmo determinado utilizando una estrategia global, el criterio de evaluacin del algoritmo se aplicar a todas las pginas en memoria principal. En el caso de una estrategia local, el criterio de evaluacin del algoritmo se aplica slo a las pginas en memoria principal que pertenecen al proceso que caus el fallo de pgina. La descripcin de los algoritmos, por tanto, se realizar sin distinguir entre los dos tipos de estrategias. El objetivo bsico de cualquier algoritmo de reemplazo es minimizar la tasa de fallos de pgina, intentando adems que la sobrecarga asociada a la ejecucin del algoritmo sea tolerable y que no se requiera una MMU con caractersticas especficas. En principio, de manera intuitiva, parece razonable pensar en tres factores a la hora de disear un algoritmo de estas caractersticas: Tiempo de residencia. Tener en cuenta el tiempo que lleva la pgina presente en memoria a la hora de expulsar una pgina. Como se analizar a continuacin, no es un buen criterio. Frecuencia de uso. Basarse en cuntas veces se ha accedido a una pgina para decidir cul reemplazar. Aunque el criterio es razonable, tiene ciertas limitaciones, que se analizarn enseguida.

326

Sistemas operativos. Una visin aplicada

Frescura de la pgina. Utilizar como criterio si la pgina se ha usado recientemente. Como se explicar a continuacin, es el criterio bsico de este tipo de algoritmos. Algoritmo de reemplazo ptimo El algoritmo ptimo, denominado tambin MIN, debe generar el mnimo nmero de fallos de pgina. Por ello, la pgina que se debe reemplazar es aqulla que tardar ms tiempo en volverse a usar. Evidentemente, este algoritmo es irrealizable, ya que no se puede predecir cules sern las siguientes pginas a las que se va a acceder. Este algoritmo sirve para comparar el rendimiento de los algoritmos que s son factibles en la prctica. Algoritmo FIFO (First Input/First Output, primera en entrar/primera en salir) Una estrategia sencilla e intuitivamente razonable es seleccionar para la sustitucin la pgina que lleva ms tiempo en memoria, es decir, basarse en el tiempo de residencia. La implementacin de este algoritmo es simple. Adems, no necesita ningn apoyo hardware especial. El sistema operativo debe mantener una lista de las pginas que estn en memoria, ordenada por el tiempo que llevan residentes. En el caso de una estrategia local, se utiliza una lista por cada proceso. Cada vez que se trae una nueva pgina a memoria, se pone al final de la lista. Cuando se necesita reemplazar, se usa la pgina que est al principio de la lista. Sin embargo, el rendimiento del algoritmo no es bueno en muchas ocasiones. La pgina que lleva ms tiempo en memoria puede contener instrucciones o datos a los que se accede con frecuencia. Poniendo un ejemplo extremo, piense en un programa pequeo, cuyo cdigo cabe en una sola pgina. Lo razonable sera que esa pgina nunca se expulsase, pero, con el algoritmo FIFO se expulsara con bastante frecuencia. En determinadas situaciones este algoritmo presenta un comportamiento sorprendente, conocido como la anomala de Belady. Intuitivamente, parece que cuantos ms marcos de pgina haya en el sistema, menos fallos de pgina se producirn. Sin embargo, ciertos patrones de referencias causan que este algoritmo tenga un comportamiento opuesto. El descubrimiento de esta anomala result al principio sorprendente y llev al desarrollo de modelos tericos para analizar los sistemas de memoria virtual. En la prctica, esta anomala es slo una curiosidad, que demuestra que los sistemas pueden tener a veces comportamientos inesperados. Algoritmo LRU (Least Recently Used, menos recientemente usada) El algoritmo LRU est basado en el principio de proximidad temporal de referencias: si es probable que se vuelvan a referenciar las pginas a las que se ha accedido recientemente, la pgina que se debe reemplazar es aqulla a la que no se ha hecho referencia desde hace ms tiempo. Dicho de otra forma, se intenta predecir el futuro prximo usando el pasado reciente. Se basa, por tanto, en un criterio de frescura de la pgina. El algoritmo LRU no sufre la anomala de Belady. Pertenece a una clase de algoritmos denominados algoritmos de pila. La propiedad de estos algoritmos es que las pginas residentes en memoria para un sistema con n marcos de pgina son siempre un subconjunto de las que habra en un sistema con n+1 marcos. Esta propiedad asegura que un algoritmo de este tipo nunca sufrir la anomala de Belady. Hay un aspecto sutil en este algoritmo cuando se considera su versin global. A la hora de seleccionar una pgina no habra que tener en cuenta el tiempo de acceso real, sino el tiempo lgico de cada proceso. O sea, habra que seleccionar la pgina que haya sido menos recientemente usada teniendo en cuenta el tiempo lgico de cada proceso. El algoritmo LRU se utiliza muy frecuentemente para la gestin de la cach del sistema de ficheros. Sin embargo, una implementacin exacta en un sistema de memoria virtual es difcil, ya que requiere un considerable apoyo hardware. Una implementacin del algoritmo podra basarse en lo siguiente: El procesador gestiona un contador que se incrementa en cada referencia a memoria. Cada posicin de la tabla de pginas ha de tener un campo de tamao suficiente para que quepa el contador. Cuando se hace referencia a una pgina, la MMU copia el valor actual del contador en la posicin de la tabla correspondiente a esa pgina (realmente, debera ser en la TLB, para evitar un acceso a la tabla por cada referencia). Cuando se produce un fallo de pgina, el sistema operativo examina los contadores de todas las pginas residentes en memoria y selecciona como vctima aqulla que tiene el valor menor.

Gestin de memoria
Inicio Ref = 1 Ref = 0 Ref = 1 Ref = 0

327

Ref = 1

Expulsada Ref = 0 Ref = 0

Ref = 0

Ref = 1

Ref = 1

Figura 5.72 Ejemplo del algoritmo del reloj. Esta implementacin es factible, aunque requiere un hardware complejo y muy especfico, y eso no es una buena idea. Como ya hemos comentado, y reiteraremos, varias veces a lo largo de los diversos captulos del libro, un sistema operativo, con el fin de facilitar su adaptacin a distintos procesadores, debera seguir una poltica de mnimos requisitos con respecto al hardware. Lo que se precisa es un algoritmo con unas prestaciones similares, pero que no requiera ningn hardware especfico. Algoritmo del reloj El algoritmo de reemplazo del reloj (o de la segunda oportunidad) es una modificacin sencilla del FIFO, que evita el problema de que una pgina muy utilizada sea eliminada por llevar mucho tiempo residente, proporcionando unas prestaciones similares a las del algoritmo LRU, sin requerir un hardware especfico. En este algoritmo, cuando se necesita reemplazar una pgina, se examina el bit de referencia de la pgina ms antigua (la primera de la lista en orden FIFO). Si no est activo, se usa esta pgina para el reemplazo. En caso contrario, se le da una segunda oportunidad a la pgina, ponindola al final de la lista y desactivando su bit de referencia. Por tanto, se la considera como si acabara de llegar a memoria. La bsqueda continuar hasta que se encuentre una pgina con su bit de referencia desactivado. Si todas las pginas tienen activado su bit de referencia, el algoritmo se convierte en FIFO. Para implementar este algoritmo se puede usar una lista circular de las pginas residentes en memoria, en vez de una lineal (en el caso de una estrategia local, se utiliza una lista circular por cada proceso). Existe un puntero que seala en cada instante al principio de la lista. Cuando llega a memoria una pgina, se coloca en el lugar donde seala el puntero y, a continuacin, se avanza el puntero al siguiente elemento de la lista. Cuando se busca una pgina para reemplazar, se examina el bit de referencia de la pgina a la que seala el puntero. Si est activo, se desactiva y se avanza el puntero al siguiente elemento. El puntero avanzar hasta que se encuentre una pgina con el bit de referencia desactivado. Esta forma de trabajo imita al comportamiento de un reloj donde el puntero que recorre la lista se comporta como la aguja del reloj. Debido a ello, esta estrategia se denomina algoritmo del reloj. La figura 5.72 muestra un ejemplo de este algoritmo, donde se puede apreciar que a las dos primeras pginas revisadas se les da una segunda oportunidad por tener el bit de referencia a uno, siendo seleccionada la tercera para la expulsin.

328

Sistemas operativos. Una visin aplicada

Como se coment previamente, se trata de un algoritmo sencillo, que slo requiere que el procesador gestione un bit de referencia, que suele ser lo habitual (incluso en procesadores que no gestionan este bit es relativamente sencillo implementarlo, simulndolo por software). Como el algoritmo LRU, tambin est basado en la frescura de la pgina, proporcionando un rendimiento similar. Esto ha hecho que, con pequeas variaciones especficas, sea el algoritmo utilizado en la mayora de los sistemas operativos actuales. Algoritmo LFU (Least Frequently Used, menos frecuentemente usada) Existe un nmero incontable de algoritmos de reemplazo en la literatura sobre gestin de memoria, por ello no tiene sentido hacer un repaso exhaustivo de los mismos en esta seccin. Sin embargo, se ha considerado conveniente hacer una breve resea de este algoritmo, puesto que, aunque no proporciona una buena solucin al problema, tiene en cuenta un factor que no era tomado en consideracin en los algoritmos presentados: la frecuencia de uso. La idea de este algoritmo es expulsar la pgina residente que menos accesos ha recibido. El problema de esta tcnica es que una pgina que se utilice con mucha frecuencia en un intervalo de ejecucin del programa obtendr un valor del contador muy alto, no pudiendo ser expulsada en el resto de la ejecucin del programa. Dada la escasa utilidad del algoritmo, no se entrar ms en detalle sobre su implementacin, aunque hay que resaltar que, como ocurra con el algoritmo LRU, necesitara una MMU especfica que gestionase un contador de referencias, o bien usar una versin aproximada del mismo, que gestionara el contador mediante muestreos peridicos del bit de referencia. Hay que resaltar que usar nicamente la frecuencia no es una buena estrategia, pero que, como se ver a continuacin, olvidarse totalmente de la frecuencia, como sucede con el algoritmo LRU, tampoco es una buena idea. Ms all del LRU Durante mucho tiempo se ha considerado que el algoritmo LRU, y su aproximacin prctica, el algoritmo del reloj, era la mejor solucin posible al problema del reemplazo. Sin embargo, el estudio de su comportamiento ha detectado algunos problemas de rendimiento ante situaciones relativamente frecuentes. Una de estas situaciones aparece cuando se accede una sola vez a un conjunto de pginas. A estas pginas no se volver a acceder, pero, sin embargo, se quedarn en memoria hasta que sean expulsadas siguiendo el orden LRU. Este tipo de situaciones aparece con cierta frecuencia, especialmente, cuando se accede a ficheros proyectndolos en memoria, como se analizar en la seccin 5.5.15. Imagine, por ejemplo, que en el sistema se ejecuta un programa que realiza una copia de seguridad de un conjunto de ficheros usando la tcnica de la proyeccin en memoria para acceder a los mismos. Aunque slo se acceda una vez a cada pgina de cada uno de estos ficheros, va a permanecer en memoria conforme a la estrategia LRU, impidiendo que otras pginas realmente tiles puedan estar en memoria. Se podra decir que ese acceso nico a los ficheros planteado en el ejemplo ha contaminado la memoria. El problema surge debido a que el algoritmo LRU se basa slo en el criterio de frescura de la pgina, olvidando totalmente la frecuencia de accesos a la misma, que tambin es un indicador adecuado del inters de la pgina, siempre que no se use como criterio nico. Para intentar adaptarse a esta circunstancia, surgi el algoritmo LRU/2 (realmente, la familia de algoritmos LRU/k), que usa el criterio LRU convencional, pero aplicado al penltimo acceso (de ah viene el 2 del nombre), es decir, se expulsa a aquella pgina cuyo penltimo acceso ha sido menos reciente. Esta estrategia hara que en el ejemplo planteado las pginas de los ficheros desaparecieran rpidamente de la memoria al no producirse un segundo acceso a las mismas. En los ltimos tiempos ha habido una proliferacin de algoritmos, tanto en el mbito de la gestin de memoria como en los de los sistemas de ficheros y las bases de datos, que han intentado conciliar estos criterios de frescura y frecuencia. La mayora de estos algoritmos son complejos e incluyen algunos parmetros de configuracin (tales como plazos de tiempo o tamaos) que son difciles de ajustar satisfactoriamente en un sistema de propsito general. En cualquier caso, parece que hay un acuerdo general sobre que uno de los mejores algoritmos es el ARC (Adaptive Replacement Cache), que tiene en cuenta la frescura y la frecuencia, no requiriendo fijar

Gestin de memoria

329

parmetros de configuracin. Aunque queda fuera del alcance de esta exposicin el estudio detallado del mismo, a continuacin se plantea un bosquejo de su modo de operacin: Usa dos listas LRU: una de frescura, L1, que incluye las pginas a las que se ha accedido slo una vez recientemente, y otra de frecuencia, L2, que incorpora aquellas pginas a las que se ha accedido al menos dos veces recientemente. Estas listas almacenan informacin histrica. No slo guardan el orden LRU de las N pginas residentes en memoria, sino tambin de otras N pginas adicionales, que corresponden a las ltimas N pginas expulsadas. Existe un parmetro de configuracin p, que se ajusta automticamente, y que determina qu tamao debe tener la lista L1. El algoritmo de reemplazo selecciona una pgina de la lista L1 slo si su tamao es mayor que p. En caso contrario, se elige una pgina de la lista L2. En ambos casos, la seleccin se realiza mediante LRU y la pgina expulsada pasa a formar parte del histrico de esa lista. El parmetro p se ajusta automticamente mediante el uso de la informacin histrica. Si se produce un fallo de pgina que corresponde a una pgina del histrico de la lista L1, se incrementa p, puesto que esto indica que el programa est entrando en una fase donde es ms importante la frescura (ntese que si p=N, se convierte directamente en el algoritmo LRU). En caso de que corresponda al histrico de L2, se disminuye el valor de p, dado que esto denota que el programa ha entrado en una fase donde la frecuencia toma mayor importancia. De forma anloga a lo que ocurre con el algoritmo LRU, la implementacin exacta del ARC en un sistema de memoria virtual requerira un hardware especfico muy complejo y, posiblemente, ineficiente. Por ello, se han planteado versiones aproximadas del mismo, que pueden implementarse sobre un hardware de gestin de memoria estndar. Entre ellas, se encuentra el algoritmo CAR (Clock with Adaptive Replacement), que, como su nombre indica, se basa en una extensin del algoritmo del reloj para que se ajuste a un comportamiento similar al algoritmo ARC. Buffering de pginas Se puede considerar que el algoritmo de reemplazo tambin se activa bajo demanda: en el momento que no queda ms memoria libre, hay que expulsar alguna pgina. Sin embargo, esperar a que se llegue a una situacin tan crtica de falta total de memoria no parece una buena estrategia, ms an, teniendo en cuenta que si se necesita reservar memoria dentro del contexto de una rutina de interrupcin, no se puede bloquear la ejecucin de la misma hasta que no se habilite memoria libre. Para incidir ms en la problemtica de llegar a ese momento extremo, imagine qu ocurrira si se necesitase reservar memoria durante la propia operacin de reemplazo para, por ejemplo, llevar a cabo la escritura en disco. Al no haber memoria libre, no podra completarse la misma, quedando el sistema en un interbloqueo. Teniendo en cuenta estas consideraciones, la mayora de los sistemas operativos mantienen una reserva mnima de marcos libres y realizan las operaciones de reemplazo de forma anticipada, fuera del contexto del tratamiento del fallo de pgina, sin esperar a que se llegue a la situacin crtica de agotamiento de la memoria. Esta estrategia suele denominarse buffering de pginas. Cuando se produce un fallo de pgina, se usa un marco de pgina libre, pero no se aplica el algoritmo de reemplazo. Esto es, se consume un marco de pgina, pero no se libera otro. Cuando el sistema operativo detecta que el nmero de marcos de pgina disminuye por debajo de un cierto umbral, aplica repetidamente el algoritmo de reemplazo hasta que el nmero de marcos libres llegue a otro umbral que corresponda a una situacin de estabilidad. Para realizar esta operacin, dado que se requiere un flujo de ejecucin independiente dentro del sistema operativo, habitualmente, se usa un proceso/thread de ncleo, que se suele denominar demonio de paginacin. Hay que resaltar que debido a la complejidad de la gestin de memoria, sta suele requerir la presencia de diversos procesos de ncleo (por ejemplo, procesos que escriben pginas modificadas a disco o procesos que rellenan de ceros marcos libres para tenerlos preparados para volver a utilizarlos). Segn el demonio de paginacin va aplicando repetidamente el algoritmo, las pginas liberadas que no estn modificadas pasan a una lista de marcos libres, estando listas para poder utilizarse de nuevo, mientras

330

Sistemas operativos. Una visin aplicada

que las pginas que han sido modificadas pasan a una lista de marcos modificados y debern actualizarse en memoria secundaria antes de poder volver a utilizarse. Las pginas que estn en cualquiera de las dos listas pueden recuperarse si se vuelve a acceder a las mismas antes de reutilizarse. En este caso, la rutina de fallo de pgina recupera la pgina directamente de la lista y actualiza la entrada correspondiente de la tabla de pginas para conectarla. Este fallo de pgina no implicara operaciones de entrada/salida. Las pginas en la lista de modificadas se pueden escribir en tandas al dispositivo para obtener un mejor rendimiento. Cuando la pgina modificada se ha escrito al dispositivo, se la incluye en la lista de marcos libres. Esta estrategia puede mejorar el rendimiento de algoritmos de reemplazo que no sean muy efectivos. As, si el algoritmo de reemplazo decide revocar una pgina que en realidad est siendo usada por un proceso, se producir inmediatamente un fallo de pgina que la recuperar de las listas. Este proceso de recuperacin de la pgina plantea un reto: cmo detectar de forma eficiente si la pgina requerida por un fallo de pgina est en una de estas listas? La solucin es la cach de pginas. Cach de pginas Con el uso de la tcnica de memoria virtual, la memoria principal se convierte, a todos los efectos, en una cach de la memoria secundaria. Por otra parte, en diversas circunstancias, el sistema operativo debe buscar si una determinada pgina est residente en memoria (esa necesidad se acaba de identificar dentro de la tcnica del buffering de pginas y volver a aparecer cuando se estudie el compartimiento de pginas). Por tanto, parece lgico que ese comportamiento de cach se implemente como tal, es decir, que se habilite una estructura de informacin, la cach de pginas, que permita gestionar las pginas de los procesos que estn residentes en memoria y pueda proporcionar una manera eficiente de buscar una determinada pgina. La organizacin de la cach se realiza de manera que se pueda buscar eficientemente una pgina dado un identificador nico de la misma. Generalmente, este identificador corresponde al nmero de bloque dentro del fichero (o dispositivo de swap) que contiene la pgina. Obsrvese que las pginas annimas que todava no estn vinculadas con el swap no estn incluidas en la cach de pginas. Cada vez que dentro de la rutina del tratamiento del fallo de pgina se copia una pgina de un bloque de un fichero o de un dispositivo de swap a un marco, se incluir en la cach asocindola con dicho bloque. Hay que resaltar que las pginas de la cach estn incluidas, adems, en otras listas, tales como las gestionadas por el algoritmo de reemplazo o la de marcos libres y modificados. En el sistema de ficheros, como se analizar en el captulo dedicado al mismo, existe tambin una cach de similares caractersticas, que se suele denominar cach de bloques. Aunque el estudio de la misma se realiza en dicho captulo, se puede anticipar que, en los sistemas operativos actuales, la tendencia es fusionar ambas cachs para evitar los problemas de coherencia y de mal aprovechamiento de la memoria, debido a la duplicidad de la informacin en las cachs. Retencin de pginas en memoria Para acabar esta seccin en la que se han presentado diversos algoritmos de reemplazo, hay que resaltar que no todas las pginas residentes en memoria son candidatas al reemplazo. Se puede considerar que algunas pginas estn atornilladas a la memoria principal. En primer lugar, estn las pginas del propio sistema operativo. La mayora de los sistemas operativos tienen su mapa de memoria fijo en memoria principal. El diseo de un sistema operativo en el que las pginas de su propio mapa pudieran expulsarse a memoria secundaria resultara complejo y, posiblemente, ineficiente. Tenga en cuenta, adems, que el cdigo de la rutina de tratamiento del fallo de pgina, as como los datos y otras partes de cdigo usados desde la misma, deben siempre estar residentes para evitar el interbloqueo. Lo que s proporcionan algunos sistemas operativos es la posibilidad de que un componente del propio sistema operativo reserve una zona de memoria que pueda ser expulsada, lo que le permite usar grandes cantidades de datos sin afectar directamente a la cantidad de memoria disponible en el sistema. Adems, si se permite que los dispositivos de entrada/salida que usan DMA realicen transferencias directas a la memoria de un proceso, ser necesario marcar las pginas implicadas como no reemplazables hasta que termine la operacin.

Gestin de memoria

331

Por ltimo, algunos sistemas operativos ofrecen servicios a las aplicaciones que les permiten solicitar que una o ms pginas de su mapa queden retenidas en memoria (en UNIX existe el servicio mlock para este fin). Este servicio puede ser til para procesos de tiempo real que necesitan evitar que se produzcan fallos de pgina imprevistos. Sin embargo, el uso indiscriminado de este servicio puede afectar gravemente al rendimiento del sistema.

5.5.9. Poltica de reparto de espacio entre los procesos


En un sistema con multiprogramacin existen varios procesos activos simultneamente que comparten la memoria del sistema. Es necesario, por tanto, determinar cuntos marcos de pgina se asignan a cada proceso. Existen dos tipos de estrategias de asignacin: asignacin fija o asignacin dinmica. Asignacin fija Con esta estrategia, se asigna a cada proceso un nmero fijo de marcos de pgina. Normalmente, este tipo de asignacin lleva asociada una estrategia de reemplazo local. El nmero de marcos asignados no vara, ya que un proceso slo usa para reemplazo los marcos que tiene asignados. La principal desventaja de esta alternativa es que no se adapta a las diferentes necesidades de memoria de un proceso a lo largo de su ejecucin. Habr fases en la que el espacio asignado se le quedar pequeo, no permitiendo almacenar simultneamente todas las pginas que est utilizando el proceso en ese intervalo de tiempo. En contraste, existirn fases en las que el proceso no usar realmente los marcos que tiene asignados. Una propiedad positiva de esta estrategia es que el comportamiento del proceso es relativamente predecible, puesto que siempre que se ejecute con los mismos parmetros va a provocar los mismos fallos de pgina. Existen diferentes criterios para repartir los marcos de las pginas entre los procesos existentes. Puede depender de mltiples factores tales como el tamao del proceso o su prioridad. Por otra parte, cuando se usa una estrategia de asignacin fija, el sistema operativo decide cul es el nmero mximo de marcos asignados al proceso. Sin embargo, la arquitectura de la mquina establece el nmero mnimo de marcos que deben asignarse a un proceso. Por ejemplo, si la ejecucin de una nica instruccin puede generar cuatro fallos de pgina y el sistema operativo asigna tres marcos de pgina a un proceso que incluya esta instruccin, el proceso podra no terminar de ejecutarla. Por tanto, el nmero mnimo de marcos de pgina para una arquitectura quedar fijado por la instruccin que pueda generar el mximo nmero de fallos de pgina. Asignacin dinmica Usando esta estrategia, el nmero de marcos asignados a un proceso vara segn las necesidades que tenga el mismo (y posiblemente el resto de procesos del sistema) en diferentes instantes de tiempo. Con este tipo de asignacin se pueden usar estrategias de reemplazo locales y globales. Con reemplazo local, el proceso va aumentando o disminuyendo su conjunto residente dependiendo de sus necesidades en las distintas fases de ejecucin del programa. Con reemplazo global, los procesos compiten en el uso de memoria quitndose entre s las pginas. La estrategia de reemplazo global hace que el comportamiento del proceso en tiempo de ejecucin no sea predecible. El principal problema de este tipo asignacin es que la tasa de fallos de pgina de un programa puede depender de las caractersticas de los otros procesos que estn activos en el sistema. Hiperpaginacin Si el nmero de marcos de pgina asignados a un proceso no es suficiente para almacenar las pginas a las que hace referencia frecuentemente, se producir un nmero elevado de fallos de pgina. Esta situacin se denomina hiperpaginacin (thrashing). Cuando se produce la hiperpaginacin, el proceso pasa ms tiempo en la cola de servicio del dispositivo de swap que en ejecucin. Dependiendo del tipo de asignacin usado, este problema puede afectar a procesos individuales o a todo el sistema.

332

Sistemas operativos. Una visin aplicada

Utilizacin de la UCP

Grado de multiprogramacin

Figura 5.73 Hiperpaginacin. En un sistema operativo que utiliza una estrategia de asignacin fija, si el nmero de marcos asignados al proceso no es suficiente para albergar su conjunto de trabajo en una determinada fase de su ejecucin, se producir hiperpaginacin en ese proceso, lo que causar un aumento considerable de su tiempo de ejecucin. Sin embargo, el resto de los procesos del sistema no se vern afectados directamente. Con una estrategia de asignacin dinmica, el nmero de marcos asignados a un proceso se va adaptando a sus necesidades, por lo que, en principio, no debera presentarse este problema. No obstante, si el nmero de marcos de pgina en el sistema no es suficiente para almacenar los conjuntos de trabajo de todos los procesos, se producirn fallos de pgina frecuentes y, por tanto, el sistema sufrir hiperpaginacin. La utilizacin del procesador disminuir, puesto que el tiempo que dedica al tratamiento de los fallos de pgina aumenta. Como se puede observar en la figura 5.73, no se trata de una disminucin progresiva, sino drstica, que se debe a que al aumentar el nmero de procesos, por un lado, crece la tasa de fallos de pgina de cada proceso (hay menos marcos de pgina por proceso) y, por otro lado, aumenta el tiempo de servicio del dispositivo de paginacin (crece la longitud de la cola de servicio del dispositivo). Cuando se produce esta situacin se deben suspender uno o varios procesos liberando sus pginas. Es necesario establecer una estrategia de control de carga que ajuste el grado de multiprogramacin en el sistema para evitar que se produzca hiperpaginacin. Este mecanismo de suspensin tiene similitudes con la tcnica del intercambio y, como en dicha tcnica, habr que establecer algn tipo de criterio para decidir qu procesos se deberan suspender (criterios tales como si el proceso est bloqueado, su prioridad, el nmero de pginas residentes, el tamao de su mapa de memoria o el tiempo que lleva ejecutando). La reactivacin de los procesos seleccionados slo se realizar cuando haya suficientes marcos de pgina libres. La estrategia que decide cundo suspender un proceso y cundo reactivarlo se corresponde con la planificacin a medio plazo presentada en el captulo 4. A continuacin, se plantean algunas polticas de control de carga. Estrategia del conjunto de trabajo Como se coment previamente, cuando un proceso tiene residente en memoria su conjunto de trabajo, se produce una baja tasa de fallos de pgina. Una posible estrategia consiste en determinar los conjuntos de trabajo de todos los procesos activos para intentar mantenerlos residentes en memoria principal. Para poder determinar el conjunto de trabajo de un proceso es necesario dar una definicin ms formal de este trmino. El conjunto de trabajo de un proceso es el conjunto de pginas a las que ha accedido un proceso en las ltimas n referencias. El nmero n se denomina la ventana del conjunto de trabajo. El valor de n es un factor crtico para el funcionamiento efectivo de esta estrategia. Si es demasiado grande, la ventana podra englobar varias fases de ejecucin del proceso, llevando a una estimacin excesiva de las necesidades del proceso. Si es demasiado pequeo, la ventana podra no englobar la situacin actual del proceso, con lo que se generaran demasiados fallos de pgina. Suponiendo que el sistema operativo es capaz de detectar cul es el conjunto de trabajo de cada proceso, se puede especificar una estrategia de asignacin dinmica con reemplazo local y control de carga.

Gestin de memoria

333

tasa de fallos de pgina

lmite superior

lmite inferior

nmero de marcos

Figura 5.74 Estrategia de administracin basada en la frecuencia de fallos de pgina. Si el conjunto de trabajo de un proceso decrece, se liberan los marcos asociados a las pginas que ya no estn en el conjunto de trabajo. Si el conjunto de trabajo de un proceso crece, se asignan marcos para que puedan contener las nuevas pginas que han entrado a formar parte del conjunto de trabajo. Si no hay marcos libres, hay que realizar un control de carga, suspendiendo uno o ms procesos y liberando sus pginas. El problema de esta estrategia es cmo poder detectar cul es el conjunto de trabajo de cada proceso. Al igual que ocurre con el algoritmo LRU, se necesitara una MMU especfica que fuera controlando las pginas a las que ha ido accediendo cada proceso durante las ltimas n referencias. Estrategia de administracin basada en la frecuencia de fallos de pgina Esta estrategia busca una solucin ms directa al problema de la hiperpaginacin. Se basa en controlar la frecuencia de fallos de pgina de cada proceso. Como se ve en la figura 5.74, se establecen una cuota superior y otra inferior de la frecuencia de fallos de pgina de un proceso. Basndose en esa idea, a continuacin se describe una estrategia de asignacin dinmica con reemplazo local y control de carga. Si la frecuencia de fallos de un proceso supera el lmite superior, se asignan marcos de pgina adicionales al proceso. Si la tasa de fallos crece por encima del lmite y no hay marcos libres, se suspende algn proceso liberando sus pginas. Cuando el valor de la tasa de fallos es menor que el lmite inferior, se liberan marcos asignados al proceso seleccionndolos mediante un algoritmo de reemplazo. Estrategia de control de carga para algoritmos de reemplazo globales Los algoritmos de reemplazo globales no controlan la hiperpaginacin. Incluso aunque se pudiera utilizar el algoritmo ptimo, el problema persistira, puesto que dicho algoritmo seleccionara la pgina menos til, pero, en estas circunstancias, esa pgina tambin es til. Necesitan trabajar conjuntamente con un algoritmo de control de carga. Normalmente, se usan soluciones de carcter emprico, que detectan sntomas de que el sistema est evolucionando hacia la hiperpaginacin. As, si la tasa de paginacin en el sistema es demasiado alta y el nmero de marcos libres est frecuentemente por debajo del umbral mnimo, se considera que el sistema est en estado de hiperpaginacin y se suspende uno o ms procesos.

5.5.10. Gestin del espacio de swap


Un dispositivo de swap se implementa sobre una unidad de disco o una particin de la misma. Normalmente, los sistemas operativos ofrecen la posibilidad de utilizar mltiples dispositivos de swap, permitiendo, incluso, aadir dispositivos de swap dinmicamente, e incluso usar ficheros como soporte del swap. Sin embargo, hay

334

Sistemas operativos. Una visin aplicada

que tener en cuenta que el acceso a los ficheros es ms lento que el acceso directo a los dispositivos. En cualquier caso, esta posibilidad es interesante, ya que alivia al administrador de la responsabilidad de configurar correctamente a priori el dispositivo de swap, puesto que si hay necesidad, se puede aadir ms espacio de swap en tiempo de ejecucin. Habitualmente, tambin es posible que el administrador defina el modo de uso de los dispositivos de swap, pudiendo establecer polticas tales como no usar un dispositivo hasta que los otros estn llenos, o repartir cclicamente las pginas expulsadas entre los dispositivos de swap existentes. La estructura interna de un dispositivo de swap es muy sencilla: una cabecera y un conjunto de bloques. La cabecera incluye algn tipo de informacin de control, como, por ejemplo, si hay sectores de disco errneos dentro de la misma. No es necesario que incluya informacin del estado de los bloques, puesto que el dispositivo de swap slo se usa mientras el sistema est arrancado. Por tanto, no hay que mantener ninguna informacin cuando el sistema se apaga. El sistema operativo usa un mapa de bits en memoria para conocer si est libre u ocupado cada bloque del swap. El sistema operativo debe gestionar el espacio de swap reservando y liberando zonas del mismo segn evolucione el sistema. Existen bsicamente dos alternativas a la hora de asignar espacio de swap durante la creacin de una nueva regin: Con preasignacin de swap. Cuando se crea una regin privada o sin soporte, se reserva espacio de swap para la misma. Con esta estrategia, cuando se expulsa una pgina ya tiene reservado espacio en swap para almacenar su contenido. En algunos sistemas, ms que realizar una reserva explcita de bloques de swap, se lleva una cuenta de cuntos hay disponibles, de manera que al crear una regin que requiera el uso del swap, se descuenta la cantidad correspondiente al tamao de la misma del total de espacio de swap disponible. Sin preasignacin de swap. Cuando se crea una regin, no se hace ninguna reserva en el swap. Slo se reserva espacio en el swap para una pgina cuando es expulsada por primera vez. La primera estrategia conlleva un peor aprovechamiento de la memoria secundaria, puesto que toda pgina debe tener reservado espacio en ella. Sin embargo, la preasignacin presenta la ventaja de que con ella se detecta anticipadamente si no queda espacio en swap. Si al crear un proceso no hay espacio en swap, ste no se crea. Con un esquema sin preasignacin, esta situacin se detecta cuando se va a expulsar una pgina y no hay sitio para ella. En ese momento habra que abortar el proceso aunque ya hubiera realizado parte de su labor. Como se explic en la seccin 5.5.4, slo las pginas de las regiones privadas o sin soporte usan el swap para almacenarse cuando son expulsadas estando modificadas. En el caso de una pgina de una regin compartida con soporte en un fichero, no se usa espacio de swap para almacenarla, sino que se utiliza directamente el fichero que la contiene como almacenamiento secundario. Dado que puede haber mltiples entradas de tablas de pginas que hacen referencia al mismo bloque de swap, el sistema operativo gestionar un contador de referencias por cada bloque de swap, de manera que cuando el mismo valga cero, el bloque estar libre.

5.5.11. Compartimiento de pginas


Como se ha comentado a lo largo del captulo, los procesos comparten regiones en diversas circunstancias: Cuando usan explcitamente una zona de memoria compartida. Cuando utilizan el mismo programa o biblioteca dinmica, comparten implcitamente su cdigo, optimizndose de esta forma el uso de recursos en el sistema. Cuando proyectan un mismo fichero. En UNIX, cuando un proceso crea un hijo mediante el servicio fork, el proceso hijo comparte con el padre aquellas regiones de tipo compartido que tenga ste. El compartimiento de las regiones implica, evidentemente, compartir las pginas de la regin. Como se analiz en la seccin dedicada a la paginacin, para ello, basta con que las entradas correspondientes de las tablas de pginas de los procesos involucrados hagan referencia al mismo marco. En la tabla de marcos, se

Gestin de memoria

335

almacenar un contador de referencias que indicar cuntas entradas de tablas de pginas hacen referencia a ese marco, de manera que cuando el mismo valga cero, el marco estar libre. En principio, dado que la memoria virtual se basa en la paginacin, la tcnica de compartimiento ser la misma. Sin embargo, aparecen dos dificultades aadidas: Cuando la pgina compartida no est residente en memoria y uno de los procesos accede a la misma provocando un fallo que la trae a memoria, si otro proceso quiere acceder a la pgina, deber usar la copia presente en memoria. La pregunta es cmo descubre ese proceso que la pgina est residente en memoria. La respuesta es consultando la cach de pginas dentro la rutina de tratamiento del fallo de pgina. Al encontrar la pgina en la cach, no es preciso leerla de memoria secundaria y slo hay que hacer que la entrada de la tabla de pginas haga referencia al marco que la contiene. Si el algoritmo de reemplazo decide expulsar una pgina compartida, habr que invalidar todas las referencias a ese marco en todas las entradas de las tablas de pginas que la comparten. Esto requiere guardar informacin que permita realizar la traduccin inversa a la que se usa normalmente: dado un marco, se requiere conocer qu entradas hacen referencia al mismo. La gestin de esta informacin puede causar una sobrecarga apreciable en tiempo y espacio, por lo que algunos sistemas operativos no la proporcionan y slo pueden expulsar pginas no compartidas. En Linux se utiliza una tcnica denominada rmap para gestionar la informacin necesaria para la traduccin inversa, pero intentando minimizar esta sobrecarga. Adems del compartimiento propiamente dicho, existe otro tipo de situaciones en las que se comparte informacin, aunque sea inicialmente. Se trata de situaciones en las que dos o ms procesos usan una regin cuyo contenido inicial es el mismo, pero tal que cada uno debe trabajar de forma independiente, de manera que las modificaciones que realice un proceso no sean visibles por el resto. Este modo de trabajo corresponde con la operacin duplicar_regin, y puede requerirse en distintas circunstancias: Cuando utilizan el mismo programa o biblioteca dinmica, inicialmente, los procesos comparten de forma implcita su regin de datos con valor inicial. En UNIX, cuando un proceso crea un hijo mediante el servicio fork, inicialmente, el proceso hijo comparte con el padre aquellas regiones de tipo privado que tenga ste. Cuando dos o ms procesos proyectan un mismo fichero, pero en modo privado. De la misma manera que la paginacin por demanda retarda la carga de una pgina desde la memoria secundaria hasta que realmente se accede a la misma, se puede plantear realizar un duplicado por demanda, es decir, diferir la copia de cada pgina de la regin hasta que el proceso la intente modificar. Esta tcnica se denomina copy-on-write (COW). Con esta tcnica, en vez de copiar la regin original, se comparte, pero marcndola de tipo COW. Mientras los procesos que usan esta regin slo la lean pueden seguir compartindola. Pero cuando un proceso intenta modificar una pgina de esta regin, el sistema operativo se encarga de crear una copia privada de la pgina para ese proceso. Habitualmente, para forzar la activacin del sistema operativo, se modifica la proteccin de la pgina en la entrada correspondiente para que sea slo de lectura, producindose una excepcin de fallo de proteccin, en cuyo tratamiento se realiza la copia. No obstante, en la tabla de regiones se sigue manteniendo la proteccin real de la regin. Tratamiento de la excepcin de COW Las dos excepciones que regulan el comportamiento del sistema de memoria virtual son la del fallo de pgina, que permite implementar la paginacin por demanda y que ya se ha estudiado anteriormente, y la del fallo de proteccin, que permite implementar la tcnica del COW. A continuacin, se especifican los pasos habituales en el tratamiento de un fallo de proteccin: La MMU produce una excepcin, dejando, habitualmente, en un registro especial la direccin que provoc el fallo.

336

Sistemas operativos. Una visin aplicada

Se activa el sistema operativo que busca en la tabla de regiones a qu regin pertenece la direccin que produjo el fallo, verificando si realmente se trata de un fallo de tipo COW. Para ello, comprueba la proteccin de la regin. Si no tiene permiso de escritura, se trata de un acceso invlido, por lo que se aborta el proceso o se le enva una seal. En caso contrario, se realizan los pasos que se describen a continuacin. Si el contador de referencias del marco es mayor que 1 (varios procesos todava comparten la pgina), se realizan las siguientes acciones: Se reserva un marco libre (gracias al buffering de pginas siempre lo habr). Se copia el contenido de la pgina. Se asocia la entrada de la tabla de pginas con este nuevo marco y se le devuelve el permiso de escritura. Se resta una unidad al contador de referencias del marco. La nueva pgina no se incluye en la cach de pginas, puesto que, por el momento, no est vinculada con ningn soporte. Si el contador de referencias del marco ya es igual a 1 (es el nico proceso asociado a ese marco), slo hay que devolver los permisos a la pgina, que quedar asignada nicamente a este proceso. Asimismo, hay que eliminar la pgina de la cach de pginas, rompiendo con ello su vinculacin con el soporte actual de la misma (no queremos que un fallo de pgina de otro proceso que comparta esta pgina la encuentre en la cach de pginas y la utilice, puesto que se trata de una nueva copia). Si la pgina ya tena un bloque de swap asignado, hay que romper tambin esta asociacin, restando una unidad al contador de referencias del bloque de swap, puesto que ya no est asociado a la pgina asignada al proceso como resultado del COW. Cuando se expulse la pgina, se le asignar un nuevo bloque de swap.

5.5.12. Gestin de la memoria del sistema operativo


En esta seccin se analiza cmo se lleva a cabo la gestin de memoria desde el punto de vista del sistema operativo, mostrando cmo gestiona la memoria fsica, as como su mapa de memoria lgico. Asimismo, se revisarn los distintos esquemas de asignacin de espacio proporcionados por el sistema operativo. Gestin de la memoria fsica En su fase de iniciacin, el sistema operativo recibe informacin (normalmente, invocando alguna rutina del firmware) sobre las caractersticas de la memoria fsica disponible. A priori, puede parecer que es suficiente con que sepa cunta memoria existe. Sin embargo, las cosas son bastante ms complejas y necesita conocer mucha ms informacin, puesto que la memoria fsica no es algo uniforme o contiguo. Puede haber huecos en el espacio de direcciones de la memoria y zonas de memoria ROM. Adems, puede haber restricciones en el uso de ciertas partes de la memoria. Por ejemplo, en algunos sistemas, por limitaciones del hardware, slo se puede hacer DMA sobre determinadas zonas de la memoria, de lo cual debe ser consciente el sistema operativo a la hora de asignar espacio (en Linux, se utiliza el concepto de zona para gestionar este tipo de restricciones). Asimismo, si se trata de un sistema multiprocesador NUMA, ser necesario que el sistema operativo conozca la topologa del sistema, de manera que cuando un proceso necesite memoria, se le pueda asignar de la parte asociada al procesador donde est ejecutando (en Linux, se usa el concepto de nodo para implementar esta caracterstica). Una vez que el sistema operativo averigua las caractersticas de la memoria disponible en el sistema, crea una tabla de marcos del tamao adecuado e inicia las entradas de la misma, de manera que los marcos donde est ubicado el sistema operativo se ponen como ocupados y los restantes como libres. Gestin del mapa de memoria del sistema operativo El sistema operativo posee su propio mapa de memoria definido por la tabla de pginas del sistema. En el arranque del sistema, el hardware de gestin de memoria estar desactivado. En su fase de iniciacin, el sis-

Gestin de memoria

337

tema operativo construir su tabla de pginas y activar el hardware de gestin de memoria. Normalmente, en el proceso de arranque del computador, se carga el sistema operativo en una zona contigua de la memoria fsica. Por tanto, se iniciarn las primeras entradas de la tabla de pginas del sistema de manera que hagan referencia a esos marcos contiguos que ocupa inicialmente el sistema operativo, creando un espacio lgico para el mismo. Gracias a esa contigidad, se pueden usar superpginas para dar cobertura al espacio ocupado por el sistema operativo, lo que minimiza el nmero de entradas requeridas. Las entradas restantes de la tabla de pginas del sistema se quedarn sin usar (marcadas como invlidas). Una vez terminada la fase de iniciacin, todos los marcos libres disponibles quedan a disposicin de los procesos y de las necesidades internas del propio sistema operativo (cachs, memoria dinmica, etc.). Cuando el sistema operativo quiera usar un marco de pgina libre, deber crear una asociacin al mismo, iniciando una entrada de la tabla de pginas del sistema que est sin usar, de forma que haga referencia a ese marco. Si se trata de una pgina para un proceso, se producir una asociacin temporal mientras el sistema operativo carga el contenido de la pgina, que desaparecer cuando la pgina se asigne al proceso incluyndola en su tabla de pginas. En caso de que la pgina sea para el propio sistema operativo (por ejemplo, para reservar dinmicamente espacio para un nuevo BCP), se establecer una asociacin que se mantendr hasta que se libere explcitamente ese espacio reservado. Hay que resaltar que cualquier modificacin en una entrada de la tabla de pginas del sistema conlleva una cierta sobrecarga, puesto que, como se ver en la prxima seccin, requiere operaciones sobre la TLB (adems, en el caso de que el procesador no use tablas de usuario y sistema independientes, habra una sobrecarga debida a la propagacin del cambio a todas las copias de la tabla de pginas del sistema). Algunos sistemas operativos usan una solucin alternativa: incluyen toda la memoria fsica en el espacio del sistema. En vez de crear un mapa inicial del sistema que incluya slo las regiones del sistema operativo y usar asociaciones para acceder al resto de la memoria, como se acaba de explicar, establecen un mapa del sistema que cubre toda la memoria fsica: la primera pgina del mapa del sistema operativo se hace corresponder con el primer marco, la segunda con el segundo, y as sucesivamente. Esta solucin, usada en Linux, permite que el sistema operativo manipule directamente toda la memoria fsica, sin necesidad de realizar asociaciones. Esta solucin elimina la sobrecarga asociada a los cambios en la tabla de pginas del sistema y permite usar superpginas para representar toda la memoria fsica. En este tipo de sistemas es inmediato el clculo de a qu direccin fsica corresponde una direccin lgica del sistema: basta con restar el valor de la primera direccin lgica del sistema (en una configuracin con 3GB de usuario y 1GB de sistema, la primera direccin lgica de sistema es C0000000, que es el valor que hay que restar a una direccin lgica de sistema para obtener la direccin fsica que representa). Las entradas restantes de la tabla de pginas del sistema se usan para poder asignar espacio lgico contiguo usando espacio fsico que no lo es. Esta solucin tiene la limitacin de que slo se puede manejar tanta memoria fsica como tamao tenga el espacio lgico del sistema (si hay un espacio lgico de 1GB, slo se puede gestionar directamente esa cantidad de memoria fsica, que es claramente insuficiente actualmente). Por ello, en este tipo de sistemas suele ser habitual una mezcla de las dos tcnicas, es decir, establecer un mapa de sistema que cubra toda la memoria fsica posible, dejando una cantidad suficiente de entradas de la tabla de pginas de sistema sin usar para manejar el resto de la memoria (denominada en Linux high memory) mediante asociaciones. Esquemas de asignacin de espacio Antes de presentar los diversos tipos esquemas de asignacin de memoria que proporciona habitualmente el sistema operativo para su uso interno, es conveniente comparar dos soluciones a la hora de satisfacer una solicitud de memoria de algn componente del sistema operativo que necesita una zona contigua que ocupe varias pginas: Una alternativa es reservar un conjunto de marcos cualesquiera, aunque no sean contiguos, y crear entradas en la tabla de pginas del sistema para que aparezcan como contiguos en el espacio lgico. La otra opcin es reservar un conjunto contiguo de marcos. Esta puede ser la nica opcin posible si el espacio se necesita para realizar una operacin de DMA sobre el mismo. Adems, en caso de usar un sistema que incluya la memoria fsica dentro del mapa del sistema, como Linux, la operacin es ms eficiente, ya que no requiere manipular la tabla de pginas para establecer asociaciones.

338

Sistemas operativos. Una visin aplicada

Habitualmente, el sistema operativo ofrece distintos tipos de gestores de memoria internos, que intentan adaptarse a las diversas necesidades del propio sistema operativo y de los procesos. En ocasiones, el sistema operativo necesita reservar una o ms pginas contiguas en memoria en el espacio fsico. Un manejador de un dispositivo puede necesitar reservar un buffer de varias pginas como almacenamiento intermedio de datos del dispositivo. Otro ejemplo aparece en el tratamiento de un fallo de pgina, donde el sistema operativo necesita reservar una pgina para el proceso. Linux utiliza un sistema buddy binario para gestionar los marcos libres, con tamaos que van desde 1 pgina hasta 1024 pginas, y ofrece un conjunto de operaciones para reservar marcos de pgina, con funciones tales como get_free_pages. El cdigo del sistema operativo puede necesitar reservar memoria dinmica igual que cualquier aplicacin. De hecho, para que no quepa duda de la similitud, en Linux la funcin interna se llama kmalloc. En Linux, este componente de reserva dinmica se construye directamente sobre el sistema de asignacin de pginas explicado en el punto anterior, y usa un esquema de mltiples listas con particiones estticas cuyos tamaos son potencias de 2, desde 32 bytes hasta 128KB. Este subsistema funciona como una cach. Cuando se realiza una peticin y no hay espacio libre asociado a este subsistema, se solicitan pginas al sistema de asignacin de pginas. Sin embargo, cuando se libera, no se devuelve al sistema de asignacin de pginas. El cdigo del sistema operativo requiere frecuentemente reservar y liberar objetos del mismo tipo (por ejemplo, espacio para un BCP). Para agilizar esta labor, el sistema operativo permite crear cachs especficas para cada tipo de objeto. De esta forma, para crear un nuevo BCP se puede usar directamente uno disponible en la cach, eliminando la necesidad de la reserva. En Linux se usa el gestor de slabs para este fin, construyndose tambin sobre el sistema de asignacin de pginas. Por ltimo, como ya se coment antes, se ofrecen funciones para reservar memoria contigua en el espacio lgico, aunque no contigua en el fsico. En Linux, se usa la funcin vmalloc para tal fin. En algunos sistemas operativos toda la memoria del sistema est residente en memoria fsica. Sin embargo, otros sistemas operativos, como Windows, permiten reservar memoria que puede ser expulsada (memoria que puede ser paginada al disco). Esta opcin puede ser interesante para un mdulo del sistema operativo que requiera usar una gran cantidad de memoria, pero no de forma simultnea. Tngase en cuenta que, a excepcin de esta modalidad de reserva de memoria que puede ser paginada, en todos los dems casos cada byte de memoria que utiliza cualquier componente del sistema operativo es un byte que deja de estar disponible para los procesos Como se ha podido apreciar en este apartado, el sistema operativo utiliza numerosas cachs (por ejemplo, en Linux las correspondientes a los slabs y a las listas de particiones estticas del kmalloc). Estas cachs van creciendo y, en principio, nunca reducen su tamao por iniciativa propia. Por tanto, cuando el demonio de paginacin se activa para liberar marcos de pgina, deber considerar por un lado las pginas de usuario, aplicando el algoritmo de reemplazo correspondiente, y, por otro lado, el espacio libre de las diversas cachs. Buscar un equilibrio en el uso de la memoria por parte de estas dos entidades es un asunto complejo, que requiere ajustes de carcter emprico. Un ltimo aspecto a tener en cuenta es que en sistemas multiprocesadores hay que intentar minimizar la congestin en la reserva de memoria reduciendo dentro de lo posible el uso de los cerrojos que se requieren para la manipulacin de las estructuras de datos que reflejan el estado de la memoria. Por ello, suele ser habitual que las diversas cachs presentes en el sistema tengan una prerreserva de elementos para cada procesador. Mientras haya elementos en la prerreserva de un procesador, se pueden usar en ese procesador sin necesidad de utilizar el cerrojo. En el caso de Linux, hay una prerreserva de marcos de pgina libre por procesador y una para los slabs.

5.5.13. Coherencia de la jerarqua de memoria


La jerarqua de memoria es un sistema complejo formado por mltiples niveles y componentes, donde se presentan numerosos problemas de coherencia, ms an en el caso de un sistema multiprocesador. Depen-

Gestin de memoria

339

diendo del tipo de problema y de las caractersticas especficas del hardware del sistema, el componente encargado de mantener la coherencia puede ser distinto. En algunos casos, ser el propio hardware el que resuelva el problema, pero, en otros, tendr que ser el sistema operativo. El objetivo de esta seccin es tratar todos estos problemas de una manera integrada, a pesar de su enorme variedad. Para ello, se presenta un modelo general original que permite identificar aquellos aspectos de la jerarqua de memoria que influyen en el mantenimiento de la coherencia en un sistema de estas caractersticas. De acuerdo con este modelo, cada nivel en una jerarqua se caracteriza por los siguientes aspectos: La funcin de traduccin requerida para, dado un identificador nico del objeto que se pretende acceder, encontrar en qu bloque de ese nivel est almacenada, en caso de que est presente en el mismo. La necesidad, por motivos de eficiencia, de, a su vez, una jerarqua de niveles en el propio esquema de traduccin de un nivel. Este es el caso del mecanismo de traduccin del nivel de memoria principal, que requiere el uso de dos niveles de traduccin: la TLB y la tabla de pginas. La existencia de mltiples componentes de memoria en ese nivel. En un sistema multiprocesador, en el nivel de cach hay mltiples componentes: una cach por cada procesador. Tambin en un sistema uniprocesador pueden existir mltiples componentes en un nivel. As, en el nivel de cach puede haber una cach de instrucciones y una de datos, cuyos contenidos no son totalmente disjuntos, ya que a las instrucciones tambin se accede como datos cuando se carga un programa en memoria. Las entidades que pueden acceder a ese nivel. A algunos niveles de la jerarqua, adems de los procesos, tambin pueden acceder dispositivos de entrada/salida mediante DMA, tal como se estudiar en el captulo 8. El tipo de multiplexacin que se realiza para que un componente pueda almacenar informacin de varios procesos. Como se vio al principio del captulo, puede usarse una multiplexacin temporal o espacial. En cuanto a la funcin de traduccin de un nivel, debera recibir un identificador nico del objeto que se pretende acceder. Retomando la notacin de la seccin 5.2.5 y el proceso de transformacin de direcciones, en un sistema de memoria virtual, no se puede usar la direccin fsica como identificador nico de un objeto, puesto que puede variar a lo largo de la ejecucin del programa. Bsicamente, se presentan dos opciones dependiendo de si se trata de un sistema con un espacio lgico por proceso o global. En el primer caso, el identificador estara formado por una direccin lgica en el contexto de un proceso ([P, Dp]), mientras que en el segundo correspondera con una direccin lgica en un espacio global ([Dg]). A continuacin, se aplica este modelo a los niveles habituales de la jerarqua, de manera ascendente, obviando el nivel de registros para no alargar innecesariamente la exposicin. Ese nivel de registros lo gestiona directamente el sistema de compilacin y no incumbe al sistema operativo, pero, en cualquier caso, se le puede aplicar perfectamente el modelo. Nivel de memoria secundaria Tanto si es un sistema con un espacio lgico por proceso como si es global, la traduccin de la direccin lgica al bloque de memoria secundaria que la contiene se llevara a cabo usando las tablas del esquema de memoria virtual (tablas de pginas y de regiones). Dado que slo se requiere localizar el bloque en memoria secundaria cuando no est en la principal, no es necesario que este proceso de localizacin sea especialmente eficiente, no requiriendo, por tanto, una jerarqua de traduccin. Se trata de un nivel formado por un nico componente, que realiza una multiplexacin espacial para repartir el espacio entre los procesos. Nivel de memoria principal Se corresponde tambin con un nivel formado por un nico componente, que lleva a cabo una multiplexacin espacial para repartir el espacio entre los procesos (aunque tambin temporal puesto que a un marco se le asignan distintas pginas a lo largo del tiempo). La traduccin en este nivel la realiza la tabla de pginas, que permite encontrar el marco de pgina que contiene el dato requerido. Dado que esta traduccin debe ser extremadamente eficiente, como se explic previamente, se usa la TLB.

340

Sistemas operativos. Una visin aplicada

Existe, por tanto, a su vez, una jerarqua de traduccin, a cuyos niveles se accede con el mismo identificador, pero para buscar la localizacin del dato en vez del dato propiamente dicho. Existen, habitualmente, dos niveles: las tablas de pginas y la TLB. Como se coment previamente, la TLB puede incluir informacin de proceso, en cuyo caso realiza una multiplexacin espacial del espacio dedicado a almacenar informacin de traducciones, o no incluirla, realizando una multiplexacin temporal (es decir, no podr existir informacin de varios procesos simultneamente). En el caso de un multiprocesador, el nivel de TLB presenta mltiples componentes: una TLB por procesador. Adems del procesador, a este nivel tambin acceden los dispositivos de E/S basados en DMA. En la mayora de los sistemas, los dispositivos realizan operaciones de DMA usando direcciones fsicas. Nivel de cach Para simplificar, slo se considera un nivel de cach, pero se puede extrapolar a cualquier nmero de niveles. Se trata de un nivel que est formado por mltiples componentes. En el caso de un sistema multiprocesador, hay una cach por procesador. Incluso en un sistema monoprocesador puede haber mltiples componentes en el mismo nivel si se usa un procesador con cach de datos e instrucciones separadas (tenga en cuenta que no se trata de cachs disjuntas, puesto que una instruccin tambin es un dato cuando se est cargando en memoria). No requiere una jerarqua de traduccin puesto que la informacin requerida para la traduccin se maneja eficientemente al estar incluida en la propia lgica de control de la cach. En cuanto a la funcin de traduccin planteada por el modelo, hay dos alternativas que establecen dos arquitecturas diferentes en el diseo de la cach: Cach virtual. A este tipo de cach se accede con una direccin lgica, ya sea en el contexto de un proceso ([P, Dp]) o en un espacio global ([Dg]). El acceso a esta cach se realiza en paralelo con el de la memoria principal (con el acceso a la TLB, que comprueba aspectos como los permisos de acceso). La cach puede incluir informacin de proceso o no (multiplexacin espacial o temporal, respectivamente). Cach fsica. A este tipo de cach se accede con una direccin fsica ([Df]). Dado que en un sistema de memoria virtual la direccin fsica asociada a un objeto puede cambiar, esta cach requiere que se realice primero la etapa de traduccin en el nivel de memoria principal (en el mejor de los casos, un acceso a la TLB) antes de poder realizar el acceso a la cach, para poder determinar cul es la direccin fsica actual del objeto de memoria requerido. Esto provoca una falta de paralelismo en los accesos a memoria, puesto que no se puede consultar simultneamente la cach y la TLB. Para paliar este problema, se puede usar una cach tal que el ndice de seleccin que se utiliza para acceder a la misma corresponda con la parte de la direccin lgica que representa el desplazamiento dentro de la pgina, puesto que este valor sigue siendo el mismo en la direccin fsica. Con esta estrategia, se puede realizar la etapa de seleccin del conjunto de la cach que contiene el dato deseado mientras est trabajando la TLB, de manera que cuando termine la TLB, quede slo por realizar la comparacin de etiquetas. Esta solucin, sin embargo, limita el tamao mximo de la cach (una cach con correspondencia directa estara limitada al tamao de la pgina; una asociativa por conjuntos con dos lneas de cach por conjunto tendra un tamao mximo de dos veces el tamao de la pgina y, as sucesivamente). cia. Una vez aplicado el modelo, en los siguientes apartados se analizan los posibles problemas de coheren-

Problemas de coherencia entre niveles adyacentes Este problema surge cuando se produce una actualizacin de un objeto de memoria en un nivel y hay una lectura de dicho objeto en otro nivel adyacente, no habindose propagado la actualizacin. A continuacin, se plantean varias situaciones en las que se presenta este problema. En primer lugar, consideremos el problema de coherencia entre la cach y la memoria principal si un dispositivo realiza DMA directamente sobre la memoria principal. El problema puede presentarse en ambas direcciones:

Gestin de memoria

341

Actualizacin en el nivel ms rpido. Un proceso escribe datos en un buffer y se arranca una operacin de DMA. Si la cach no usa write-through, algunos datos pueden no haberse actualizado en memoria principal y, por tanto, la operacin de DMA estar leyendo datos incorrectos. En algunos sistemas, este problema lo resuelve directamente el hardware, pero, en otros, debe hacerlo el sistema operativo, forzando que se actualicen en memoria principal todos los datos del buffer. Actualizacin en el nivel ms lento. Una vez que se completa una operacin de DMA sobre un buffer, un proceso puede seguir leyendo datos obsoletos presentes en la cach, puesto que no se han actualizado. Si el hardware no soluciona este problema, cuando concluya la operacin de DMA, habr que invalidar de la cach las direcciones correspondientes a ese buffer. Adems de en la jerarqua de datos, pueden producirse problemas de este tipo en una jerarqua de traduccin. Concretamente, existirn problemas de coherencia si se actualiza la informacin de la tabla de pginas (nivel ms lento) y se usa informacin de la TLB ya obsoleta. Este problema atae exclusivamente al sistema operativo y es labor del mismo resolverlo. Cada vez que el sistema operativo modifique algn campo de una entrada de la tabla de pginas que potencialmente pueda estar incluida en la TLB, debe solicitar la invalidacin de dicha entrada en la TLB. Eso incluye cambios en la proteccin de una pgina, como sucede con la tcnica del COW, cambios en los bits de referencia o de modificado, la invalidacin de una pgina en la tabla de pginas, ya sea debido a que se expulsa o a que deja de ser vlida al eliminarse la regin que la contiene, etctera. Problemas de coherencia entre componentes del mismo nivel En un multiprocesador existen niveles en los que hay mltiples componentes, uno por procesador. Es preciso asegurar que no se producen problemas de coherencia cuando se realiza una actualizacin de un dato en un componente y una consulta del mismo en otro componente de ese mismo nivel. Se presentan dos situaciones de este tipo: Coherencia entre mltiples cachs. Normalmente, el hardware del multiprocesador resuelve este problema. Coherencia entre mltiples TLB. De esta labor se tiene que encargar el sistema operativo. Dado que la TLB es bsicamente un componente de consulta, los problemas de coherencia se restringen a cuando se invalida una entrada de la TLB. En un multiprocesador, es necesario invalidar todas las entradas que puedan existir en el sistema correspondientes a esa pgina. Habitualmente, esta invalidacin se implementa usando IPI (interrupciones entre procesadores): desde el procesador donde se invalida la TLB se enva una IPI a todos los procesadores cuyas TLB puedan contener esa entrada. Dada la sobrecarga de esta operacin, algunos sistemas operativos utilizan algoritmos de reemplazo que no actualizan el bit de referencia en su versin para multiprocesadores (poner a 0 el bit de referencia implicar invalidar entradas de las TLB). Como se coment anteriormente, en un sistema monoprocesador tambin pueden aparecer este tipo de problemas si existen cachs de instrucciones y de datos separadas. Cuando se est cargando en memoria el cdigo de un programa, ste pasa a travs de la cach de datos. Sin embargo, a la hora de comenzar la ejecucin, las instrucciones se leen de las cachs de instrucciones. Algunos procesadores mantienen de forma automtica la coherencia de estas cachs. Sin embargo, en otros, debe ser el sistema operativo el encargado de llevarla a cabo. Para ello, despus de completarse la carga del programa en memoria, el sistema operativo debe volcar a memoria las entradas de la cach de datos vinculadas con el rango de direcciones donde se ha cargado el cdigo, as como invalidar las entradas de la cach de instrucciones correspondientes a dicho rango. Problemas de coherencia debidos al uso de homnimos Un homnimo se produce cuando un mismo nombre hace referencia a dos objetos diferentes. En el caso de la jerarqua de memoria, esta situacin slo se puede producir en sistemas que usan un espacio lgico por cada proceso, puesto que en ellos una misma direccin lgica se refiere a distintos objetos dependiendo de qu proceso la use. En cualquier caso, los homnimos slo generan problemas de coherencia en sistemas donde

342

Sistemas operativos. Una visin aplicada

se realice una multiplexacin temporal del componente de memoria, es decir, en aqullos en los que no se gestiona informacin de proceso. Eso ocurre en la cach virtual y en la TLB cuando no incluyen informacin de proceso. El sistema operativo debe encargarse de resolver este problema, invalidando el componente de memoria (la TLB o la cach virtual) en cada cambio de contexto. Dentro de este apartado tambin se podra considerar el problema que surge en los accesos por DMA a memoria si el sistema operativo asigna otra pgina a un marco involucrado en la operacin de DMA, que en la mayora de los procesadores, usa directamente direcciones fsicas. Se trata de un problema de homnimos que el sistema operativo resuelve reteniendo en memoria las pginas involucradas, tal como se explic en la seccin 5.5.8. Problemas de coherencia debidos al uso de sinnimos Un sinnimo se produce cuando dos o ms nombres diferentes se refieren al mismo objeto. Esta situacin es habitual en un sistema de memoria, puesto que va unida intrnsicamente al compartimiento de informacin. El problema surge cuando en un determinado nivel no se detecta que dos direcciones lgicas corresponden a un mismo objeto, gestionando dos copias independientes del mismo dato, con los problemas de coherencia asociados. En el nivel de memoria principal este problema queda resuelto mediante la cach de pginas, que asegura que las referencias a una pgina compartida utilizan el mismo marco. Tampoco se produce en la memoria secundaria, donde se usa un nico bloque swap para la pgina compartida. En caso de utilizar una cach virtual con informacin de proceso, s puede presentarse este problema de duplicidad de memoria en ese nivel, existiendo distintas alternativas para resolverlo: El hardware de la cach lo detecta y resuelve automticamente. El sistema operativo establece restricciones en el alineamiento de las regiones compartidas (por ejemplo, que empiecen en una direccin que sea mltiplo de 64KB), asegurando que dos sinnimos ocupan la misma lnea de la cach y, por tanto, nunca pueden almacenarse simultneamente en la memoria cach. El sistema operativo se asegura de que cuando ejecuta un proceso, no haya ninguna entrada en la cach asociada a otro proceso que sea un sinnimo de las usadas por el proceso actual, invalidando previamente las entradas conflictivas. Se usa un esquema que utiliza un nico espacio global, eliminado directamente el problema, puesto que no existen los sinnimos.

5.5.14. Operaciones del nivel de procesos y de regiones


Aadir la tcnica de memoria virtual a un esquema de paginacin bsicamente slo cambia un aspecto en cuanto a la implementacin de las operaciones de estos niveles: toda reserva de memoria del sistema se retrasa hasta justo el momento en el que se accede a la misma, realizndose en el contexto de la rutina de tratamiento del fallo de pgina o del fallo de proteccin. Las operaciones en el nivel de procesos son idnticas a las usadas en un esquema de paginacin sin memoria virtual, que se estudiaron en la seccin dedicada a este esquema. Las operaciones de regiones, vistas tambin en esa seccin, slo cambian en el aspecto reseado en el prrafo anterior. A continuacin, se analiza cmo se realizan las diversas operaciones sobre las regiones en un sistema con memoria virtual. Creacin de una regin Toda la gestin correspondiente al nivel de regiones es idntica a la usada en un sistema de paginacin sin memoria virtual. La variacin se corresponde con la labor en el nivel de procesos, puesto que, en este caso, cuando se crea una regin, no se le asigna memoria principal, dado que se cargar por demanda. Si se usa la tcnica de la creacin de pginas por demanda, ni siquiera hay que modificar la tabla de pginas. Si en el sistema hay preasignacin de swap y se trata de una regin privada o sin soporte, hay que reservar en el momento de la creacin la zona correspondiente del swap. En un sistema sin preasignacin, se reservar espacio en swap para una pgina cuando se expulse por primera vez estando modificada.

Gestin de memoria

343

En la creacin de la imagen inicial del proceso durante la activacin de un programa, se crean todas las regiones iniciales siguiendo el procedimiento que se acaba de describir. Por tanto, en un sistema que utilice tablas de pginas multinivel, basta con asignar una tabla del nivel superior con todas las entradas invlidas. Dado que la memoria virtual gestiona la informacin usando pginas completas y el sistema de ficheros utiliza bloques completos, la forma natural de asignar los bloques de un fichero ejecutable a las regiones del proceso sera la siguiente: El primer bloque (bloque 0) del ejecutable corresponde con la cabecera del ejecutable, que no se carga en memoria durante la ejecucin del programa. A la regin de cdigo se le asignar un nmero entero de bloques en el fichero y un nmero entero de pginas en el mapa. Si la regin ocupa C bloques, se almacenar en los bloques del ejecutable desde el 1 hasta el C. La regin de datos con valor inicial comienza justo despus, ocupando tambin un nmero entero de bloques y de pginas. El problema de esta solucin es que dedica un bloque completo a la cabecera, aunque normalmente slo ocupa un centenar de bytes. Adems, asigna ms espacio del requerido a la regin de cdigo y de datos con valor inicial, al tener que redondear su tamao a un nmero entero de bloques. Con esa estrategia, incluso un ejecutable muy pequeo ocupara tres bloques. Ante esta deficiencia, algunos sistemas operativos usan este esquema alternativo, que optimiza el uso del disco haciendo que toda la informacin se almacene de forma contigua en el fichero: La cabecera y el principio del cdigo comparten el primer bloque del fichero. Por tanto, cuando se carga la primera pgina del mapa, se trae a memoria tambin la cabecera, aunque sta no se necesite. La regin de cdigo y de datos estn dispuestas en el fichero de forma contigua. Por tanto, puede haber un bloque que contenga una primera parte de cdigo y una segunda de datos con valor inicial. Dado que ese bloque debe ser visto a la vez como una pgina de cdigo, con permiso de lectura y ejecucin, y de datos con valor inicial, con permiso de lectura y escritura, habr dos pginas diferentes, contiguas en el mapa, que se correspondern con ese bloque. Se trata, por tanto, de un objeto compartido por el mismo proceso, pero con distinta proteccin. Dicho de otra forma, en la tabla de regiones, el ltimo bloque del fichero ejecutable asociado a la regin de cdigo es el mismo que el primero de la regin de datos con valor inicial. Obsrvese que el proceso slo acceder a la primera parte de la ltima pgina de cdigo y a la segunda parte de la primera pgina de la regin de datos con valor inicial, quedando una zona sin usar en el mapa del proceso del tamao de una pgina (aunque no alineada en memoria). Esta solucin ahorra espacio en disco, presentando nicamente dos aspectos negativos, perfectamente tolerables: la sobrecarga de leer la cabecera del disco y el espacio en memoria que ocupa, a pesar de que su presencia en memoria no sea necesaria, y la prdida de proteccin de la ltima pgina de cdigo, que puede modificarse por error a travs de la primera pgina de la regin de datos sin que se detecte. El nico detalle que falta por aclarar es dnde se crea el contenido inicial de la pila, formado por los argumentos y las variables de entorno que recibe el programa. Las dos opciones habituales son almacenarlo en marcos de pgina y hacer que la tabla de pginas inicial haga referencia a esos marcos, o bien guardarlo en bloques de swap, indicndolo en las entradas de la tabla de pginas involucradas. En la figura 5.75 se muestra cmo es la imagen de memoria inicial de un proceso en un sistema donde se usa la segunda opcin de implementacin de pila planteada. Para simplificar, se ha supuesto que se utiliza una tabla de pginas de un solo nivel. En esta figura se muestra, con zonas sombreadas, cmo la cabecera ocupa una primera parte de la regin de cdigo, y cmo la ltima parte de la segunda pgina de cdigo y la primera de la de datos con valor inicial no son utilizadas. La tabla de regiones muestra el compartimiento del bloque 1 del fichero por parte de la regin de cdigo y la de datos con valor inicial. Eliminacin de una regin Nuevamente, las acciones son iguales que en un sistema de paginacin sin memoria virtual. Adems, si se trata de una regin privada, hay que liberar los bloques de swap asociados a la regin.

344

Sistemas operativos. Una visin aplicada


0 8192 R-X Comp. F Bl. inicial 0 8192 8192 RW- Privada F Bl. inicial 1 16384 4096 RW- Privada Annima BFFFF000 4096 RW- Privada Annima

Fichero F Swap (SW1) Bloq. 0 Bloq. 1 Bloq. 2


Fichero

Bloq. 0 Bloq. 1 Bloq. 2


Fichero

.........

.........

Mapa de memoria inicial


0 8192 16384 20480 BFFFF000 C0000000 Datos con valor inicial Datos sin valor inicial ......... Pila Cdigo

BCP
t. de regiones t. pginas

Memoria
Marco 0 Marco 1 Marco 2 Marco 3 Marco 4 ........

00000 I 000 00000 I 000 00000 I 000 00000 I 000 00000 I 000 ......... 00000 I 000 ................ 00002 I SW1

.........................

Figura 5.75 Estado inicial de ejecucin de un programa. Cambio del tamao de una regin Vuelve a ser muy similar a cmo se realiza en un esquema de paginacin sin memoria virtual. Con respecto a una disminucin de tamao en una regin, si se trata de una regin privada, habr que liberar los bloques de swap asociados a la misma. Por lo que se refiere a un aumento de tamao, la nica diferencia con el sistema sin memoria virtual es que, como en la creacin de una regin, no hay que asignar marcos ni actualizar la tabla de pginas. Slo se necesita ajustar el tamao en la tabla de regiones. Si en el sistema hay preasignacin de swap y se trata de una regin privada o sin soporte, hay que reservar el espacio requerido en el swap. El tratamiento de la expansin de la pila es algo ms complejo, ya que no proviene de una solicitud del proceso, sino de la propia evolucin de la pila. Cuando se produce una expansin de pila, se genera un fallo de pgina asociado a una direccin que se corresponde con un hueco. El sistema operativo podra pensar, en principio, que se trata de un acceso errneo, puesto que no corresponde a ninguna regin. Para diferenciarlo, debe comparar la direccin que caus el fallo con el puntero de pila. Si la direccin es mayor, est dentro de la pila. Se trata de una expansin de la pila que implica simplemente actualizar la tabla de regiones, reservar espacio de swap si hay preasignacin, y servir el fallo de pgina de manera convencional. En caso contrario, se trata de un acceso errneo. Tenga en cuenta que si hay un hueco de una sola pgina entre la pila y la regin anterior, no se permitir la expansin, ya que si se llevara a cabo, la prxima expansin usara directamente una pgina de la otra regin sin avisar al sistema operativo (este hueco acta como una pgina de seguridad). Duplicado de una regin Esta operacin s cambia de manera considerable al aplicar en este caso la tcnica de copia diferida basada en el COW, tal como se explic en la seccin 5.5.11. Con esta tcnica, la operacin de duplicado no requiere reservar marcos de pgina ni realizar una copia del contenido de las pginas de la regin. Basta con duplicar las entradas de la tabla de pginas que corresponden con la regin, marcndolas como de slo lectura tanto en la tabla de pginas origen como en la destino. Asimismo, habr que incrementar los contadores de referencias de los bloques de swap y de los marcos de pgina asociados a la regin. Con esta tcnica, se optimiza considerablemente la ejecucin de un servicio fork, ya que slo es necesario duplicar su tabla de pginas, en vez de su mapa. En la figura 5.76 se muestra cmo se llevara a cabo una operacin fork. En ella se puede apreciar como esta operacin implica duplicar tanto la tabla de regiones como la de pginas. Obsrvese como se ha eliminado el permiso de escritura en la quinta entrada de ambas tablas de pginas. Para simplificar, se ha supuesto que se utiliza una tabla de pginas de un solo nivel.

Gestin de memoria
Mapa de memoria de P1
0 8192 16384 20480 BFFFF000 C0000000 Cdigo Datos con valor inicial Datos sin valor inicial ......... Pila 0 8192 R-X Comp. F Bl. inicial 0 8192 8192 RW- Privada F Bl. inicial 1 16384 4096 RW- Privada Annima BFFFF000 4096 RW- Privada Annima 0 8192 R-X Comp. F Bl. inicial 0 8192 8192 RW- Privada F Bl. inicial 1 16384 4096 RW- Privada Annima BFFFF000 4096 RW- Privada Annima

345

Fichero F Swap (SW1) Bloq. 0 Bloq. 1 Bloq. 2


Fichero

Bloq. 0 Bloq. 1 Bloq. 2


Fichero

BCP de P1
t. de regiones

BCP de P2
t. de regiones t. pginas

.........

.........

Mapa de memoria de P2
0 8192 16384 20480 BFFFF000 C0000000 Cdigo Datos con valor inicial Datos sin valor inicial ......... Pila

t. pginas

Memoria
Marco 0 Pgina 4 de P1 P2 Marco 1 Marco 2 Marco 3 Pgina 0 de P1 P2 Marco 4 ........ .........................

00004 V R-X 00000 I 000 00001 I SW1 00000 I 000 00004 V R-......... 00000 I 000 ................ 00002 I SW1

00004 V R-X 00000 I 000 00001 I SW1 00000 I 000 00004 V R-......... 00000 I 000 ................ 00002 I SW1

Figura 5.76 Resultado de la llamada fork.

5.5.15. Ficheros proyectados en memoria


La generalizacin de la tcnica de memoria virtual permite ofrecer a los usuarios una forma alternativa de acceder a los ficheros. Como se ha visto en la seccin anterior, en un sistema de memoria virtual, se hacen corresponder entradas de la tabla de pginas con bloques del fichero ejecutable. La tcnica de proyeccin de ficheros en memoria plantea usar esa misma idea, pero aplicada a cualquier fichero. El sistema operativo va a permitir que un programa solicite que se haga corresponder una zona de su mapa de memoria con los bloques de un fichero cualquiera, ya sea completo o parte del mismo. En la solicitud, el programa especifica el tipo de proteccin asociada a la regin y si la regin ser compartida o privada. El sistema operativo simplemente realiza una operacin de crear regin, tal como se ha explicado en la seccin previa. Una vez que el fichero est proyectado, si el programa accede a una direccin de memoria perteneciente a la regin asociada al fichero, estar accediendo al fichero. El programa ya no tiene que usar los servicios del sistema operativo para leer (read) y escribir (write) en el fichero. La figura 5.77 muestra un ejemplo de una proyeccin de un fichero de 40.000 bytes. Como se puede apreciar en la misma, existe una entrada en la tabla de regiones que representa la proyeccin y que almacena las caractersticas de la misma; en este caso, es una proyeccin compartida de lectura y escritura. En el ejemplo de la figura, si el programa lee un byte de la direccin de memoria 20480, estar leyendo el primer byte del fichero, mientras que si escribe un byte en la direccin 20481, estar escribiendo en el segundo byte del fichero. En la figura, se ha supuesto que ya se ha producido este acceso y, por ello, el primer bloque del fichero est residente en el marco 4 de la memoria. La proyeccin de un fichero no implica que se le asigne memoria principal. El propio mecanismo de memoria virtual ser el que se encargue de ir trayendo a memoria principal los bloques del fichero cuando se produzca un fallo de pgina al intentar acceder a la regin asociada al mismo, y de escribirlos cuando la pgina sea expulsada estando modificada. El acceso a un fichero mediante su proyeccin en memoria presenta numerosas ventajas sobre el acceso convencional basado en los servicios de lectura y escritura. A continuacin, se detallan algunas de estas ventajas:

346

Sistemas operativos. Una visin aplicada


............ ............ ............ ............ ............

Fichero F Bloq. 0 Bloq. 1 Bloq. 2


Fichero

Mapa de memoria
Cdigo Datos con valor inicial Datos sin valor inicial

20480 40000 RW- Comp F Bl. inicial 0 ............

.........

BCP
20480 Fichero proyectado F t. de regiones t. pginas ......... Pila ......... 00000 I ................ 00000 I 000 000 00004 V RW00000 I 000 00000 I 000 ......... 00000 I 000 ................ Bloque 0 de F ......................... ............ ............ ............ ............

Memoria
Marco 0 Marco 1 Marco 2 Marco 3 Marco 4 ........

Figura 5.77 Proyeccin de un fichero. Se disminuye considerablemente el nmero de llamadas al sistema necesarias para acceder a un fichero. Con esta nueva tcnica, una vez que el fichero est proyectado, no hay que realizar ninguna llamada adicional. Esta reduccin implica una mejora considerable en los tiempos de acceso, puesto que, como ya es conocido, la activacin de una llamada al sistema tiene asociada una considerable sobrecarga. Se evitan copias intermedias de la informacin. Esto repercute tambin en un acceso ms eficiente. Con esta tcnica, el sistema operativo transfiere directamente la informacin entre la memoria y el fichero. Con la forma de acceso convencional, todas las transferencias se realizan pasando por la cach de bloques del sistema de ficheros. Se facilita la forma de programar los accesos a los ficheros. Una vez proyectado el fichero, se accede al mismo igual que a cualquier estructura de datos en memoria que haya declarado el programa. No es necesario utilizar ningn servicio especial del sistema operativo para acceder al mismo. As, por ejemplo, dado un programa que realiza un cierto tratamiento sobre una matriz de datos almacenada en memoria, su modificacin para que leyera la matriz de un fichero slo implicara aadir al principio del programa la proyeccin del fichero. No sera necesario modificar el cdigo restante.

5.6. SERVICIOS DE GESTIN DE MEMORIA


Como se ha podido apreciar a lo largo del captulo, las labores que lleva a cabo el sistema de gestin de memoria son ms bien de carcter interno. Ms que proporcionar una coleccin de servicios explcitos a las aplicaciones, el objetivo del sistema de memoria tiene un carcter ms implcito: dotar a las aplicaciones de un espacio de almacenamiento para su ejecucin que satisfaga las necesidades de las mismas. Adems, algunos servicios de gestin de memoria usados por los programas, como, por ejemplo, los vinculados con el uso de memoria dinmica, no son labor directa del sistema operativo, sino que los suministra el propio lenguaje de programacin. Debido a todo ello, este componente del sistema operativo apenas ofrece servicios directos a las aplicaciones. Entre ese nmero relativamente reducido de servicios, en esta seccin se ha considerado que los de mayor inters se pueden agrupar en dos categoras:

Gestin de memoria

347

Servicios de proyeccin de ficheros, que permiten incluir en el mapa de memoria de un proceso un fichero o parte del mismo. Bajo esta categora existirn, bsicamente, dos servicios: Proyeccin de un fichero. Con esta operacin se crea una regin asociada al objeto de memoria almacenado en el fichero. Normalmente, se pueden especificar algunas propiedades de esta nueva regin. Por ejemplo, el tipo de proteccin o si la regin es privada o compartida. Desproyeccin de un fichero. Este servicio elimina una proyeccin previa o parte de la misma. Servicios de montaje explcito de bibliotecas, que permiten que un programa cargue en tiempo de ejecucin una biblioteca dinmica y use la funcionalidad proporcionada por la misma, tal como se analiz en la seccin 5.3.2. En esta categora se englobaran, bsicamente, tres servicios: Carga de la biblioteca. Este servicio realiza la carga de la biblioteca, llevando a cabo todas las operaciones de montaje requeridas. Acceso a un smbolo de la biblioteca. Con esta operacin, el programa puede tener acceso a uno de los smbolos exportados por la biblioteca, ya sea ste una funcin o una variable. Descarga de la biblioteca. Este servicio elimina la biblioteca del mapa del proceso. En las siguientes secciones, se muestran los servicios proporcionados por UNIX y Windows dentro de estas dos categoras.

5.6.1. Servicios UNIX de proyeccin de ficheros


Los servicios de gestin de memoria ms frecuentemente utilizados son los que permiten la proyeccin y desproyeccin de ficheros (mmap, munmap). caddr_t mmap (caddr_t direccion, size_t longitud, int protec, int indicadores,
int descriptor, off_t despl);

Este servicio proyecta el fichero especificado creando una regin con las caractersticas indicadas en la llamada. El primer parmetro indica la direccin del mapa donde se quiere que se proyecte el fichero. Generalmente, se especifica un valor nulo para indicar que se prefiere que sea el sistema el que decida donde proyectar el fichero. En cualquier caso, la funcin devolver la direccin de proyeccin utilizada. El parmetro descriptor corresponde con el descriptor del fichero que se pretende proyectar (que debe estar previamente abierto), y los parmetros despl y longitud establecen qu zona del fichero se proyecta: desde la posicin despl hasta desp + longitud. El argumento protec establece la proteccin de la regin, que puede ser de lectura (PROT_READ), de escritura (PROT_WRITE), de ejecucin (PROT_EXEC), o cualquier combinacin de ellas. Esta proteccin debe ser compatible con el modo de apertura del fichero. Por ltimo, el parmetro indicadores permite establecer ciertas propiedades de la regin: MAP_SHARED. La regin es compartida. Las modificaciones sobre la regin afectarn al fichero. Un proceso hijo compartir esta regin con el padre. MAP_PRIVATE. La regin es privada. Las modificaciones sobre la regin no afectarn al fichero. Un proceso hijo no compartir esta regin con el padre, sino que obtendr un duplicado de la misma. MAP_FIXED. El fichero debe proyectarse justo en la direccin especificada en el primer parmetro. Esta opcin se utiliza, por ejemplo, para cargar el cdigo de una biblioteca dinmica, si en el sistema se utiliza un esquema de gestin de bibliotecas dinmicas, tal que cada biblioteca tiene asignado un rango de direcciones fijo. En el caso de que se quiera proyectar una regin sin soporte (regin annima), en algunos sistemas se puede especificar el valor MAP_ANON en el parmetro indicadores. Otros sistemas UNIX no ofrecen

348

Sistemas operativos. Una visin aplicada

esta opcin, pero permiten proyectar el dispositivo /dev/zero para lograr el mismo objetivo. Esta opcin se puede usar para cargar la regin de datos sin valor inicial de una biblioteca dinmica. int munmap(caddr_t direccion, size_t longitud); Este servicio elimina una proyeccin previa o parte de la misma. Los parmetros direccion y longitud definen la regin (o la parte de la regin) que se quiere eliminar del mapa del proceso. Antes de presentar ejemplos del uso de estos servicios, hay que aclarar que se utilizan conjuntamente con los servicios de manejo de ficheros que se presentarn en el captulo que trata este tema. Por ello, para una buena comprensin de los ejemplos, se deben estudiar tambin los servicios explicados en ese captulo. A continuacin, se muestran dos ejemplos del uso de estas funciones. El primero es el programa 5.5 que cuenta cuntas veces aparece un determinado carcter en un fichero utilizando la tcnica de proyeccin en memoria. Programa 5.5 Programa que cuenta el nmero de apariciones de un carcter en un fichero.
#include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> int main(int argc, char *argv[]) { int i, fd, contador=0; char caracter; char *org, *p; struct stat bstat; if (argc!=3) { fprintf (stderr, Uso: %s caracter fichero\n, argv[0]); return 1; } /* Para simplificar, se supone que el carcter a contar corresponde con el primero del primer argumento */ caracter=argv[1][0]; /* Abre el fichero para lectura */ if ((fd=open(argv[2], O_RDONLY))<0) { perror(No puede abrirse el fichero); return 1; } /* Averigua la longitud del fichero */ if (fstat(fd, &bstat)<0) { perror(Error en fstat del fichero); close(fd); return 1; } /* Se proyecta el fichero */ if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ, MAP_SHARED, fd, 0)) == MAP_FAILED) { perror(Error en la proyeccion del fichero); close(fd); return 1; }

Gestin de memoria
/* Se cierra el fichero */ close(fd); /* Bucle de acceso */ p=org; for (i=0; i<bstat.st_size; i++) if (*p++==caracter) contador++; /* Se elimina la proyeccion */ munmap(org, bstat.st_size); printf(%d\n, contador); return 0; }

349

El segundo ejemplo se corresponde con el programa 5.6 que usa la tcnica de proyeccin para realizar la copia de un fichero. Observe el uso del servicio ftruncate para asignar espacio al fichero destino. Programa 5.6 Programa que copia un fichero.
#include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> void main(int argc, char *argv[]) { int i, fdo, fdd; char *org, *dst, *p, *q; struct stat bstat; if (argc!=3) { fprintf (stderr, Uso: %s orig dest\n, argv[0]); return 1; } /* Abre el fichero origen para lectura */ if ((fdo=open(argv[1], O_RDONLY))<0) { perror(No puede abrirse el fichero origen); return 1; } /* Crea el fichero destino */ if ((fdd=open(argv[2], O_CREAT|O_TRUNC|O_RDWR, 0640))<0) { perror(No puede crearse el fichero destino); close(fdo); return 1; } /* Averigua la longitud del fichero origen */ if (fstat(fdo, &bstat)<0) { perror(Error en fstat del fichero origen); close(fdo); close(fdd); unlink(argv[2]); return 1; }

350

Sistemas operativos. Una visin aplicada

/* Establece que la longitud del fichero destino es igual a la del origen.*/ if (ftruncate(fdd, bstat.st_size)<0) { perror(Error en ftruncate del fichero destino); close(fdo); close(fdd); unlink(argv[2]); return 1; } /* Se proyecta el fichero origen */ if ((org=mmap((caddr_t) 0, bstat.st_size, PROT_READ, MAP_SHARED, fdo, 0)) == MAP_FAILED) { perror(Error en la proyeccion del fichero origen); close(fdo); close(fdd); unlink(argv[2]); return 1; } /* Se proyecta el fichero destino */ if ((dst=mmap((caddr_t) 0, bstat.st_size, PROT_WRITE, MAP_SHARED, fdd, 0)) == MAP_FAILED) { perror(Error en la proyeccion del fichero destino); close(fdo); close(fdd); unlink(argv[2]); return 1; } /* Se cierran los ficheros */ close(fdo); close(fdd); /* Bucle de copia */ p=org; q=dst; for (i=0; i<bstat.st_size; i++) *q++= *p++; /* Se eliminan las proyecciones */ munmap(org, bstat.st_size); munmap(dst, bstat.st_size); return 0; }

5.6.2. Servicios UNIX de carga de bibliotecas


Por lo que se refiere a esta categora, la mayora de los sistemas UNIX ofrece las funciones dlopen, dlsym y dlclose. void *dlopen(const char *biblioteca, int indicadores); La rutina dlopen realiza la carga y montaje de una biblioteca dinmica. Recibe como argumentos el nombre de la biblioteca y el valor indicadores, que determina diversos aspectos vinculados con la carga de la biblioteca. Como resultado, esta funcin devuelve un descriptor que identifica dicha biblioteca cargada. En cuanto al segundo parmetro, aunque permite especificar distintas posibilidades a la hora de cargarse la biblioteca, de forma obligatoria, slo es necesario indicar uno de los dos siguientes valores: RTLD_LAZY, que indica que las referencias a smbolos que estn pendientes de resolver dentro de la biblioteca no se llevarn a cabo hasta que sea estrictamente necesario, o RTLD_NOW, que especifica que durante la propia llamada dlopen se resuelvan todas las referencias pendientes que haya dentro de la biblioteca que se desea cargar. Recuerde que estos dos modos de operacin se analizaron cuando se estudiaron los aspectos de implementacin de las bibliotecas dinmicas.

Gestin de memoria void *dlsym(void *descriptor, char *simbolo);

351

La funcin dlsym permite acceder a uno de los smbolos exportados por la biblioteca. Recibe como parmetros el descriptor de una biblioteca dinmica previamente cargada y el nombre de un smbolo (una variable o una funcin). Este servicio se encarga de buscar ese smbolo dentro de la biblioteca especificada y devuelve la direccin de memoria donde se encuentra dicho smbolo. Como primer parmetro, en vez de un descriptor de biblioteca, se puede especificar la constante RTLD_NEXT. Si desde una biblioteca dinmica se invoca a la funcin dlsym especificando esa constante, el smbolo se buscar en las siguientes bibliotecas dinmicas del proceso a partir de la propia biblioteca que ha invocado la funcin dlsym, en vez de buscarlo empezando por la primera biblioteca dinmica especificada en el mandato de montaje. Esta caracterstica suele usarse cuando se pretende incluir una funcin de interposicin que, adems, despus invoque la funcin original. int dlclose(void *descriptor); La rutina dlclose descarga la biblioteca especificada por el descriptor. A continuacin, se incluye el programa 5.7 que muestra un ejemplo del uso de estas funciones. El programa recibe como argumentos el nombre de una biblioteca dinmica, el nombre de una funcin y el parmetro que se le quiere pasar a la funcin. Esta funcin debe ser exportada por la biblioteca, debe tener un nico parmetro de tipo cadena de caracteres y devolver un valor entero. El programa carga la biblioteca e invoca la funcin pasndole el argumento especificado, imprimiendo el resultado devuelto por la misma. Programa 5.7 Programa que ejecuta una funcin exportada por una biblioteca dinmica.
#include <stdio.h> #include <unistd.h> #include <dlfcn.h> #include <string.h> #include <stdlib.h> int main(int argc, char *argv[]) { void *descriptor_bib; int (*procesar)(char *); int resultado; if (argc!=4) { fprintf(stderr, "Uso: %s biblioteca funcion argumento\n", argv[0]); return 1; } /* Se carga la biblioteca dinmica */ if (!(descriptor_bib=dlopen(argv[1], RTLD_LAZY))) { fprintf(stderr, "Error cargando biblioteca: %s\n", dlerror()); return 1; } /* Busca el smbolo */ if (!(procesar=dlsym(descriptor_bib, argv[2]))) { fprintf(stderr, "Error: biblioteca no incluye la funcion\n"); return 1; } /* Finalmente, llamamos a la funcin */ resultado=procesar(argv[3]); printf("Resultado: %d\n", resultado); /* Se descarga la biblioteca */ dlclose(descriptor_bib); return 0; }

352

Sistemas operativos. Una visin aplicada

5.6.3. Servicios Windows de proyeccin de ficheros


A diferencia de UNIX, en Windows, la proyeccin de un fichero se realiza en dos pasos. En primer lugar, hay que crear una proyeccin del fichero y, posteriormente, se debe crear una regin en el proceso que est asociada a la proyeccin. HANDLE CreateFileMapping(HANDLE fich, LPSECURITY_ATTRIBUTES segur, DWORD prot,
DWORD tamao_max_alta, DWORD tamao_max_baja, LPCTSTR nombre_proy);

Esta funcin crea una proyeccin de un fichero. Como resultado de la misma, devuelve un identificador de la proyeccin. Recibe como parmetros el nombre del fichero, un valor de los atributos de seguridad, la proteccin, el tamao del objeto a proyectar (especificando la parte alta y la parte baja de este valor en dos parmetros independientes) y un nombre para la proyeccin. En cuanto a la proteccin, puede especificarse de slo lectura (PAGE_READONLY), de lectura y escritura (PAGE_READWRITE) o privada (PAGE_WRITECOPY). Con respecto al tamao, en el caso de que el fichero pueda crecer, se debe especificar el tamao esperado para el fichero. Si se especifica un valor 0, se usa el tamao actual del fichero. Por ltimo, por lo que se refiere al nombre de la proyeccin, ste permite a otros procesos acceder a la misma. Si se especifica un valor nulo, no se asigna nombre a la proyeccin. LPVOID MapViewOfFile(HANDLE id_proy, DWORD acceso, DWORD desp_alta,
DWORD desp_baja, DWORD tamao);

Esta funcin crea una regin en el mapa del proceso que queda asociada con una proyeccin previamente creada. Al completarse, esta rutina devuelve la direccin del mapa donde se ha proyectado la regin. Recibe como parmetros el identificador de la proyeccin devuelto por CreateFileMapping, el tipo de acceso solicitado (FILE_MAP_WRITE, FILE_MAP_READ y FILE_MAP_ALL_ACCESS), que tiene que ser compatible con la proteccin especificada en la creacin, el desplazamiento con respecto al inicio del fichero a partir del que se realiza la proyeccin, y el tamao de la zona proyectada (el valor cero indica todo el fichero). BOOL UnmapViewOfFile(LPVOID dir); Esta funcin elimina la proyeccin del fichero. El parmetro indica la direccin de comienzo de la regin que se quiere eliminar. A continuacin, se muestran los dos mismos ejemplos que se plantearon en la seccin dedicada a este tipo de servicios en UNIX. Como se coment en dicha seccin, es necesario conocer los servicios bsicos de ficheros para entender completamente los siguientes programas. El primero es el programa 5.8 que cuenta cuntas veces aparece un determinado carcter en un fichero usando la tcnica de proyeccin en memoria. Programa 5.8 Programa que cuenta el nmero de apariciones de un carcter en un fichero.
#include <windows.h> #include <stdio.h> int main (int argc, char *argv[]) { HANDLE hFich, hProy; LPSTR base, puntero; DWORD tam; int contador=0; char caracter; if (argc!=3) { fprintf (stderr, "Uso: %s caracter fichero\n", argv[0]); return 1; }

Gestin de memoria
/* Para simplificar, se supone que el carcter a contar corresponde con el primero del primer argumento */ caracter=argv[1][0]; /* Abre el fichero para lectura */ hFich = CreateFile(argv[2], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFich == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede abrirse el fichero\n); return 1; } /* se crea la proyeccin del fichero */ hProy = CreateFileMapping(hFich, NULL, PAGE_READONLY, 0, 0, NULL); if (hProy == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede crearse la proyeccin\n); return 1; } /* se realiza la proyeccin */ base = MapViewOfFile(hProy, FILE_MAP_READ, 0, 0, 0); tam = GetFileSize(hFich, NULL); /* bucle de acceso */ puntero = base; while (puntero < base + tam) if (*puntero++==caracter) contador++; printf("%d\n", contador); /* se elimina la proyeccin y se cierra el fichero */ UnmapViewOfFile(base); CloseHandle(hProy); CloseHandle(hFich); return 0; }

353

El segundo ejemplo se corresponde con el programa 5.9 que usa la tcnica de proyeccin para realizar la copia de un fichero. Programa 5.9 Programa que copia un fichero.
#include <windows.h> #include <stdio.h> int main (int argc, char *argv[]){ HANDLE hEnt, hSal; HANDLE hProyEnt, hProySal; LPSTR base_orig, puntero_orig; LPSTR base_dest, puntero_dest; DWORD tam; if (argc!=3){ fprintf (stderr, "Uso: %s origen destino\n", argv[0]); return 1; }

354

Sistemas operativos. Una visin aplicada

/* se abre el fichero origen */ hEnt = CreateFile (argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hEnt == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede abrirse el fichero origen\n); return 1; } /* se crea la proyeccin del fichero origen */ hProyEnt = CreateFileMapping(hEnt, NULL, PAGE_READONLY, 0, 0, NULL); if (hProyEnt == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede crearse proyeccin del fichero origen\n); return(1); } /* se proyecta el fichero origen */ base_orig = MapViewOfFile(hProyEnt, FILE_MAP_READ, 0, 0, 0); tam = GetFileSize (hEnt, NULL); /* se crea el fichero destino */ hSal = CreateFile(argv[2], GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hSal == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede crearse el fichero destino\n); return 1; } /* se crea la proyeccin del fichero destino */ hProySal = CreateFileMapping(hSal, NULL, PAGE_READWRITE, 0, tam, NULL); if (hProySal == INVALID_HANDLE_VALUE) { fprintf(stderr, No puede crearse proyeccin del fichero destino); return 1; } /* se proyecta fichero destino */ base_dest = MapViewOfFile(hProySal, FILE_MAP_WRITE, 0, 0, tam); /* bucle de copia */ puntero_orig = base_orig; puntero_dest = base_dest; for ( ; puntero_orig < base_orig + tam; puntero_orig++, puntero_dest++) *puntero_dest = *puntero_orig; /* se eliminan proyecciones y se cierran ficheros */ UnmapViewOfFile(base_dest); UnmapViewOfFile(base_orig); CloseHandle(hProyEnt); CloseHandle(hEnt); CloseHandle(hProySal); CloseHandle(hSal); return 0; }

Gestin de memoria

355

5.6.4. Servicios Windows de carga de bibliotecas


En esta categora, Windows ofrece las funciones LoadLibrary, GetProcAddress y FreeLibrary. HINSTANCE LoadLibrary(LPCTSTR biblioteca); La rutina LoadLibrary realiza la carga y montaje de una biblioteca dinmica. Recibe como argumento el nombre de la biblioteca. FARPROC GetProcAddress(HMODULE descriptor, LPCSTR simbolo); La funcin GetProcAddress permite acceder a uno de los smbolos exportados por la biblioteca. Recibe como parmetros el descriptor de una biblioteca dinmica previamente cargada y el nombre de un smbolo. Este servicio se encarga de buscar ese smbolo dentro de la biblioteca especificada y devuelve la direccin de memoria donde se encuentra dicho smbolo. BOOL FreeLibrary(HINSTANCE descriptor); La rutina FreeLibrary descarga la biblioteca especificada por el descriptor. A continuacin, en el programa 5.10 se muestra el mismo ejemplo que se plante para UNIX en el programa 5.7. Programa 5.10 Programa que ejecuta una funcin exportada por una biblioteca dinmica.
#include <windows.h> #include <stdio.h> int main(int argc, char *argv[]) { HINSTANCE descriptor_bib; int (*procesar)(LPCTSTR); int resultado; if (argc!=4) { fprintf(stderr, "Uso: %s biblioteca funcion argumento\n", argv[0]); return 1; } /* Se carga la biblioteca dinmica */ descriptor_bib = LoadLibrary(argv[1]); if (descriptor_bib == NULL) { fprintf(stderr, "Error cargando biblioteca %s\n", argv[1]); return 1; } procesar = (int(*)(LPCTSTR))GetProcAddress(descriptor_bib, argv[2]); if (procesar == NULL) { /* La funcin no existe */ fprintf(stderr, "Error: biblioteca no incluye la funcion\n"); return 1; } /* Finalmente, llamamos a la funcin */ resultado=procesar(argv[3]); printf("Resultado: %d\n", resultado); /* Se descarga la biblioteca */ FreeLibrary(descriptor_bib); return 0; }

356

Sistemas operativos. Una visin aplicada

5.7. LECTURAS RECOMENDADAS


Dada la variedad de temas abordados en este captulo, al intentar dar una visin integral de la gestin de memoria, se recomiendan lecturas de muy diversa ndole. Para profundizar en los aspectos relacionados con el ciclo de vida de un programa, se recomienda al lector interesado la consulta del libro [Levine, 1999]. En cuanto a la gestin del heap y, en general, el problema general de la asignacin de espacio, es aconsejable el artculo [Wilson, 1995]. Dada la fuerte dependencia del hardware que existe en el sistema de memoria, es obligado hacer alguna referencia a documentacin sobre los esquemas hardware de gestin de memoria ([Jacob, 1998]). Asimismo, se aconseja la revisin de documentacin sobre aspectos menos convencionales, ya sea por su carcter novedoso o por ser avanzados, tales como nuevos algoritmos de reemplazo de memoria virtual ([Megiddo, 2004]) o sistemas basados en un espacio de direcciones nico ([Chase, 1994]). Todos los libros generales de sistemas operativos (como, por ejemplo, [Silberschatz, 2005], [Stallings, 2005], [Nutt, 2004] y [Tanenbaum, 2001]) incluyen uno o ms captulos dedicados a la gestin de memoria, aunque, en nuestra opinin, seguramente interesada, no usan el enfoque integral de la gestin de memoria que se ha utilizado en este captulo, por lo que su extensin es menor que la del presente captulo. Para ampliar conocimientos sobre la implementacin de la gestin de la memoria en diversos sistemas operativos, en el caso de Linux, se pueden consultar [Gorman, 2004], [Mosberger, 2002] y [Bovet, 2005], para UNIX BSD, [McKusick, 2004], y, por lo que se refiere a Windows, [Russinovich, 2005]. Por el impacto y la innovacin que causaron en su momento en el campo de la gestin de memoria, son de especial inters los sistemas operativos MULTICS [Organick, 1972] y Mach [Rashid, 1988]. En cuanto a los servicios de gestin de memoria, en [Stevens, 1999] se presentan los servicios de UNIX y en [Hart, 2004] los de Windows.

5.8. EJERCICIOS
5.1. Cul de las siguientes tcnicas favorece la proximidad de referencias? a) Un programa multithread. b) El uso de listas. c) La programacin funcional. d) La programacin estructurada. Considere un sistema de paginacin con un tamao de pgina P. Especifique cul sera la frmula que determina la direccin de memoria fsica F a partir de la direccin virtual D, siendo MARCO(X) una funcin que devuelve qu nmero de marco est almacenado en la entrada X de la tabla de pginas. Es siempre el algoritmo LRU mejor que el FIFO? En caso de que sea as, plantee una demostracin. En caso negativo, proponga un contraejemplo. Aplique el modelo de coherencia propuesto en la seccin 5.5.13 al nivel de registros. En el lenguaje C se define el calificador volatile aplicable a variables. La misin de este calificador es evitar problemas de coherencia en aquellas variables a las que se accede tanto desde el flujo de ejecucin normal como desde flujos asncronos, como por ejemplo una rutina asociada a una seal UNIX. Analice los tipos de problemas que podran aparecer y proponga un mtodo para resolver los problemas identificados para las variables etiquetadas con este calificador. 5.6. Algunas MMU no proporcionan un bit de referencia para la pgina. Proponga una manera de simularlo. Una pista: Se pueden forzar fallos de pgina para detectar accesos a una pgina. 5.7. Algunas MMU no proporcionan un bit de pgina modificada. Proponga una manera de simularlo. 5.8. Escriba un programa que use los servicios de proyeccin de ficheros de UNIX para comparar dos ficheros. 5.9. Escriba un programa que use los servicios de proyeccin de ficheros de Windows para comparar dos ficheros. 5.10. Determine qu nmero de fallos de pgina se producen al utilizar el algoritmo FIFO teniendo 3 marcos y cuntos con 4 marcos. Comprelo con el algoritmo LRU. Qu ca-

5.2.

5.3.

5.4. 5.5.

Gestin de memoria racteriza a los algoritmos de reemplazo de pila? 5.11. La secuencia que se utiliza habitualmente como ejemplo de la anomala de Belady es la siguiente:
1 2 3 4 1 2 5 1 2 3 4 5

357

5.19.

5.12. Suponiendo que se utiliza un sistema sin buffering de pginas, proponga ejemplos de las siguientes situaciones: a) Fallo de pgina sin operaciones de E/S. b) Fallo de pgina con slo una operacin de lectura. c) Fallo de pgina con slo una operacin de escritura. d) Fallo de pgina con una operacin de lectura y una de escritura. 5.13. Repita el ejercicio anterior, suponiendo un sistema con buffering de pginas. 5.14. Considere un sistema de memoria virtual sin buffering de pginas. Realice un anlisis de cmo evoluciona una pgina en este sistema dependiendo de la regin a la que pertenece. Estudie los siguientes tipos: a) Pgina de cdigo. b) Pgina de datos con valor inicial. c) Pgina de datos sin valor inicial. d) Pgina de un fichero proyectado. e) Pgina de zona de memoria compartida. 5.15. Resuelva el ejercicio anterior suponiendo que hay buffering de pginas. 5.16. Como se coment en la explicacin del algoritmo de reemplazo LRU, el tiempo que se debe usar para seleccionar la pgina menos recientemente usada es el tiempo lgico de cada proceso y no el tiempo real. Modifique la implementacin basada en contadores propuesta en el texto para que tenga en cuenta esta consideracin. 5.17. En el texto slo se ha planteado un bosquejo del algoritmo de reemplazo LFU. Explique cmo se podra disear una MMU que usara este algoritmo. Acto seguido, describa una aproximacin del mismo usando slo un bit de referencia. 5.18. Complete la rutina de tratamiento de fallo de pgina presentada en la seccin 5.5.7 con todos los aspectos que se han ido aadiendo en las secciones posteriores (cach de pginas y buffering, utilizacin de preasignacin de swap o no, creacin de tablas

5.20.

5.21. 5.22.

5.23.

5.24.

5.25.

5.26.

de pginas por demanda, expansin implcita de la pila, etc.). Algunas versiones de UNIX realizan la carga de las bibliotecas dinmicas usando el servicio mmap. Explique qu parmetros deberan especificarse para cada una de las secciones de una biblioteca. Acceda en un sistema Linux al fichero /proc/self/maps y analice cul es su contenido. A qu estructura de datos del sistema de gestin de memoria corresponde el contenido de este fichero? En Windows se pueden crear mltiples heaps. Analice en qu situaciones puede ser interesante esta caracterstica. Algunas versiones de UNIX ofrecen una llamada denominada vfork que crea un hijo que utiliza directamente el mapa de memoria del proceso padre, que se queda bloqueado hasta que el hijo ejecuta una llamada exec o termina. En ese momento el padre recupera su mapa. Analice qu ventajas y desventajas presenta el uso de este nuevo servicio frente a la utilizacin del fork convencional. En este anlisis suponga primero que el fork se implementa sin usar la tcnica COW para, a continuacin, considerar que s se utiliza. Analice qu puede ocurrir en un sistema que utiliza paginacin por demanda si se recompila un programa mientras se ejecuta. Proponga soluciones a los problemas que pueden surgir en esta situacin. En UNIX se define el servicio msync que permite forzar la escritura inmediata de una regin en su soporte. En qu situaciones puede ser interesante usar esta funcin? Analice qu situaciones se pueden producir en el tratamiento de un fallo de TLB en un sistema que tiene una gestin software de la TLB. Con el uso de la tcnica de proyeccin de ficheros se produce una cierta unificacin entre el sistema de ficheros y la gestin de memoria. Puesto que, como se ver en el captulo dedicado a los ficheros, el sistema de ficheros usa una cach de bloques con escritura diferida para acelerar el acceso al disco. Analice qu tipo de inconsistencias pueden producirse si se accede a un fichero utilizando una proyeccin y los servicios convencionales del sistema de ficheros.

358

Sistemas operativos. Una visin aplicada cin. En caso de que haya lectura, especifique si es de un fichero o de swap; en caso de que no la haya, explique si se requiere un marco libre para servir el fallo y qu informacin se almacena en el mismo. a) Despus de reservar memoria dinmica, el proceso escribe en la misma. b) Despus de llevar a cabo una llamada a procedimiento que hace que la regin de pila se expanda, el proceso modifica una variable local. c) El proceso lee una variable global sin valor inicial que modific antes, pero cuya pgina no est actualmente presente. d) Un proceso escribe en una variable global con valor inicial a la que ha accedido previamente sin modificarla, pero cuya pgina no est actualmente presente. e) Inmediatamente a continuacin de que un proceso modifique una variable global con valor inicial y, luego, cree un hijo (fork), el proceso hijo lee esa misma variable. f) Inmediatamente a continuacin de que un proceso lea una variable global con valor inicial y, luego, cree un hijo (fork), el hijo escribe en esa misma variable. g) Inmediatamente a continuacin de que un proceso modifique una variable global con valor inicial y, luego, cree un thread, el nuevo thread escribe en esa misma variable. h) Analice cmo afectara a esta estadstica el uso del buffering de pginas. Habra nuevas situaciones de fallos sin lectura de disco? Dejara de haber algunas de las situaciones de fallos sin lectura de disco que existen en un sistema que no usa buffering? 5.32. Considrese una TLB convencional, que no incluye informacin de proceso, tal que cada entrada tiene la informacin habitual: nmero de pgina y de marco, permisos de acceso, y bits de referencia y de modificado. Supngase que el procesador incluye dos instrucciones para que el sistema operativo pueda manipular la TLB: una para invalidar la entrada vinculada a una pgina y otra para invalidar completamente el conte-

5.27. Analice el uso de la tcnica del COW para optimizar una funcin de paso de mensajes entre los procesos de una misma mquina. 5.28. Sea un proceso en cuyo mapa de memoria existe una regin privada con soporte en fichero. El proceso va invocar la llamada exec. En qu ubicaciones pueden estar las pginas de la regin en el instante previo? Qu tratamiento se realiza sobre esa regin durante la llamada exec? 5.29. Basndose en la manera como se utilizan habitualmente las llamadas fork y exec en las aplicaciones, algunos proponen que sera ms eficiente que despus del fork se ejecutara primero el proceso hijo en vez del padre. Analice en qu puede basarse esta propuesta. 5.30. Considere un proceso Pr1 en cuyo mapa de memoria se incluye una regin privada con soporte en fichero, que est formada por 3 pginas. Suponga que se ejecuta la traza que se muestra a continuacin y que despus de ejecutar esta traza entran a ejecutar otros procesos que expulsan las pginas de estos procesos. Se debe calcular cuntos bloques de swap se dedican en total a esta regin y, para cada proceso, cul es la ubicacin de cada pgina de la regin, identificando en qu bloque del fichero o del swap est almacenada (numere los bloques del swap como considere oportuno). a) Pr1: lee de la pgina 1. b) Pr1: escribe en las pginas 2 y 3. c) Pr1: fork (crea Pr2). d) Pr1: escribe en las pginas 1 y 2. e) Pr2: escribe en la pgina 2. f) Pr2: fork (crea Pr3). g) Pr2: escribe en las pginas 1 y 3. h) Pr3: lee de las pginas 1, 2 y 3. 5.31. Muchos sistemas operativos mantienen una estadstica de cuntos fallos de pgina se producen en el sistema que no implican una operacin de lectura de disco (en Linux se denominan minor faults y en Windows soft faults). Suponga que se utiliza un sistema de memoria virtual basado en paginacin por demanda, sin buffering de pginas. Analice si se producira un fallo de pgina (ya sea convencional o el asociado al COW) y, en caso afirmativo, si implicara una lectura de disco o no, para cada una de las situaciones que se plantean a continua-

Gestin de memoria nido de la TLB. Analice de forma razonada si en cada una de las siguientes operaciones, el sistema operativo hara uso de alguna de estas instrucciones, especificando, en el caso de que se invalide una entrada, a qu pgina correspondera: a) Hay un cambio de contexto entre dos threads de distinto proceso. b) Hay un cambio de contexto entre dos threads del mismo proceso. c) Se crea una nueva regin en el mapa del proceso. d) Se elimina una regin del mapa del proceso. e) Cambia el tamao de una regin del mapa del proceso. Analice separadamente el caso del aumento de tamao y el de la disminucin. f) Se marca como duplicada una regin (por ejemplo, en el tratamiento de una regin privada que forma parte de una llamada fork). g) Hay un fallo de pgina que encuentra un marco libre. h) Hay un fallo de pgina que no encuentra marcos libres. El sistema usa el algoritmo de reemplazo del reloj y encuentra que la primera pgina candidata a ser expulsada tiene tanto el bit de referencia como el de modificado a 1, mientras que la segunda tiene ambos bits a 0. i) Se produce un fallo debido al COW y el contador de referencias de la pgina es mayor que 1. j) Se produce un fallo debido al COW y el contador de Y es igual a 1. 5.33. Supngase un programa que proyecta un fichero de forma privada y que, luego, crea un proceso mediante fork y este proceso hijo, a su vez, crea un thread. Analice, de manera independiente, qu ocurrira en las siguientes situaciones: a) El thread modifica una determinada posicin de memoria asociada al fichero proyectado, luego la modifica el proceso hijo y, por ltimo, el padre. b) El thread elimina la proyeccin del fichero y, acto seguido, intentan acceder a esa regin el proceso hijo y el padre. 5.34. Sea un sistema con memoria virtual, en el que las direcciones lgicas que tienen un 0 en el bit de mayor peso son de usuario y las

359

que tienen un 1 son de sistema. Considrese que el sistema operativo no tiene ningn error de programacin y que se produce un fallo de pgina tal que la direccin que lo provoca no pertenece a ninguna regin del proceso. Dependiendo de en qu modo se ejecutaba el proceso cuando ocurri el fallo y del tipo de la direccin de fallo, se dan los siguientes casos, cada uno de los cuales se deber analizar para ver si es posible esa situacin y, en caso afirmativo, explicar qu tratamiento requiere analizando si influye en el mismo el valor del puntero de pila en el momento del fallo: a) El proceso se estaba ejecutando en modo usuario y la direccin de fallo comienza con un 0. b) El proceso se estaba ejecutando en modo usuario y la direccin de fallo comienza con un 1. c) El proceso se estaba ejecutando en modo sistema y la direccin de fallo comienza con un 0. Distinga entre el caso de que el fallo se produzca durante una llamada al sistema o en una rutina de interrupcin. d) El proceso se estaba ejecutando en modo sistema y la direccin de fallo comienza con un 1. Distinga entre el caso de que el fallo se produzca durante una llamada al sistema o en una rutina de interrupcin. 5.35. Qu acciones sobre la TLB, la memoria cach y la tabla de pginas se realizan durante un cambio de contexto? Suponga distintos tipos de hardware de gestin de memoria. 5.36. En un sistema con preasignacin de swap se implantan dos cuotas mximas de uso de recursos por parte de un proceso: el tamao mximo del mapa del proceso y el consumo mximo del espacio de swap por el proceso. Analice razonadamente si en las siguientes operaciones es necesario comprobar alguna de estas cuotas: a) Rutina de tratamiento del fallo de pgina. b) Proyeccin compartida de un fichero. c) Proyeccin privada de un fichero. d) Proyeccin privada de tipo annima. e) Llamada al sistema fork. f) Rutina de tratamiento del COW.

360

Sistemas operativos. Una visin aplicada cundo perjudicial y por qu motivo, en caso de que pueda serlo. 5.38. Responda a la misma cuestin sobre la tcnica COW. 5.39. Durante el arranque, Linux almacena en un marco una pgina de slo lectura llena de ceros, que se mantendr as todo el tiempo, y que se usa para implementar una tcnica perezosa en la gestin de pginas de una regin annima. Explique cmo sera esta tcnica mostrando en qu situaciones puede ser beneficiosa y en cules perjudicial, si es que puede serlo.

g) Habra que comprobar alguna de estas cuotas en la gestin del heap? En caso afirmativo, en qu rutina del sistema operativo? h) Habra que comprobar alguna de estas cuotas en la gestin de la pila? En caso afirmativo, en qu rutina del sistema operativo? 5.37. Una tcnica perezosa en la gestin de memoria es la paginacin por demanda. Suponiendo que existe suficiente memoria fsica, explique cundo es beneficiosa, en cuanto a una ejecucin ms eficiente del proceso si se compara con la solucin no perezosa, y

You might also like