Jerarquia de Memorias
Todo lo que venimos biendo si no se dieron cuenta son tipos distintos de memorias. A esto queria llegar.
Dado que las memorias de alta velocidad son costosas se usan en tamaños reducidos y las memorias de mas baja velocidad se usan con capacidades mas grandes. de esta forma la totalidad de la informacion se almacena en las memorias lentas, amplias y baratas y la informacion que esta actualmente en uso se almacena en las memorias rapidas, reducidas y caras.
la jerarquia de las memorias va asi:
Cuando es nesesario procesar un dato que se encuentra en el HDD (lo mas bajo) este dato antes de ser procesado por el procesador pasa por todas las memorias asta llegar a los operadores de la ALU si esa es so objetivo. y despues (siempre y cuando se requiera) el resultado psa por todos las memorias de vuelta hasta almacenarce en la secundaria.
En terminos generales, dejendo afuera las ecepciones y el futuro asi como el pasado
Nivel de Memoria Capacidad Tiempo de acceso Tipo de accesoRegistros 64b a 256b 1 a 5 ns palabra
Cache 8kb a 2mb 5 a 20 ns palabra
RAM 16mb a 64gb 60 a 200 ns palabra
HDD 10mb a 1tb 10 a 30 ms sector
b=byte
kb=kilobyte
mb=megabyte
gb=gigabyte
tb=terabyte
ns=nanosegundo
ms=microsegundo
Migracion de la informacion
La explotación correcta de la jerarquía de memoria exige tener, en cada momento, la información adecuada en el nivel adecuado. Para ello, la información ha de moverse de nivel, esto es, ha de migrar de un nivel a otro. Esta migración puede ser bajo demanda explícita o puede ser automática.
La primera alternativa exige que el programa solicite explícitamente el
movimiento de la información, como ocurre, por ejemplo, con un pro rama editor, que va solicitando la parte del archivo que está editando en cada momento el usuario.
La segunda alternativa consiste en hacer la migración transparente al programa, es decir, sin que este
tenga que ser consciente de que se produce. La migración automática se utiliza en las memorias cache y en la memoria virtual, mientras que la migración bajo demanda se utiliza en los otros niveles.
Sean K y K + 1 dos niveles consecutivos de la jerarquía, siendo K el nivel mas rápido. La existencia de una migración automática de información permite que el programa referencia la información en el nivel K y que, en el caso de que no exista una copia adecuada de esa información en dicho nivel K, se traiga esta desde el nivel K + 1 sin que el programa tenga que
hacer nada para ello.
El funcionamiento correcto de la migración automática exige un mecanismo que consiga tener en el nivel K aquella información que necesita el programa en ejecución en cada instante.
Idealmente, el mecanismo debería predecir la información que éste necesite para tenerla disponible en el nivel rápido K. El mecanismo se basa en los siguientes aspectos:
• Tamaño de los bloques transferidos.
• Política de extracción.
• Política de reemplazo.
• Política de ubicación.
Por razones de direccionamien
to, y para aprovechar la proximidad
espacial , la migración automática se hace en porciones de información de un tamaño determinado. En concreto, para la memoria cache se transfieren
líneas de unas pocas palabras, mientras que paraa la memoria virtual se transfieren paginas de uno o varios KB. El tamaño de estas porciones e una característica muy importante de la jerarquía de memoria.
La
política de extracción define qué información se sube del nivel K + 1 al K y cuándo se sube. La solución más corriente es la denominada
por demanda y consiste en subir aquella información que referencia el programa, justo cuando la referencia. El éxito de esta política se
basa en la
proximidad espacial , por lo que no se sube exclusivamente la información referenciada sino una porción mayor (línea o página).
El nivel K tiene menor capacidad de almacenamiento que el nivel k + 1, por lo que normalmente está lleno. Por ello, cuando se sube una porción de información hay que eliminar otra.
La política de reemplazo determina qué porción hay que eliminar, atando de seleccionar una que ya no sea de interés para el programa en ejecución.
Por razones constructivas pueden existir limitaciones en cuanto al lugar en el que se pueden almacenar las diversas porciones de información;
la política de ubicación determina dónde almacenar cada porción.
Parámetros característicos de la jerarquía de memoria
La eficiencia de la jerarquía de memoria se mide mediante los dos parámetros siguientes:
• Tasa de aciertos o hit ratio (Hr).
• Tiempo medio de acceso efectivo (Tef).
La
tasa dé aciertos (Hrk) del nivel k de la jerarquía se define como la probabilidad de encontrar en ese nivel la información referenciada. La tasa de fallos Frk es 1 - Hrk. La tasa de aciertos ha de ser alta para que sea rentable el uso del nivel k de la jerarquía. Los factores más importantes que determinan Hrk son los siguientes:
• Tamaño de la porción de información que se transfiere al nivel k.
• Capacidad de almacenamiento del nivel k.
• Política de reemplazo.
• Política de ubicación.
• Programa específico que se esté ejecutando (cada programa tiene un
comportamiento propio).
El tiempo de acceso a una información depende de que se produzca o no un fallo en el nivel k. Denominaremos tiempo de acierto al tiempo de acceso cuando la información se encuentra en nivel k. mientras que denominaremos penalización de fallo al tiempo que se tarda
en realizar migración de la porción cuando se produce fallo.
El tiempo medio de acceso efectivo (Tef) de un programa se obtiene promediando los tiempos de todos los accesos que realiza el programa a largo de su ejecución. Tef depende básicamente de los factores siguientes:
• Tiempo de acierto.
• Penalización de fallo.
• Tasa de aciertos (Hrk) del nivel k.
Coherencia
Un efecto colateral de la jerarquía de memoria es que existen varias copias de determinadas porciones de información en distintos niveles. Al escribir sobre la copia del nivel k, se produce una discrepancia con la copia del nivel k + 1; esta situación se denomina falta de coherencia.
Se dice que una porción de información está sucia si ha sido escrita.
La coherencia de la jerarquía de memoria exige medidas para eliminar la falta de coherencia. En concreto, una porción sucia en el nivel k ha de ser escrita en algún momento al nivel k + 1 para eliminar la falta de coherencia. Con esta operación de escritura se limpia la porción del nivel k.
Existen diversas políticas de actualización de la información creada o modificada, que se caracterizan por el instante en el que se copia la información al nivel permanente.
Direccionamien to
La jerarquía de memoria presenta un problema de direccionamien
to. Supóngase que el programa en ejecución genera la dirección X del dato A al que quiere acceder. Esta dirección X está referida al nivel k + 1, pero se desea acceder al dato A en el nivel k, que es más rápido.
Para ello se necesitara conocer la dirección Y que ocupa A en el nivel k, por lo que será necesario establecer un mecanismo de traducción de direcciones X en sus correspondient
es Y.

