sábado, 2 de junio de 2012

4.2 Carga de programas y reubicación


Las tablas de páginas o segmentos proporcionan reubicación dinámica a nivel de
página o de segmento. En paginación, el cargador busca marcos de página libres en
memoria, carga las páginas del programa, crea la tabla de páginas con lacorrespondencia y carga su dirección en el PTBR. En segmentación el proceso es
similar, salvo que requiere la asignación de huecos adecuados al tamaño de cada
segmento del programa, así como la colaboración del compilador y el montador para
establecer los tamaños.

4.3 Gestión


La traducción de direcciones, un mecanismo complejo y crítico para el rendimiento,
ha de gestionarse a nivel hardware, genéricamente por una unidad de gestión de
memoria (MMU).
La memoria libre en segmentación se gestiona bajo los criterios de las particiones de
tamaño variable, mientras que en paginación es adecuado un mapa de bits.
La paginación presenta fragmentación interna en las páginas. Esto no ocurre en la
segmentación, si bien ahora aparece fragmentación externa al utilizar unidades de
ubicación de tamaños diferentes. Ya que el tamaño de los segmentos es típicamente
mayor que el de las páginas, el problema de la fragmentación en la segmentación es
más importante.
El mismo mecanismo permite que los programas compartan páginas o, más
propiamente, segmentos. Por ejemplo, una única copia de código puede compartirse
por varios programas simplemente haciendo que las entradas correspondientes alsegmento de código en sus tablas de segmentos (o el conjunto de entradas de sus
tablas de páginas, en paginación) coincidan. Los bits de sólo lectura estarán activados, para evitar que un programa pueda corromper el código.



4.4 Sistemas combinados


Para evitar el problema de la fragmentación externa en segmentación pura, y para
evitar el tener cargada una tabla de páginas demasiado grande en paginación,
aparecen sistemas que combinan paginación y segmentación. Se denominan sistemas
de segmentación paginada (o segmentado-paginados) o de paginación segmentada
(o paginado-segmentados), según se entienda que los segmentos se dividen en
páginas o que la tabla de páginas se segmenta en varias, respectivamente4. La
dirección lógica se divide en tres partes: número de segmento, de página y
desplazamiento dentro de la página. El número de segmento identifica en la tabla de
segmentos la dirección base de una tabla de páginas, que se direcciona mediante el
número de página para obtener el marco de página en memoria, según se ilustra en
la Figura 4.5. El cálculo de la dirección lógica es ahora más complejo y lento,requiriendo dos indirecciones. El soporte hardware para traducción (TLB) es ahora
aún más importante.
Son también habituales los sistemas doblemente paginados (con dos niveles de
paginación), que siguen un esquema parecido. Generalizando, se pueden concebir
sistemas que dividen la dirección virtual en más de tres partes, especificando
diferentes niveles de paginación y/o segmentación5.

5 Enlace dinámico


La necesidad de ejecutar programas de tamaño mayor que la memoria física
disponible ha originado a lo largo de la historia la introducción de sofisticados
mecanismos de gestión de la ubicación de programas en memoria. Un primer
enfoque es el de dividir en programa en varios módulos, denominados overlays o
solapamientos, a partir de su estructura y cargar dinámicamente sólo aquellos que se
necesiten. La carga de un solapamiento la realiza una rutina de enlace, que se
encarga también de seleccionar el(los) solapamiento(s) reemplazado(s), si se requiere
espacio para la carga. Tradicionalmente, el programador determinaba qué rutinas
constituían los solapamientos, construía la rutina de enlace y las tablas de rutinas de
los solapamientos, y elaboraba el programa de forma que las llamadas a las rutinas
de los solapamientos se llamasen a través de la rutina de enlace. También eran suyos
los criterios de reemplazo de los solapamientos.
El enfoque alternativo al problema es la memoria virtual, más general y
completamente transparente al programador, al que dedicaremos la siguiente
Sección.
Sin embargo, una evolución de los overlays ha quedado en los sistemas de hoy en día
para cubrir un objetivo diferente del originalmente asignado a aquellos: las rutinas
de enlace dinámico6.
Una librería de enlace dinámico es un conjunto de rutinas agrupadas en módulos que
se cargan dinámicamente en el momento de la llamada, como ocurría en los overlays,
pero de forma transparente al programa. El sistema operativo proporciona como
soporte una llamada al sistema donde se especifica como parámetro la rutina de
enlace dinámico a ejecutar. Cuando en un programa aparece una llamada a una
rutina de este tipo, el montador, en vez de enlazar estáticamente a la rutina en el
código ejecutable, enlaza a la llamada al sistema. Cuando esta llamada al sistema seejecuta, comprueba si el módulo que contiene la rutina especificada como parámetro
está cargado en memoria. Si no lo está, lo carga y establece la referencia (indirecta)
desde el programa. A esto se le llama montaje dinámico o en tiempo de ejecución.
Se requiere una tabla que especifique el estado de cada módulo de enlace dinámico
(cargado o no) y la dirección de memoria donde se carga. En principio, hay que
destinar un espacio de memoria específico para los módulos de enlace dinámico, y
proporcionar una política de reemplazo, pero cuando se combina con memoria
virtual, que es lo habitual hoy en día, el reemplazo se realiza página a página de
forma integrada en el propio mecanismo de memoria virtual.
Aunque esta técnica se podría utilizar con el mismo objetivo de los overlays,
actualmente, ya que todos los sistemas tienen soporte de memoria virtual, el enlace
dinámico se utiliza por otros motivos:
· Los ficheros ejecutables de los programas almacenados en disco son más
pequeños. Esto tiene cierta importancia si se tiene en cuenta que hoy en día los
programas hacen un amplio uso de rutinas que consumen un gran volumen
de espacio, como por ejemplo las rutinas de tratamiento gráfico.
· Las rutinas de enlace dinámico cargadas en memoria se comparten por varios
programas, lo que permite ahorrar espacio también en memoria.
· El tiempo de carga de los programas, y por lo tanto su latencia, es menor.
· Facilita la actualización de las aplicaciones. La instalación de una nueva
aplicación aporta nuevas versiones de las librerías de enlace dinámico (por
ejemplo, rutinas de tratamiento gráfico más elaborado) que sustituyen a las
versiones antiguas, de lo que se benefician otras aplicaciones que usan dichas
rutinas

