Descargar

Qué es la memoria cache en un procesador (página 2)

Enviado por edinson orozco aponte


Partes: 1, 2

Desde la aparición en el mercado de procesadores con frecuencia de reloj de 25 o incluso 33 MHz o mas, una memoria de trabajo constituida por RAM dinámica ya no esta preparada para satisfacer las exigencias de la CPU en términos de tiempo de acceso.Con esas frecuencias, el procesador se ve forzado a aguardar continuamente hasta que la memoria de trabajo reaccione, lo cual conlleva que su capacidad operativa no sea aprovechada al máximo.En principio, la memoria de trabajo debería poder ser sustituida completamente por componentes estáticos de RAM que permitiesen intervalos de acceso bastante más breves.Pero esto seria demasiado caro. Por eso, en los casos en relación a equipos 386 y 486 de altas frecuencias, se ha recurrido a un método que ya se utilizaba en las gigantescas computadoras de los años setenta: la instalación de una RAM cache externa. "Externa" quiere decir, en este contexto, que se sitúa fuera de la CPU, en su entorno y unida a ella por el sistema bus.En los 486, la memoria caché, que estamos describiendo recibe también el nombre de "caché, de segundo nivel", se ubica físicamente sobre la placa madre y consta de una serie de componentes est ticos de RAM con una capacidad de 64 o 256 kilobits. Así pues, con este procedimiento pueden obtenerse cachés de 64 o 256 kilobytes, tamaño bastante inferior al de la memoria de trabajo. La vigilancia de la memoria caché corre a cargo del controlador caché 82385 de Intel. 

 El funcionamiento de la RAM cache

edu.red

 La RAM caché está, pues, situada entre la CPU y la memoria de trabajo y opera a modo de memoria intermedia. Dado que las computadoras compatibles IBM procesan las instrucciones de forma secuencial (por orden de llegada), los mejores programas son los escritos partiendo del "principio de localidad". Este principio determina que al ponerse en marcha el programa se utilicen partes de memoria de un sector inmediato, ubicadas en serie y lo más cerca posible unas de otras. Los saltos a zonas de la memoria más alejadas ("far jumps") son poco frecuentes.Para activar un bucle de programación que vaya a ejecutarse con asiduidad, debe extraerse de la memoria una y otra vez la misma instrucción. La memoria caché funciona de forma que ante una solicitud de la CPU, el fragmento de la memoria a leer y el que le sigue han de ser cargados primero en la memoria caché y luego enviados a la CPU. Cualquier usuario que conozca las bases técnicas de la programación sabe que la próxima solicitud de la CPU hará  referencia al mismo sector de la memoria o a uno vecino del anteriormente consultado. Así, con este método al memoria caché puede satisfacer, en la mayoría absoluta de los casos, las consultas formuladas. Si no dispusiéramos de ella, la memoria de trabajo tendría, una vez mas, que pasar a la acción.El procedimiento descrito optimiza, asimismo, los accesos del procesador a la memoria de trabajo. El aprovechamiento de la operatividad de los procesadores de alto rendimiento depende, así, de la capacidad que tenga la memoria caché de satisfacer a la CPU. Frente a un fallo de la caché la CPU se ve obligada a recurrir a la relativamente mas lenta memoria de trabajo. Los fabricantes de placas madre utilizan estrategias de caché muy diversas. Las diferencias residen en la manera de almacenar y localizar los datos y los usos que se le dan al contenido de esta memoria.También los procesos de reproducción, es decir, los principios que rigen el modo de copiar la memoria de trabajo sobre la caché, pueden diferir unos de otros. Las dimensiones de la memoria caché son igualmente importantes, pero no vamos a recrearnos aquí ¡sobre las peculiaridades que distinguen a un principio de reproducción asociativo total de uno parcial.En resumen puede decirse que las placas con una frecuencia idéntica pero con o sin caché, externa son tan diferentes como la noche del día. Solo mediante una RAM caché puede aprovecharse de forma real toda la capacidad de un procesador. Incluso en las placas 386SX las diferencias mencionadas se hacen palpables.Respecto a las dimensiones de la memoria caché, cabe señalar que una computadora con el DOS tiene mas que suficiente con 64 Kb (es el tamaño ideal). Comparaciones efectuadas revelaron que, por ejemplo, un 486 que opere bajo el DOS se vera alentizado en proporción a las dimensiones de la caché instalada. El rendimiento del mismo, tras la ampliación de una memoria caché de 64 a 256 kilobytes se redujo en un 10% aproximadamente. Bajo el OS/2, en cambio, se constató un claro aumento de la capacidad operativa.