El problema de traducción no es trivial, supóngase que el espacio de nivel k + 1 es de 2 GB, lo que equivale a suponer que n = 31, y que el espacio de nivel k es de 8 MB, lo que supone que m = 23. El traductor tiene aproximadament
e dos mil millones de valores de entrada distintos y ocho millones de direcciones finales.
Para simplificar la traducción, y aprovechar la proximidad espacial, se dividen los mapas de direcciones de los espacios k + 1 y k en porciones de tamaño Y. Estas porciones constituyen la unidad de información mínima que se transfiere de un nivel al otro. El que la porción tenga tamaño 2p permite dividir la dirección en dos partes: los m —~ p bits mas
significativos sirven para identificar la porción, mientras que los p bits menos significativos sirven para especificar el byte dentro de la porción.
Suponiendo, para el ejemplo anterior, que las páginas son de 1 KB (p =10), el problema de direccionamien
to queda dividido por 1.024, pero si e siendo inviable plantear la traducción mediante una tabla directa completa, pues sería una tabla de unos dos millones de entradas y con sólo 8.192 salidas no nulas.
La proximidad referencial
La proximidad referencial es la característica que hace viable la jerarquía de memoria, de ahí su importancia. En términos globales, la proximidad referencial establece que un programa en ejecución utiliza en cada momento una pequeña parte de toda la información que usa.
Para exponer el concepto de proximidad referencial de forma más específica, partimos del concepto de traza. La
traza de un programa en ejecución es la lista ordenada en el tiempo de las direcciones de memoria que referencia para llevar a cabo su ejecución. Esta traza R estará compuesta por las direcciones de las instrucciones que se van ejecutando y por las direcciones de los datos empleados, es decir:
Re = re(l), re(2), re(3), ... re(j)
donde re(i) es la i-ésima dirección generada por la ejecución del programa e.
El uso de porciones de 2” facilita la traducción.
División en páginas de los espacios de memoria.Adicionalmente, se define el concepto de distancia d(u, y) entre dos direcciones u y y como diferencia en valor absoluto | u — v|. La distancia entre dos elementos j y k de una traza re es, por tanto,
d(re(j), re(k)) = |re(j) — re(k)|.
También se puede hablar de traza de E/S, refiriéndonos, en este caso, a la secuencia de la direcciones empleadas en operaciones de E/S.
La proximidad referencial presenta dos facetas: la proximidad espacial y la proximidad temporal.
La
proximidad espacial de una traza postula que, dadas dos referencias re(j) y re(i)
próximas en el tiempo (es decir, que i — j sea pequeño), existe una alta probabilidad de que su distancia d(re(j), re(i)) sea muy pequeña. Además, como muchos trozos de programa y muchas estructuras los datos se recorren secuencialmenté, existe una gran probabilidad de que la
referencia siguiente re(j) coincida con la dirección de memoria siguiente
Este tipo especial de proximidad espacial recibe el nombre de
proximidad secuencial.
La proximidad espacial se explica si se tienen en cuenta los siguientes argumentos:
• Los programas son fundamentalmen
te secuénciales, a excepción de las
bifurcaciones, por que su lectura genera referencias consecutivas.
• Adicionalmente, la gran mayoría de los bucles son muy pequeños, de unas pocas instrucciones máquina, por lo que su ejecución genera referencias con distancias pequeñas.