lunes, 28 de mayo de 2012

6 Memoria virtual

La memoria virtual es el mecanismo más general para la ejecución de programas no 
enteros en memoria. Se basa en un sistema de paginación (o combinado) en el que 
sólo un subconjunto de las páginas del programa están cargadas en memoria. El 
resto reside en un dispositivo de almacenamiento secundario, análogamente al de 
swap7
. La memoria virtual presenta, adicionalmente a su  capacidad para ejecutar 
programas mayores que la memoria física disponible, un conjunto de interesantes 
ventajas con respecto a la paginación con programas enteros: 
• Reduce la latencia en la ejecución de los programas, al no tener éstos que 
cargarse completamente para comenzar a ejecutarse. 
• Permite gestionar más eficientemente la memoria física. Cualquier espacio 
libre, incluso una única página, puede ser aprovechado para cargar un nuevo 
programa y comenzar a ejecutarlo. Por otra parte, si una página de un 
programa no se referencia durante la ejecución, no habrá que cargarla. 
• Al aumentar el grado de multiprogramación a costa de reducir el número de 
páginas cargadas de cada programa, permite incrementar la eficiencia de la 
CPU en sistemas multiprogramados
8
• Ahora la independencia de los programas con respecto a la máquina es 
completa. Además del direccionamiento virtual que aporta la paginación, la 
cantidad de memoria física disponible para ejecutar el programa sólo es 
relevante para la velocidad de ejecución del programa.  

6.1 Soporte hardware


Además del soporte hardware para la traducción de direcciones de los sistemas
paginados, la memoria virtual requiere mecanismos hardware adicionales:
• Espacio para paginación en un dispositivo de almacenamiento secundario
(disco).
• Bit de validez, V. Para cada entrada de la tabla de páginas es necesario un bit
que indique si la página correspondiente está cargada en memoria o no.
• Trap de fallo de página. Cuando la página referenciada no está cargada en
memoria, el mecanismo de interrupciones produce el  salto a la  rutina de
tratamiento del fallo de página (que promoverá la carga de la página en
memoria). A diferencia de una interrupción normal, el fallo de página puede
ocurrir en cualquier referencia a memoria durante la ejecución de la
instrucción, por lo que la arquitectura debe proporcionar los mecanismos
adecuados para establecer un estado del procesador consistente antes de saltar
a la rutina de tratamiento.
• Información adicional para la gestión del fallo de  página (bit de página
modificada, referenciada, …). Se verá más adelante.

6.2 Carga de programas y reubicación


El cargador carga la tabla de páginas del programa  y una o más páginas,
estableciendo las direcciones de las páginas cargadas en las entradas de la tabla de
páginas y los valores de los bits de validez. Almacena también las direcciones de
disco donde se encuentran las páginas no cargadas en memoria. Como en
paginación, la reubicación se hace independientemente para cada página, cuando
éstas se cargan tras un fallo de página.
Básicamente, hay dos estrategias para cargar las páginas de un programa:
(a) Cargar sólo la primera página de código y dejar que el resto se cargue por fallo
de página (paginación por demanda).
(b) Cargar un cierto número de páginas o todas, dependiendo de la memoria
disponible y del tamaño del programa (prepaginación).