Memoria CACHE

§1  Sinopsis

Aunque de origen inglés [4], la palabra cache ha tomado carta de naturaleza en Español (no se si los académicos se habrán enterado de ello, por si acaso, la españolizamos añadiéndole un acento).  Utilizada en informática significa memoria temporal; generalmente de existencia oculta y automática para el usuario, que proporciona acceso rápido a los datos de uso más frecuente o previsible.  Por ejemplo, el "Caché" de disco edu.redes un área de memoria donde el Sistema transfiere los datos que supuestamente serán accedidos de inmediato.  Si leemos un "cluster" [1] el sistema puede disponer en esta memoria "cache" los clusters que siguen en la estructura lógica, de forma que, si seguimos efectuando lecturas, lo más probable es que los próximos datos estén ya en memoria y puedan ser accedidos de forma inmediata [2].

La utilización de este tipo de memorias no es sino la generalización de un principio de uso común en la vida diaria; poner más a mano las cosas de uso más frecuente.  Se basa en dos suposiciones que generalmente resultan ciertas:

  • Los ordenadores tienden a utilizar las mismas instrucciones y (en menor medida), los mismos datos repetidamente.

  • La información necesitada se encuentra almacenada de forma adyacente, o cuando menos muy cercana, en memoria o disco.

§2  Tipos de cache

Desde el punto de vista del hardware, existen dos tipos de memoria cache; interna y externa.  La primera, denominada también cache primaria, caché de nivel 1 o simplemente caché L1 (Level one) edu.redLa segunda se conoce también como cache secundaria, cache de nivel 2 o cache L2 edu.red

Desde el punto de vista funcional, existen cachés específicas de algunos dispositivos, por ejemplo, de disco. También se distingue entre caché de lectura y de escritura.

§2.1  Caché interna

Es una innovación relativamente reciente [3]; en realidad son dos, cada una con una misión específica:  Una para datos y otra para instrucciones.  Están incluidas en el procesador junto con su circuitería de control, lo que significa tres cosas:  comparativamente es muy cara; extremadamente rápida, y limitada en tamaño (en cada una de las cachés internas, los 386 tenían 8 KB; el 486 DX4 16 KB, y los primeros Pentium 8 KB).  Como puede suponerse, su velocidad de acceso es comparable a la de los registros, es decir, centenares de veces más rápida que la RAM.

§2.2  Caché externa

Es más antigua que la interna, dado que hasta fecha "relativamente" reciente estas últimas eran impracticables.   Es una memoria de acceso rápido incluida en la placa base, que dispone de su propio bus y controlador independiente que intercepta las llamadas a memoria antes que sean enviadas a la RAM ( H2.2  Buses locales).

La caché externa típica es un banco SRAM ("Static Random Access Memory") de entre 128 y 256 KB. Esta memoria es considerablemente más rápida que la DRAM ("Dynamic Random Access Memory") convencional, aunque también mucho más cara [5] (tenga en cuenta que un aumento de tamaño sobre los valores anteriores no incrementa proporcionalmente la eficacia de la memoria caché).  Actualmente (2004) la tendencia es incluir esta caché en el procesador.  Los tamaños típicos oscilan entre 256 KB y 1 MB. 

Nota:  En 1997, con la introducción del procesador Pentium II, Intel abandonó el denominado zócalo 7 utilizado hasta entonces en sus procesadores, en favor del denominado Slot-1.  La razón argüida era precisamente la inclusión de la caché L2 en la cápsula del procesador.