• Las estructuras de datos que se recorren de forma secuencial o con referencias muy próximas son muy frecuentes. Ejemplos son los vectores, las listas, las pilas, las matrices, etc. Además, las zonas de dato suelen estar agrupadas, de manera que las referencias que se generan suelen estar próximas.
La
proximidad temporal postula que un programa en ejecución tiende a referenciar direcciones empleadas en un pasado próximo. Esto es, existe una probabilidad muy alta de que la próxima referencia re( j + 1) este entre las n referencias anteriores:
re( j — n + 1), re(j —n + 2),............, re(j -2), re(j — 1), re (j)
La proximidad temporal se explica si se tienen encuenta los siguientes argumentos:
• Los bucles producen proximidad temporal, además de proximidad espacial.
• El uso de datos o parámetros de forma repetitiva produce proximidad temporal.
• Las llamadas repetidas a subrutinas también son muy frecuentes y producen proximidad temporal. Esto es muy tipico con las funciones o subrutinas aritméticas, de conversión de códigos, etc.
En la práctica, esto significa que las referencias producidas por la ejecución de un programa están agrupadas en unas pocas zonas. Puede
observarse también que, a medida que avanza la ejecución del programa, van cambiando las zonas referenciadas.
El objetivo principal de la gestión de la jerarquía de memoria será conseguir que residan en las memorias más rápidas aquellas zonas de los programas que están siendo referenciadas en cada instante.
buena parte de este post esta sacado de "Sistemas Operativos una vision aplicada"