Memoria Interna
La memoria interna de un computador tiene tan amplia diversidad que provoca un poco extenso estudiarla.
No existe un tipo de memoria óptima para un computador, por lo cual hay que utilizar varias clases en una misma máquina en busca de la combinación lo mas aceptable posible teniendo en cuenta principalmente 3 parámetros:
Velocidad de acceso.
Capacidad.
Costo.
En esta pirámide podemos observar lo siguiente: cuanto mas arriba de la pirámide, mas cerca (físicamente) del procesador nos encontramos. Cuanto mas arriba, mayor el costo, cuanto mas arriba menor la capacidad y cuanto mas arriba menor el tiempo de acceso.
Entonces, tenemos que armar una jerarquía dentro de la máquina con varios de estos tipos de memoria, tratando de lograr que el costo se asemeje a los costos de las memorias de los niveles inferiores, el tiempo de acceso se asemeje a los tiempos de las memorias de los niveles superiores y las capacidades se asemejen a las de los niveles inferiores.
Esto se logra utilizando una jerarquía de memorias.
Antes de abordar las técnicas de comunicación entre los distintos tipos de memorias, debemos saber un poco mas de sus características y clasificarlas según ellas.
Memorias internas y externas.
Cuando hablamos de memoria interna nos referimos generalmente a la memoria principal, pero no debemos olvidar que existen otras, el procesador necesita su memoria propia (registros del procesador) y la unidad de control puede llegar a necesitar memoria propia.
Cundo decimos memoria externa, nos vamos a estar refiriendo a dispositivos periféricos a los cuales se accede a través de algún controlador de E/S (discos rígidos, lectoras de CD/DVD, pen-drivers, cintas, etc).
Capacidad:
Las memorias internas son las mas pequeñas y se miden en bytes o palabras, siendo las longitudes mas comunes para las palabras las de 8, 16 y 32 bits, las memorias externas son mayores y se suelen medir en términos de bytes(Kbyte, Mbytes, Tbytes, etc).
Unidad de transferencia:
En general la unidad de transferencia es igual al numero de lineas de entrada/salida de datos que posee el modulo de memoria, en general coincide a la longitud de palabra del modulo de memoria, por lo general.
Vamos a aclarar 2 términos usados comúnmente para que se aclare un poco el tema.
Palabra: Es la unidad natural en que esta organizada la memoria, suele coincidir con con el numero de bits utilizados para representar los números y con la longitud de las instrucciones, pero como siempre hay excepciones.
Unidades direccionables: En muchos sistemas la unidad direccionable es la palabra, pero en algunos casos se puede direccionar de a nivel de byte, y no nos olvidemos que las unidades direccionables están directamente relacionadas con la anchura del bus de direcciones.
Entonces finalizando este punto, la unidad de transferencia es la cantidad de bits que se pueden lee o escribirá la vez y comúnmente coincide con la unidad de palabra o con la unidad direccionable.
Para l memoria externa la unidades son mas grandes y se las llaman bloques.
Métodos de acceso:
Esta otra clarificación que podemos hacer varía según al la forma de acceder al dato.
Acceso secuencial: Los datos se organizan en unidades llamadas registros, el acceso se logra mediante un acceso lineal especifico. Además de los datos se agrega información que permite distinguir donde comienza un registro y comienza otro y permite la escritura/lectura de los datos. La forma de acceder como su nombre lo indica es secuencial, teniendo que pasar por todos los registros intermedios, anteriores al que deseamos acceder, hasta llegar al registro deseado. El tiempo de acceso es variable dependiendo de la ubicación del registro deseado.
Un ejemplo de este tipo de acceso son las cintas magnéticas.
Acceso directo: Cada unidad de información en que esta dividida la unidad tiene una dirección única basada en su ubicación física. El acceso es directo, pero no al dato especifico, sino a toda la vecindad, luego dentro de la vecindad se hace un acceso secuencial contando o esperando alcanzar la posición final. El tiempo de acceso es variable.
Un ejemplo de esto son los discos magnéticos.
Acceso aleatorio: Cada posición de memoria direccionable tiene una acceso directo para acceder, cableado físicamente. El tiempo de acceso a cada posición es constante y no depende de accesos anteriores.Un ejemplo de este tipo de acceso es la memoria principal y algunos sistemas de cache.
Acceso asociativo: Se compara una parte de la dirección a buscar contra una parte de las palabras almacenadas en este tipo de memoria, dichas palabras además de los datos contienen información para identificar a que posición corresponden. La comparación se hace en paralelo con todas las palabras almacenadas en la memoria. Cada palabra de memoria tiene una acceso directo para acceder, cableado físicamente. El tiempo de acceso es constante y no depende de accesos anteriores.Un ejemplo de este tipo de acceso son algunos sistemas de cache.
Este es un Pentium Pro a 200 Mhz. El Pentium Pro fue el primer procesador de intel diseñado específicamente para entornos de servidor. Para este cometido implementaron junto al Pentium MMX otro chip que era la memoria caché (256Kb), de ahí que tenga dos chips en un solo procesador.
El chip de la izquierda es el procesador mientras que el de la derecha es una memoria caché (se denota por lo regular de la superficie).
Muy buena imagen tomada de http://karman.homelinux.net, muchas gracias.
Tiempo de acceso: es el tiempo en que se tarda en la operación de lectura o escritura. En memorias de acceso de acceso aleatorio es el tiempo entre que se pone la dirección en el bus y el momento en que el dato ha sido guardado (escritura) o el dato se encuentra disponible (lectura). Para memorias de otro tipo de acceso, el tiempo de acceso es el tiempo que se tarda en ubicar el mecanismo de lectura/escritura en la posición deseada.
Tiempo de ciclo de memoria: Es el tiempo necesario que se requiere para realizar la segunda lectura luego de haber realizado la primera. Generalmente este termino se usa con las memorias de tipo aleatorio, y es requerido para que finalizen las transacciones en las lineas de controlo para regenerar los datos si se trata de lecturas destructivas.
Velocidad de transferencia: Es la velocidad a la cual se pueden transmitir datos desde o hacia memoria, para memorias de tiempo aleatorio esto equivale a la inversa del tiempo de ciclo, para los otros tipos de memoria se utiliza la siguiente relación:
Estas 3 ultimas características de la memoria son las mas importantes desde el punto de vista del usuario junto a la capacidad.
Jerarquía de memoria:
El tema clave de toda la organización de los distintos tipos de memoria esta en obtener una disminución de los accesos a las clases mas lentas de memoria.
La motivación principal a este tema es la siguiente: La prioridad de todo el sistema es que la CPU ejecute la mayor cantidad de instrucciones, se debe tratar de que no se detenga para esperar que lleguen las instrucciones y datos desde la memoria.
El procesador es mucho mas rápido que la memoria principal, en este punto para solucionar el tema entra la memoria cache, mas cara, mas pequeña pero mas rápida.
Esta memoria puede estar ubicada en distintas partes del computador, cuanto mas cerca del CPU, mas rápido es el acceso. Las que están ubicadas en el mismo procesador se las llama de nivel uno (on chip), también están las de nivel 2 y nivel 3, una mas lejos que la otra.
Antes de proseguir debemos conocer a lo que se le llama "Principio de localidad"
Principio de localidad de programas y datos
• Localidad temporal: los elementos (datos o instrucciones) accedidos recientemente, también lo serán en un futuro próximo.
• Localidad espacial: los elementos cuyas direcciones están cercanas tienden a ser referenciados.
Teniendo el claro este principio, podemos podemos dar una aproximación de como se utilizan las cache:
Cuando la CPU solicita un el contenido de una dirección, primero se busca en la primera cache (rápidamente), si no se encuentra ahí, se va a buscar el dato a memoria, cuando se accede a memoria, no se extrae solo el contenido solicitado, sino que todo el conjunto de direcciones lo rodea, a conjunto extraído se lo llama bloque.
El bloque extraído se guarda en la cache, y de ese bloque el dato solicitado se manda a la CPU.
Debido al principio de localidad, hay muy altas posibilidades que se requieran otros datos que contiene el bloque guardado en cache, por lo cual cuando estos datos se requieran, el acceso va a ser muy rápido.
Debido a los muy buenos algoritmos que manejan las cache, la tasa de acierto es aproximadamente del 95%.
Para que quede mas claro el gran beneficio de la cache
Supongamos que tenemos 2 niveles de cache L1 (nivel 1) y L2(nivel 2)
Estos cálculos son solo para tener una aproximación, ya que no se tienen en cuenta muchos factores.
L1 tiene un tiempo de acceso de 0.1µs y L2 de 1µs
( 0.95 + 0.1µs) + (0.05*(0.1µs + 1µs)= 0.15µs
Estamos teniendo un tiempo de acceso aproximadamente de 0.15µs a cada dirección de memoria.
A L2 accedemos solo el 0.05% de las veces, agregando un nivel mas L3, a L3 solo tendríamos acceder el 0.0025 % de las veces y a la memoria principal solo el 0.000125.
La mayor parte del tiempo el procesador recibe datos e instrucciones rápidamente de la cache, por lo cual va a estar menos tiempo esperando.
Mas adelante voy a detallar mas su funcionamiento e implementaciones.
Memoria semiconductora:
Antes de empezar con este tema aconsejo leer la muy interesante pagina que habla de la forma mas común de almacenar información en los computadores antiguos, los núcleos de ferrita.
Diálogo sobre las memorias de anillos de ferrita.
Hoy en las memorias principales utilizan memoria principas, vamos a enumerarlas y dar una breve descripción.
Todas los tipos de memoria que veremos aca son de acceso aleatorio, a cada palabra que las componen se la puede acceder directamente.
RAM:
La mas común, (Random Access Memory) , obviamente todas las memorias que vamos a ver en esta parte son pero a esta se la llama asi.
Se puede escribir como leer rapidamente en ella, es volatil, o sea que se pierden los datos cuando se apaga el computador.
Se las puede dividir en 2 grupos, estaticas y dinamicas. Las dinamicas estan compuestas por celdas que conservan la carga, como un condensador, el hecho de que tenga carga o no diferencia un uno de un cero. Estas cargas disminuyen gradualmente por lo cual tienen implementadas un sistema de refresco, el cual cargara periodicamente las celdas con carga.
Las RAM estaticas estas conformadas por puertas bioestables, como los Flip-Flops, que pueden mantener uno de dos estados mientras esten alimentadas, con lo cual se identifica un uno o un cero.
Las RAM dinamicas son mas simples y compactas, lo acual hace que sean mas pequeñas y economicas.
ROM:Read Only Memory, solo se pueden leer, los datos bienen grabados ficicamente, como un circuito y no es volatil
PROM:Son iguales que las ROM pero estas se pueden grabar eléctricamente una vez. Podría grabarla el fabricante o el posterior comprador con un equipo especial. No es volátil.
EPROM: Memoria de solo lectura programable y borrable ópticamente, estas memorias se pueden leer y grabar eléctricamente, el tema importante es que antes de grabarla hay que borrarla completamente, lo cual se realiza exponiendo la ventanita del chip a rayos ultravioleta, suele tardar unos cuantos minutos en borrarse.Son mas costosas que las ROM y PROM, pero nos da mas ventajas. No es volátil.En la imagen se puede apreciar la ventana, que viene tapada con una etiqueta para evitar borrados no intencionados.EEPROM: Memoria de sobre todo lectura programable y borrable eléctricamente, Se puede leer tanto como escribir de forma eléctricamente y solo el o los byte direccionados. La escritura demora mucho mas tiempo que la lectura, Son mas costosas y menos densas, pero nos dan gran flexibilidad al poder actualizables mediante las lineas de datos, direcciones y control.
Flash: Iguales que las EEPROM pero mas mas rápidas, otra diferencia es que no permiten borrar a nivel de byte, solo se puede borrar a nivel de bloque.Estas 3 imágenes son de memorias flash, las podemos ver comúnmente en los pen drivers.La ultima es de 64GB de Samnsung.Organización de la memoria semiconductora:
El elemento básico de la memoria semiconductora es la celda de memoria, aunque existen muchas tecnologías utilizadas para su implementación, todas compartes algunas propiedades.
Presentan 2 estados, los cuales se utilizan para representar un uno o un cero.
Puede escribirse en ellas al menos una vez.
Pueden leerse para saber su estado.
Lo mas común es que posean tres terminales, uno para seleccionar la celda para lectura o escritura, otra para indicar el tipo de operación (lectura/escritura), y otro para los datos, como salida (lectura) o entrada (escritura).
Lógica del chip de memoria:
Las memorias semiconductoras vienen encapsuladas, y cada chip contiene una matriz de celdas de memoria.
Una de las características mas importantes de los chips de memoria, es la cantidad de bits que se pueden leer/escribir simultánea mente.
Tenemos muchas formas de organizar la memoria, en un extremo tenemos una memoria en la cual la organización física es igual a la lógica (igual a como la percibe el procesador), esto seria que el chip de memoria esta organizado en W palabras de B bits cada una. Por ejemplo una memoria de 16 Mbits podría estar organizado en 1Mpalabras de 16 bits cada una.
En el otro extremo tenemos la estructura llamada "un bit por chip" en la cual los datos se lee/escriben por bits, y desarrollare a continuación.
Organización típica de una DRAM de 16Mbits en la que se leen/escriben de a 4 bits simultáneamente:
Lógicamente la matriz esta compuesta por 4 matrices cuadradas de 2048 X 2048 elementos.
Para poder seleccionar un elemento particular de cada chip de 2048 X 2048 se necesitan, para poder expresar 2048 combinaciones, necesitamos 11 lineas, por lo cual a cada chip entran 11 lineas para especificar la fila de la matriz y 11 lineas para especificar la columna de la matriz.
Como se puede ver en este gráfico, a la DRAM solo entran 11 lineas de datos ( de A0 a A10), esto se debe a que estas lineas dedicadas a especificar la dirección están multiplexadas en el tiempo, primero se pasa la dirección que especifica la fila y luego se pasa la dirección que especifica la columna.
De cada chip obtengo un elemento, los 4 de la misma posición relativa dentro de cada uno de los chips. Si el bus de datos del sistema fuera de 16 bits, tendría que tener 4 DRAM conectadas al controlador de memoria para poder leer/escribir una palabra en el bus de datos.
Como comentario, el uso de matrices cuadradas y de lineas de direcciones multiplexadas provoca que con cada linea que se agrega a las lineas de direcciones la capacidad se podría cuaduplicar, por ejemplo con el caso anterior con 11 lineas se obtienen 2048 posibles combinaciones, con 12 lineas 4096, el doble, el doble de filas y el doble de columnas, o sea, el cuadruple de capacidad de direccionamiento con el solo hecho de agregar una linea mas.
En el diagrama anterior se muestra el encapsulado típico de una DRAM de 16Mbits.
Ahora, en el ejemplo anterior el chip tenia una entrada/salida de 4 bits, en cambio si cada chip tiene 1 bit de entrada/salida, claramente necesito N chips, donde N es igual a la cantidad de bits por palabra.
Para ejemplificar veamos una forma de organizar un modulo de memoria de 256K palabras de 8 bits.
Aclaración: El diagrama anterior tiene un error, en el chip inferior del gráfico debería decir "Chip #8"
En el diagrama podemos apreciar que las lineas de datos no se multiplexan. Cada chip posee 512 X 512 (256K) elementos de 1 bit, al momento de leer una de las 256k palabras de 8 bits, se envía la dirección y se selecciona un bit de cada chip (la misma ubicación en cada chip), cada bit seleccionado de cada chip conformara la palabra.
Memoria Cache:
El objetivo de la memoria cache es obtener un tamaño grande de memoria, con una velocidad tendiendo a la de las memorias mas rápidas y un costo tendiendo a las mas baratas.
Como ya hemos visto cuando el procesador necesita acceder a una dirección de memoria, primero se fija si esta en la cache, si esta, se llama acierto o "HIT", entonces la dirección es accedido directamente de la cache, si no esta en la cache, se llama fallo o "MISS", entonces se accede a la memoria principal y se extrae el conjunto próximo a la dirección buscada y se pone en la cache, para aprovechar el principio de proximidad. En esta parte tenemos dos organizaciones mas comunes, una es que se pasa el bloque de memoria a cache y se pasa la dirección solicitada al procesador en paralelo, al mismo tiempo, la otra primero se pasa el bloque de palabras a la cache y luego esta, pasa la dirección solicitada a el procesador.
Este seria el diagrama del del segundo caso, primero se pasa el bloque a la cache y luego se pasa la palabra a el procesador.
Es este diagrama podemos ver la operación de lectura, realmente no se bien a que se refiere con RA, me imagino que es Registry address, un registro donde el procesador pone la dirección a la que quiere hacer referencia. El flujo seria algo así: el procesador pone la dirección requerida en RA, se chequea si la dirección esta en cache, si esta se capta la palabra para luego pasarla al procesador, si no esta se accede a memoria, se decide en que lugar de la cache se va a alojar el bloque y EN PARALELO se pasa el bloque a la cache y se pasa la palabra al procesador, este seria el primer caso que hacia referencia el párrafo anterior y es la organización que se usa en general en las cache actuales.
En este diagrama se ve como estaría dispuesta la cache con sus lineas de conexión, en el caso de entregar los datos primero a la cache y luego al procesador, si hay un acierto, se inhabilitan los dos buffer y el trafico es solo de cache a procesador, si hay un fallo, se coloca la dirección en el buffer de direcciones, y por medio del bus del sistema se accede a la memoria principal, luego se transfiere el bloque de datos a la cache para después esta entregar la palabra al procesador. La cache se interpone físicamente entre la memoria y el procesador.
Antes de seguir con las características de la cache vamos a ver un poco mas sobre el principio de localidad.
Este principio establece que las referencias a memoria tienden a formar agrupaciones, quiere decir que las referencias en un lapso de tiempo hacen referencia a un conjunto de palabras que están próxima físicamente, estas agrupaciones cambian, pero durante periodos cortos de tiempo el procesador hace referencia a algun conjunto en particular. el tema es que ese grupo o bloque este en ese periodo de tiempo en cache, para tener un tiempo de acceso rapido.
Algunas afirmaciones para ver que la localidad tiene sentido:
Exepto cuando hay instrucciones de salto, en general la ejecucion de un programa es secuencial, o sea que la proxima instruccion a captar es la inmediatamente siguiente a la ultima captada.
Es raro tener una seguencia larga initerrumpida de llamadas a procedimientos con sus retornos correspondientes, en general el programa queda confinado a una ventana bastante estrecha de profundidad o nivel de anidamiento de procedimientos, por lo cual, en un periodo corto de tiempo las referencias tienden a localizarce en unos pocos procedimientos.
La mayoria de las instruccioes iterativas contienen pocas instrucciones, por lo cual, durante el periodo que dure la iteracion, se va a hacer referencia a instrucciones contiguas, y la ventana de profundidad durante la iteracion va a ser pequeña.
En muchos programas se hecen referencias a estruccturas de datos como secuencia de registros o matrices, en muchos casos estas unidades de datos se encuentran en posiciones contiguas de memoria, por lo cual se va a estar haciendo referencia a un mismo bloque de datos.
Este tema es muy estudiado por su gran importancia en el rendimiento del computador.
Este gráfico se basa en las llamadas a procedimiento de un programa con su retorno correspondiente, en el se puede observar ventanas de profundidad igual a 5, se aprecia como durante un periodo apreciable de tiempo se hace referencia a llamadas que contiene una misma ventana.
Mas adelante vos a ampliar esta parte, ya que hay muchos datos interesantes.
Como se vera que no hay duda de los beneficios de tener en cuenta este principio, ahora para aprovecharlo tendríamos que saber el tamaño óptimo del bloque para pasar de memoria a cache y la cantidad de bloques que tendría que alojar la cache, para eso seguiré con las características de las cache.
Estructura de la cache:
Vamos a ver algunos criterios básicos de diseño que nos van a servir para clasificarlas y poder diferenciar las distintas arquitecturas de cache.
Tamaño de la cache:
Lo ideal seria tener una cache lo suficientemente pequeña para que el costo promedio por bit se aproxime al costo de la memoria principal, y que sea lo suficientemente grande para que la velocidad de acceso promedio se aproxime a la velocidad de la memoria cache. Igualmente hay otros motivos que nos restringen a tamaños de cache grandes, uno es que cuanto mas grandes las caches, mayor puertas implicadas en el direccionamiento de estas, lo cual implica que un mayor el tamaño tiende a cache mas lentas. Diversos estudios han llegado a que el tamaño óptimo estaría entre 1K y 512K palabras. Como las tareas a realizar por el procesador son muy variables, y la cache depende de eso, es imposible predecir un tamaño óptimo.
Función de correspondencia:
La memoria principal consta de hasta 2 elevado a la N palabras direccionables de n bits cada una, estas palabras están agrupadas en M bloques de k palabras cada uno. La cache consta de C líneas de K palabras cada una. En todo momento hay un subconjunto de bloques alojado en la cache, y como hay menos líneas en la cache que bloques en la memoria principal, debe haber una función de correspondencia que nos indique a que bloque de memoria principal corresponde cada línea de la cache, además que necesitamos elegir que bloque se van a almacenar en la cache.
Pueden utilizarse 3 técnicas de correspondencia:
Directa.
Asociativa.
Asociativa por conjuntos.
Para explicar las tres técnicas vamos a usar los siguientes elementos:
Cache de 64 Kbyte.
Los datos se transfieren entre memoria y cache en bloques de 4 bytes, por lo cual la cache esta organizada en 16K líneas de 4 bytes cada una.
Una memoria principal de 16Mbytes, direccionable de a byte, para lo cual se necesita una dirección de 24 bits para poder hacer referencia a los 16M de direcciones. Para poder realizar la correspondencia vamos a considerar que la memoria consta de 4M bloques de 4 bytes cada uno.
Correspondencia directa:
Es la más simple, cada bloque de la memoria principal se puede alojar solo en una línea específica de la cache.