§3  Caché de disco

Además de las anteriores, que son de propósito general, existe una caché de funcionalidad específica que se aloja en memoria RAM estándar. Es la caché de disco (nos hemos referido a ella en la introducción de este epígrafe), destinada a contener los datos de disco que probablemente sean necesitados en un futuro próximo y los que deben ser escritos.  Si la información requerida está en chaché, se ahorra un acceso a disco, lo que es centenares de veces más rápido (recuerde que los tiempos de acceso a RAM se miden en nanosegundos y los de disco en milisegundos edu.redE1.7.1  Unidades de medida).

Nota:  Existe un mecanismo parecido al de caché de disco que aquí se describe pero que funciona en sentido inverso.  Es decir, aloja en disco los datos que no pueden ser almacenados en la memoria RAM.  Es el sistema de memoria virtual, al que nos referiremos al tratar de la memoria.

El funcionamiento de la caché de disco se basa en dos esquemas de operación.  La lectura adelantada ("Read-ahead") y la escritura retrasada ("Write-behind").  La primera consiste en anticipar lo que se necesitará de forma inmediata y traerlo a la caché.  Por su parte, la escritura retrasada consiste en mantener los datos en caché hasta que se producen momentos de desocupación del sistema de disco.  En este caso la caché actúa como memoria tampón o "buffer" intermedio, y no se obliga al subsistema a realizar físicamente ninguna escritura, con lo que las cabezas quedan libres para nuevas lecturas.

edu.redPuesto que los cachés de disco de escritura retrasada mantienen los datos en memoria volátil después que "supuestamente" se han escrito en el dispositivo,  una caída accidental del sistema, por fallo de energía o apagado intempestivo, puede producir pérdidas de los datos alojados en la caché en ese momento (es esta una de las razones por las que los sistemas Windows y Linux exigen un proceso especial de apagado, que a veces tarda unos segundos, en los que observamos una intensa actividad del sistema de disco).

Nota:  La mayoría de los lenguajes disponen de métodos para forzar una escritura "real" de los datos vaciando la caché de disco; suelen ser sentencias del tipo commit, flush etc.  Es una práctica de seguridad aconsejable, y señal de programación cuidadosa, realizar un vaciado de "buffers" después de cada transacción importante siempre que las circunstancias lo permitan edu.red

§3.1  Caché de disco en MS DOS y  Windows

La cache de los sistemas MS DOS y de los primeros sistemas Windows se denominaba SmartDrive.  Por su parte, los nuevos Sistemas de 32 bits disponen de un controlador virtual denominado VCACHE que utiliza un esquema de funcionamiento de lectura adelantada y escritura atrasada edu.redpara proporcionar servicios de cache a las máquinas virtuales (E0.2).

VCACHE tiene la ventaja cachear ficheros en discos de red, y de permitir cambiar en tiempo de ejecución la cantidad de memoria destinada a este menester.  Cuando la actividad del disco es elevada pero la ocupación de memoria es baja, VCACHE incrementa su tamaño para realizar la mayor cantidad de operación en RAM, evitando de este modo accesos a disco.  Por ejemplo, si la aplicación abre un fichero para lectura/escritura, es posible que VCACHE vuelque la totalidad del fichero a memoria; posteriormente, quizás cuando se cierre el fichero, la imagen de memoria sea volcada de nuevo al disco.  Si por el contrario la actividad de disco es pequeña y la ocupación de memoria es alta, VCACHE disminuye su propio tamaño con objeto de aumentar la RAM disponible para las aplicaciones.

§3.2  Vaciado de buffers en C++

En la terminología C++ los flujos que son cacheados se denominan "buffered".  A este respecto, los compiladores C/C++ disponen de su propio sistema de caché para ficheros de disco.  Esta caché se denomina de ejecución (runtime), para distinguirla de la caché del Sistema.  Así mismo, disponen de recursos en la Librería Estándar para forzar su vaciado en caso necesario; para esto se recurre a la funciones fflush (para ficheros abiertos con fopen) y flush (para los flujos de salida, "ostreams").

Sin embargo, no olvide que el vaciado de la caché del compilador se realiza sobre la del Sistema, que está por debajo (recuerde que el Software tiene una estructura de capas edu.redE1.7w1), y que el SO decide por su cuenta cuando es el momento oportuno para realizar físicamente la escritura de los discos.  Esto significa que una seguridad total solo se alcanza forzando la escritura de la caché del Sistema, y esto naturalmente depende de la plataforma utilizada.

Nota:  Además de las posibilidades ofrecidas en la Librería Estándar, el compilador MS Visual C++ para Windows ofrece la función _flushall, que fuerza el vaciado de la caché de ejecución de todos los ficheros abiertos.  También dispone de la librería COMMODE.OBJ, que enlazada con la aplicación, fuerza que las llamadas a fflush y a _flushall escriban directamente los buffers al disco en vez de a la caché del Sistema.

El siguiente ejemplo muestra algunas formas de vaciado de los buffers del compilador y de la caché del Sistema

L.5 abre el fichero Fichero1 para lectura y escritura.

La llamada a fflush en L.6 fuerza al programa a vaciar al SO la caché de ejecución asociados al fichero1.

La llamada a _commit en L.7 obliga al cache de disco del Sistema vaciar sus buffers.

L.11 se instancia un objeto Fichero2 de la plantilla basic_ofstream, para realizar escritura.

La línea L.12 invoca el método flush para dicho objeto.  Esta invocación fuerza al programa a vaciar al SO los buffers de ejecución asociados con Fichero2.

La invocación a _commit en L.13 obliga al caché de disco del Sistema a vaciar los buffers al disco.   Esta función requiere un manejador "handle" referido al fichero; en este caso, el manejador se obtiene mediante una invocación al método rdbuf.  ofstream.rdbuf()->fd().

Nota:   _commit es una función de MS Visual C++ que obliga al Sistema a vaciar los buffers de un fichero determinado.  No es estándar C++ y solo funciona en Sistemas MS de 16 bits.   En los de 32 bits se recurre a la librería Commode.obj según se ha indicado edu.red

§4  Rendimiento de la caché

El funcionamiento de la caché de lectura se parece al de un adivino; debe anticipar lo que ocurrirá en el futuro.   Si el dispositivo que está siendo cacheado encuentra los datos en la caché, habrá un éxito ("hit"), en caso contrario, un fracaso ("miss").  Los sistemas de caché actuales son capaces de proporcionar una tasa de éxitos superior al 90%.

Como puede figurarse el lector, construir un mecanismo de caché no es una tarea baladí.  Se requieren esquemas de funcionamiento que atiendan de forma simultanea y balanceada diversos factores:

  • Discriminar que información debe ser almacenada y cual descartada.

  • Decidir la organización interna de este almacenamiento.

  • Manejar las peticiones de lectura.  Esto exige disponer de un mecanismo de intercepción de las peticiones del dispositivo que está siendo cacheado.

  • Manejar las peticiones de escritura.  Interceptar las peticiones de escritura del dispositivo a cachear.

§5  Caché oportunista

Existe un tipo especial que podríamos considerar "de aplicación", denominada caché oportunista ("Opportunistic cache").  Está relacionada con los problemas de bloqueos de ficheros en entornos multiusuario en los que distintas aplicaciones pueden acceder a los mismos datos.

En estos casos, los Sistemas Operativos disponen de mecanismos para que un usuario (programa de aplicación) obtenga el bloqueo de todo un fichero o parte de él.  La teoría es que mientras se mantenga el bloqueo, ningún otro usuario puede modificar el fichero (tal vez si leerlo), y que una vez finalizadas las modificaciones, el usuario desbloquea el fichero para que otros puedan utilizarlo.  Sin embargo, en determinadas aplicaciones de red, y con objeto de aumentar el rendimiento, se utiliza un sistema mixto denominado bloqueo oportunista oplock ("Opportunistic locking"), en el que el usuario comunica al Sistema que utilizará esta modalidad [6].  Para ello, obtiene una copia de la totalidad del fichero, que almacena un una caché local oportunista.  De esta forma, las operaciones son más rápidas que si tiene que realizarse a través de la red las peticiones de distintos trozos, junto con las correspondientes solicitudes de bloqueo/desbloqueo.  Finalmente, cuando el usuario ha finalizado las operaciones con el fichero, devuelve al servidor una copia actualizada.

El problema se presenta cuando, en el intermedio, otro usuario solicita utilizar el mismo fichero.  La incidencia es especialmente frecuente cuando el fichero a manejar es muy grande.  Porque entonces, incluso para una pequeña modificación, el primer usuario puede demorarse bastante en devolver la versión modificada al servidor.  La solución adoptada para evitar demoras excesivas, consiste en que, al recibir la petición del segundo usuario, el Sistema envía al primero una orden de interrumpir el oplock y devolver el fichero tal como está en ese momento para que el segundo usuario pueda utilizarlo.

Aunque no exento de problemas, especialmente en redes poco fiables, el sistema permite aumentos del rendimiento del orden del 30%. No tanto por el sistema de bloqueo utilizado, como por el hecho de que los datos hayan sido previamente cacheados por el usuario.

[1]  También denominado "Allocation Unit" o unidad de asignación en Español.  Es el conjunto de sectores de disco que son tratados por el sistema como una sola unidad de almacenamiento.  Su tamaño (número de sectores de disco) depende del SO y del tamaño de la partición lógica (MS DOS y Windows utilizan un cluster de 1 sector en los disquetes de 3.5").  Un "Cluster" puede estar ocupado o disponible, pero no parcialmente ocupado.  El Sistema de Archivo de un Sistema Operativo es precisamente una forma de controlar, asignar, desasignar y acceder clusters para alojar ficheros en disco."Cluster" tiene también otra acepción en inglés:  Designar un almacenamiento redundante de datos en sistemas distintos. 

Hasta hace pocos años, en que la tecnología de discos ha producido unidades extremadamente silenciosas, a un oído experimentado le bastaba escuchar la "música" de los servos para saber si el sistema de "cache" de disco estaba instalado o no.

[3]  Introducida con el Intel 386 SLC que tenía una cache interna para instrucciones y datos, mientras que en los Pentinum® instrucciones y datos disponen de cachés separadas.

[4]  Bueno, eso es lo que yo creía porque aprendí la palabreja de textos ingleses, pero D. Julián Cirielli, desde Bs. As. Argentina, me aclara amablemente que en realidad, la palabra proviene del francés, y significa escondite/escondida.  He preferido mantener intacta mi errónea redacción anterior e incluir aquí la corrección junto con mi agradecimiento.

[5]  El motivo es la propia construcción de la memoria estática, constituida por conjuntos de seis transistores por cada bit almacenado, lo que las hace mucho más voluminosas (y caras) que las memorias dinámicas de capacidad comparable; estas últimas están consituidas por un conjunto de 1 transistor y un condensador por cada bit.  La descarga del condensador es lo que hace que requieran una actualización (refresco) cada 15 &µs (microsegundos) aproximadamente, lo que añade una dificultad adicional, pues durante la actualización el sistema queda paralizado (en el bus hay una línea específica, DACK-0, para indicar que se está produciendo este refresco de la memoria dinámica edu.redH2).

Actualmente (2001), las SRAM tienen tiempos de acceso del orden de 2 a 15 ns (nanosegundos), mientras que en las DRAM es del orden de 60 ns.

[6]  Por ejemplo, Samba el popular sistema Linux para compartir recursos sobre redes TCP/IP, puede utilizar este tipo de caché oportunista con sus clientes.

 

 

 

Autor:

Edinson Orozco Aponte

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente