UNIDAD VI

Interrupciones o llamas a su rutina. Caché y detalle de los buses.


¿Qué son las interrupciones?
Una interrupción es una suspensión temporaria de la ejecución de un programa, para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por lo general, no forma parte del programa (generalmente perteneciente al Sistema Operativo, o al BIOS –Basic Input Output System-). Luego de finalizada dicha subrutina, se reanuda la ejecución del programa.
Luego de ejecutar la I2, se suspende temporalmente la ejecución de I3 y de las instrucciones siguientes del programa (1). Esto se deba a que una interfaz, por ejemplo el teclado, activó su línea de solicitud de interrupción (IRQ) (2) para que pase a ejecutar la subrutina de la ROM BIOS, que en este caso atiende al teclado (3). Después de que finaliza la ejecución de la subrutina (4), se vuelve a la secuencia interrumpida (5) y se ejecuta la I3 que había quedado en stand by, y las siguientes (6).
Por lo tanto, una interrupción, es el proceso en el que se llaman a subrutinas del Sistema Operativo o de la ROM BIOS para su ejecución.

Interrupciones por Hardware externas
Las interrupciones por hardware externas, son las del tipo descripta: se dan cuando una interfaz activa su señal de solicitud de interrupción (denominada IRQ –Interrupt Request- en las PC).
Esta activación, tiene lugar cuando en el periférico que está conectado a una plaqueta interfaz se concreta algo: se apretó una tecla en el teclado, una impresora está lista para recibir más datos, una unidad de CD/DVD terminó de leer o escribir, etc.
La activación de una señal IRQ por interfaz (que se puede representar como el toque de un timbre), causará que en algún momento se interrumpa la ejecución de un programa, y que la UC ejecute la subrutina de la ROM BIOS o del Sistema Operativo preparada para atender a la interfaz.
Al terminar la ejecución de la subrutina, se podrá seguir ejecutando al programa Interiormente detenido.
Ejemplo:

  • Cada vez que en el teclado se pulsa o libera una tecla, el código de esta llega al port de datos de la interfaz del teclado, donde se activa su señal IRQ. Esta IRQ, sirve para identificar que en una operación de entrada, se puede realizar la fase de transferencia por acceso indirecto a memoria, en donde el código llega al buffer de memoria reservado para los códigos de teclas. 
    Con la activación de la IRQ, la UC interrumpe la ejecución del programa en curso, pasando a ejecutar el subproceso del BIOS (mediante el acceso indirecto de memoria). En esta, existe una instrucción IN (compuesta por un byte que pasa del port al registro AX), seguida de una I4 (que pasa el byte del registro AX a la memoria principal).
    Luego se reanuda la ejecución del programa. 
  • Cuando finaliza un acceso directo a memoria (ADM), la interfaz activa su IRQ para que se interrumpa la ejecución del programa en proceso y se ejecute la subrutina que verifica que el ADM fue bien hecho. 
    En caso contrario, se ordenará intentarlo varias veces; si el problema persiste, la rutina hará aparecer un cartel en la pantalla indicando el error. Por ejemplo, en una impresora se utiliza la señal IRQ de su interfaz para indicar la falta de papel, originando que la subrutina del evento indique un aviso por pantalla.

Existe un conjunto de líneas de solicitud de interrupción, por lo que de cada interfaz sale una línea, designada IRQn, donde “n” es distinta para cada una.
Todas estas líneas se dirigen a un chip “árbitro de solicitudes de interrupción”; una salida de este chip activa la línea de control INTR (indicadora de solicitud de interrupción) que entra a la UC, indicando que hay una señal de interrupción activa.
Cada vez que se termina de ejecutar una instrucción, la UC censa si la línea de control INTR está activa. Si el programa lo permite, el mismo es interrumpido para darle paso al subrutina; en caso contrario, espera hasta ser atendida.
En las dos primeras generaciones, el mecanismo de interrupciones consistía en la ejecución periódica de subrutinas (“polling”) que interrogaban a los periféricos para determinar si tenían datos para enviar. Con este método, la UCP gastaba tiempo en su ejecución, aunque no hubiera nada para enviar.

Interrupciones Por Software
Una interrupción por software se realiza ejecutando el código de una instrucción que ordena llamar a subrutinas del Sistema Operativo o de la ROM BIOS cuando necesita el servicio de una de ellas.
Este tipo de instrucción en lenguaje assembler de una PC se simboliza INT xx2, donde xx identifica la subrutina llamada y localizarla en la memoria principal.
A diferencia de las interrupciones por hardware, una interrupción por software está establecida en qué momento del programa en ejecución sucederá. Se trata de una instrucción que está en determinado lugar de un programa, y que llama las subrutinas.
Por ejemplo, cuando un programa necesita realizar una operación relacionada con los recursos que maneja el Sistema Operativo como abrir/cerrar un archivo, acceder a un disco, imprimir, etc., se trata de un llamado de los programas a las subrutinas necesarias para realizar dichas operaciones.


  1. Un programa que se venía ejecutando, luego de su I5 necesita llamar a una subrutina del SO, para leer un archivo en el disco.
  2. Luego de I5, existe una instrucción de código de máquina CD21 (simbolizada INT 21) que realiza el requerimiento del paso 1. Luego, el programa se autointerrumpe,ya que no puede seguir ejecutando las instrucciones siguientes hasta que no se haya leído el disco y esté en memoria principal el archivo solicitado. 
  3. La ejecución de INT 21 permite encontrar la subrutina del SO. 
  4. Se ejecuta la subrutina del SO. 
  5. Luego de que se haya leído el disco y se haya comprobado que la lectura es correcta, el SO ordena continuar la ejecución del programa que se había autointerrumpido. 
  6. Por último, la ejecución del programa se reanuda.






Retorno al programa interrumpido

Siempre que haya una interrupción, antes de que se pase a ejecutar la subrutina del SO o del BIOS que dé servicio a dicha interrupción, la UC guarda automáticamente la dirección de retorno en memoria, donde está la instrucción a partir de la cual continúa el programa interrumpido. De esta manera, luego de que se ejecute la subrutina, se podrá retornar al programa.

La zona de memoria principal “Pila”
La dirección de retorno mencionada anteriormente, se almacena en una región elegida en la memoria principal denominada pila (“stack”). Esta, se utiliza para retornar al programa que llamó a una subrutina ó fue interrumpido.
La pila es necesaria, debido a que es común que una subrutina llamada por una interrupción, a su vez sea interrumpida para llamar a otra subrutina, y que esta última, también sea interrumpida, y así sucesivamente.
Para explicar cómo funciona, usaremos como ejemplo a un libro de cocina:
Supongamos que se elabora una receta de la página 14, en el renglón 8 se remite a la elaboración de la página 4 y, que en ésta a su vez, en el renglón 9 requiere realizar un sub-procedimiento en la página 54.
Una vez que se llegó al renglón 8 de la página 14, se anotan estos números en un papel y se lo insertan en un pincha-papeles. Luego, se realiza el sub-procedimiento de la página 4, hasta que se llega al renglón 9. Se anotan estos números en otro papel y se lo apila en el pincha-papeles arriba del anterior, y se pasa a realizar el sub-procedimiento de la página 54.
Cuando se termine el mismo, para retornar a terminar el anterior, se leen en el pincha-papeles el 4 y 9 (en el papel que se encuentra arriba) que permiten reanudar la receta de esa página.
Finalizada ésta, se lee en la siguiente hoja apilada debajo de la anterior los números 14 y 8, que permiten encontrar la receta principal.
Se puede observar que el último de los procedimientos interrumpidos, es el primero en completarse. Se trata de una pila “último en entrar, primero en salir” (LIFO –last in first out-). Esto, quiere decir que con cada interrupción o llamada de subrutina, se apilan en la cima de la pila la información que permite regresar al programa o subrutina interrumpida.
En la pila, se empieza a desapilar cada bloque de información almacenada, en orden inverso al que fue apilado.
Se supone una pila definida a partir de la dirección en memoria 0436 para un programa interrumpido (fig. 1.73). Este programa, luego la interrumpción, debe proseguir en la instrucción localizable, mediante la dirección de retorno 0207H.
Cuando la UCP acepta la solicitud de interrupción, automáticamente, guarda en la pila dicha dirección 0207H. Sobre este valor, se supone que guarda otro valor indicando XXXX, que debe ser del Registro de Estado.
En la UCP, existe un registro “puntero de pila” (SP –“stack pointer”) que contiene la dirección de la pila que en el presente corresponde a su cima. Este, también, es actualizado en forma automática por la UC cada vez que se lee o se escribe la pila.
Siguiendo el ejemplo de la figura 1.76, se ha supuesto que la interrupción se podía apilar a partir del comienzo de la pila (0436H). Entonces, el SP en una PCestaría con el valor 0437H antes de la interrupción, para alcanzar al valor 0433H, indicando así en el SP la nueva dirección de la cima de la pila.
De sobrevenir otra interrupción o llamada a subrutina, los valores a resguardar se apilarán en la dirección 0432H de la pila, sobre XX, variando en correspondencia el SP.
Cuando se termina de ejecutar la subrutina, se retorna al programa interrumpido leyendo 0207Hde la pila, y luego el SP se vuelve automáticamente al valor 0437H.


El funcionamiento de la memoria caché

La memoria principal o RAM es un elemento de almacenamiento imprescindible para que los programas se ejecuten con una velocidad apropiada. El rendimiento de ésta se puede incrementar aún más gracias a la memoria caché. 
Si hay algo que limita la velocidad de las transferencias entre la RAM y la CPU es sin duda la primera (no se debe olvidar que el subsistema más rápido de un PC es la CPU). Por tanto, para conseguir “acelerar” un PC no es solución sencilla, rápida ni rentable centrarse en diseñar procesadores más potentes. Aunque emplear tecnologías RAM más rápidas mejora el rendimiento, la solución óptima consiste en agregar un nuevo elemento a la PC: la memoria caché. Este artículo introduce el importante concepto de caché que todo PC actual emplea (y no sólo con la memoria principal, sino también con otros importantes subsistemas).

¿Qué es una caché?
Imagine dos sistemas de memoria A y B, entre los cuales se transfiere información. Suponga que el sistema A es más rápido y presenta menor capacidad de almacenamiento que B (situación típica en una PC). Esto se traduce en que A debe funcionar a menor velocidad de la que es capaz de ofrecer, siempre que se comunique con B. Se puede mejorar la velocidad de transferencia introduciendo un nuevo sistema de memoria C entre A y B, al que se denomina caché. La caché debe presentar una capacidad de almacenamiento mayor que la de A y menor que la de B. Además, será más lenta que A, pero más rápida que B. En otras palabras, sus características son un término medio entre los sistemas A y B. La aceleración de las transferencias se basa en almacenar la información intercambiada últimamente entre A y B, puesto que con gran probabilidad será la más empleada en las próximas transferencias. La aplicación de sistemas de caché recibe el nombre de caching.
Esto ya se introdujo al colocar la memoria RAM entre la CPU (rápida y con poca capacidad) y otros dispositivos lentos (y de gran capacidad), como es el caso del disco duro.
Ya que esta definición es quizá un tanto confusa, en el siguiente apartado presentamos más detalles acerca del funcionamiento de una caché, que permiten entender el concepto con mayor claridad. Tomaremos como referencia un tipo particular de caché: la caché de memoria. Ésta se introduce entre la RAM y la CPU. De esta forma, se consigue incrementar notablemente la velocidad con que la CPU accede a la memoria principal. Por supuesto, la memoria caché será más rápida que la RAM, y dispondrá de menor capacidad de almacenamiento. Veamos cómo funciona.

¿Cómo funciona una caché de memoria?
En realidad, el funcionamiento de una caché sigue un principio parecido al que formulamos para la memoria principal. En aquel caso, las instrucciones y datos se cargaban en la RAM (desde dispositivos lentos), donde la CPU podría acceder a mayor velocidad.
Una caché de memoria se carga (desde la RAM) con los datos y/o instrucciones que ha buscado la CPU en las últimas operaciones. La CPU buscará siempre primero la información en la caché, y la encontrará allí la mayoría de las veces, con lo que el acceso será muy rápido. Si, desgraciadamente, no se encuentra la información en la caché, se perderá un tiempo extra en acudir a la RAM y copiar dicha información en la caché para que esté disponible (ver Figura 1). Como estos fallos ocurren con una frecuencia relativamente baja, el rendimiento mejora considerablemente, ya que la CPU accederá más veces a la caché que a la RAM. Lo comentado para la búsqueda en memoria funciona de forma análoga para la escritura: la CPU escribe en la caché en lugar de la RAM (más adelante hablaremos de dicho proceso con mayor detalle).
No es de extrañar que esta técnica (caching) funcione. La mayoría de programas tiene un alto contenido en bucles, lo que implica un uso repetido de instrucciones (e incluso datos). Y esto implica una elevada probabilidad de acierto al buscar la información en la caché.
Una forma interesante de ilustrar el funcionamiento de la caché consiste en imaginar un videoclub, equipado con un mostrador y una habitación capaz de almacenar cientos de vídeos. Ante la petición de cada cliente, el dependiente deberá acudir hasta el almacén, buscar la película solicitada, volver al mostrador y entregar la cinta al cliente. Ante la devolución de una cinta, el dependiente debe caminar hacia el almacén y guardar dicha cinta en el lugar apropiado. Realmente esa forma de trabajo no es nada eficiente, ya que implica demasiados desplazamientos y, por tanto, la atención al cliente será realmente lenta.
Suponga ahora que el dependiente dispone de un pequeño archivador de 20 vídeos sobre el mostrador. Cuando un cliente devuelve una cinta, el dependiente coloca la cinta directamente en el archivador, en lugar de caminar hacia el almacén. Si se va repitiendo dicho proceso, el dependiente dispondrá continuamente de las veinte últimas películas devueltas en el archivador. Cuando se acerque un cliente y pida una película, el dependiente la buscará primero en el archivador, y sólo si no la encuentra allí se desplazará hacia el almacén. Este método funciona, sobre todo porque la mayor parte de las películas devueltas serán las de estreno, que al mismo tiempo son las más solicitadas.

Otros tipos de caché
Aunque hasta ahora hemos hablado de la caché con respecto a la memoria RAM, en un PC existen muchos otros sistemas de caché.
Sin ir más lejos, las unidades de almacenamiento (discos duros, discos flexibles, etc.) y otros muchos periféricos utilizan la memoria RAM como sistema de caché. En efecto, una zona de la RAM contiene la información que se ha buscado últimamente en dichos dispositivos, de forma que basta con acceder a la RAM para recuperarla. La escritura funciona de forma análoga: se escribe información directamente en la RAM, y ésta se vuelca a las unidades asociadas cuando es oportuno. Evidentemente, el rendimiento mejora de forma notable. Incluso es posible emplear el disco duro como caché de cara a dispositivos aún más lentos (como son las unidades CD-ROM). Estos sistemas de caché suelen estar gobernados mediante software, que se suele integrar en el sistema operativo.
Es sencillo realizar un experimento para apreciar la presencia de estos tipos de caché en cualquier PC. Basta con que introduzca un disco flexible en la unidad correspondiente con un archivo de texto de unos 300 kB. A continuación, inicie el bloc de notas y abra el fichero de texto. Apreciará que el indicador luminoso de acceso a la unidad permanece varios segundos activo, hasta que finalmente aparece el texto en pantalla. Acto seguido, cierre el bloc de notas y repita el proceso. En esta ocasión, el texto aparecerá casi instantáneamente en pantalla y el indicador luminoso no se encenderá. ¿Qué ha ocurrido? En la primera ocasión se ha acudido al disco para copiar la información en la RAM (ver Figura 2), y de ahí la tardanza. En el segundo acceso, el sistema operativo ha buscado directamente en la caché asociada al disco flexible y ha encontrado la información buscada, por lo que el acceso es mucho más rápido.
Aún existen más tipos de caché. Incluso los navegadores Web utilizan el disco duro como caché para almacenar las últimas páginas visitadas. Al solicitar una página Web, el navegador acude a Internet y comprueba la fecha de la misma. Si la página no ha sido modificada, se toma directamente del disco duro, con lo que la carga es muy rápida. En caso contrario se descarga desde Internet y se actualiza la caché, pagando un cierto tiempo de espera como precio. En el caso de los navegadores Web, el uso del disco duro es más que suficiente, ya que es extremadamente más rápido que el acceso a Internet.

Niveles de caché
Tal y como acabamos de mostrar, un PC incorpora varios tipos de caché. Pero, ¿de qué forma están organizados? Usualmente, los diferentes sistemas de caché se organizan por niveles, formando una jerarquía. En general se cumple que, a mayor cercanía a la CPU, se presenta mayor velocidad de acceso y menor capacidad de almacenamiento.
Para empezar, la caché de memoria se suele desglosar en dos niveles. En el nivel más cercano a la CPU se encuentra la caché L1 (level 1 o nivel 1). Ésta se halla integrada en el mismo chip que la CPU, con lo que el acceso se produce a la velocidad de trabajo del procesador (la máxima velocidad). Por supuesto, la caché L1 presenta un tamaño muy reducido (de 4 a 16 kB).
A continuación aparece la caché de nivel 2 o L2. Inicialmente, se instalaba en la placa base, en el exterior de la CPU. Los procesadores actuales la integran en el propio chip. Como era de esperar, tiene mayor capacidad que la caché L1 (de 128 a 512 kB) pero es una memoria más lenta. Como muestra la imagen de un Pentium II desarmado, dentro de la carcasa negra encontramos una placa de circuito en la que va soldado el micro en sí (en el centro de la imagen), junto con varios chips que forman la caché, externa a lo que es propiamente el micro. Sin embargo, esta caché funciona a una frecuencia que es la mitad de la del micro (es decir, a 133, 150 MHz o más), mientras que la caché externa clásica funciona a la de la placa base (de 50 a 66 MHz en los Pentium y 100 MHz en los AMD K6-2).
El siguiente nivel lo constituye la memoria RAM. Como ya hemos comentado, la RAM suele hacer de caché para los dispositivos de almacenamiento y otros tipos de periféricos. El nivel más alto lo ocuparían las caché en disco duro, como son las utilizadas por los navegadores Web.
La búsqueda de información comienza por la caché L1, y se va subiendo nivel a nivel en caso de no encontrar lo que se busca en el nivel actual. Por supuesto, cuantas más capas haya que ascender, mayor retardo se pagará. Pero, a mayor cercanía a la CPU, la probabilidad de encontrar lo que se busca es mayor. Esta forma de trabajo resulta una excelente relación de compromiso entre diversos factores, y consigue mejorar el rendimiento del ordenador de forma notable.

Estructura y funcionamiento interno de una caché de memoria
No es el objetivo de este artículo presentar con detalle la arquitectura interna de una caché L2, pero es conveniente proporcionar un conocimiento general sobre lo que ocurre en su interior. 
Al igual que ocurría con la RAM, es apropiado pensar en la caché como un arreglo de tipo tabla. En este caso, cada celda almacena un octeto o byte. No es raro que una caché de 512 kB se distribuya en 16.384 filas (16 kB) y 32 columnas (32 bytes).
La entidad básica de almacenamiento la conforman las filas, a las que se llama también “líneas de caché”. En el ejemplo anterior se dispone de 16.384 líneas de caché, de 32 bytes cada una. Nunca se toma un byte de la RAM y se escribe en una celda de la caché. Por el contrario, en cada movimiento siempre se copia información de la RAM suficiente para cubrir una línea de caché (en el ejemplo, siempre se mueven 32 bytes). En el caso de la escritura, el funcionamiento es totalmente análogo.
Toda caché incorpora, además, un espacio de almacenamiento llamado Tag RAM, que indica a qué porción de la RAM se halla asociada cada línea de caché. En otras palabras, la Tag RAM permite traducir una dirección de RAM en una línea de caché concreta.
Ya que la RAM tiene mayor capacidad que la caché, ¿cómo se reparte la RAM entre las líneas de caché disponibles? Existen tres tipos de caché según la técnica empleada:
Caché de mapeo directo. Se divide la RAM en porciones de igual tamaño, tantas como líneas de caché existan. Cada línea de caché es un recurso a compartir por las direcciones de memoria de una porción diferente. Por ejemplo, si se dispone de una RAM de 64 MB y la caché de 512 kB presentada anteriormente, cada línea podrá almacenar 32 de las 4.096 direcciones que contiene la porción de RAM asociada (64 MB/ 16.384 líneas = 4.096 bytes / línea). Esta técnica permite una búsqueda muy rápida, ya que cada posición de RAM sólo puede estar en una determinada línea. Sin embargo, la probabilidad de encontrar la información buscada es mínima. Imagine dos instrucciones A y B, que se corresponden con la misma línea de caché (esto es, pertenecen a una misma porción de RAM). Suponga que la CPU necesita ejecutar una secuencia alternada A, B, A, B, etc. En ese caso, se tendrá que acceder a la RAM para copiar A y luego para copiar B (y reemplazar a la instrucción A en la caché), y así hasta terminar la secuencia. Sin duda, el porcentaje de acierto es nulo en dicha situación.
Caché completamente asociativa. Cada línea de caché se puede llenar con cualquier grupo de posiciones de la memoria RAM. En este caso, el porcentaje de acierto es máximo, y el ejemplo anterior no produciría problemas. En cambio, el tiempo de acceso es muy elevado, puesto que una posición de RAM puede estar en cualquier línea de caché (esto es lento, incluso empleando algoritmos de búsqueda avanzados).
Caché asociativa por conjuntos de N líneas. La caché se divide en conjuntos de N líneas. A cada conjunto se le asocia un grupo de posiciones de RAM. Dentro del conjunto asignado, una posición de RAM puede ir a parar a cualquiera de las N líneas que lo forman. En otras palabras, dentro de cada conjunto la caché es totalmente asociativa. Esta situación es la más equilibrada, puesto que se trata de un compromiso entre las técnicas anteriores. Si se hace N=1, se tiene una caché de mapeo directo. Si N es igual al número de líneas de la caché, se tiene una caché completamente asociativa. Si se escoge un valor de N apropiado, se alcanzará la solución óptima.
Normalmente, la caché L2 es de mapeo directo, mientras que la caché L1 es asociativa por conjuntos de N líneas.

Políticas de escritura
El proceso de escritura en caché es muy simple: en lugar de escribir la información en la RAM, se escribe directamente en la caché. El detalle a resolver es: ¿cuándo se traslada la información de la caché a la RAM? Hay dos políticas de escritura fundamentales para resolver dicho problema:
Write-Back: La información se escribe directamente en la caché, sin actualizar la RAM. Cuando una posición de la caché debe ser utilizada por otra posición de RAM diferente, su contenido actual se traslada a la RAM, asegurando la coherencia entre ambas memorias.
Write-Through: Cada vez que se escribe en una línea de caché, se actualiza la RAM. Esta técnica conlleva un acceso continuo a la RAM, por lo que el rendimiento es pobre.
Las caché Write-Back proporcionan el mayor rendimiento, pero conlleva un riesgo de integridad. Por ejemplo, en un momento dado, el contenido de la RAM y la caché L2 pueden ser diferentes. Con la memoria RAM esto no tiene gran importancia. Pero en casos como la caché asociada al disco duro (espacio en RAM), y ante un fallo de la alimentación eléctrica, esto puede implicar mantener en disco una información no actualizada. Por ello, las cachés de disco suelen evitar la técnica Write-Back.

Conclusiones
En este artículo hemos revisado los sistemas de caché, presentes en todo PC como solución óptima para mejorar el rendimiento del sistema. Hemos definido el concepto de sistema de caché, explicando a continuación su funcionamiento. Acto seguido, hemos introducido los diferentes tipos de caché presentes en una PC, estudiando su organización jerárquica (aprovechando para presentar dos elementos muy destacados actualmente en todo procesador: las caché L1 y L2). También hemos comentado la estructura interna de una caché L2, y las técnicas básicas para el mapeo de la RAM sobre la caché. Finalmente, hemos presentado las políticas fundamentales de escritura en caché. Estos conceptos le permitirán conocer mejor su ordenador, y entender por qué el término “caché” es tan nombrado en las descripciones de los procesadores y computadoras.

Jerarquía de memoria

Se conoce como jerarquía de memoria a la organización piramidal de la memoria en niveles, que tienen los ordenadores. Su objetivo es conseguir el rendimiento de una memoria de gran velocidad al coste de una memoria de baja velocidad, basándose en el principio de cercanía de referencias.
Los puntos básicos relacionados con la memoria pueden resumirse en:
  • Cantidad
  • Velocidad
  • Coste
La cuestión de la cantidad es simple, cuanto más memoria haya disponible, más podrá utilizarse. La velocidad óptima para la memoria es la velocidad a la que el procesador puede trabajar, de modo que no haya tiempos de espera entre cálculo y cálculo, utilizados para traer operandos o guardar resultados. En suma, el costo de la memoria no debe ser excesivo, para que sea factible construir un equipo accesible.
Como puede esperarse los tres factores compiten entre sí, por lo que hay que encontrar un equilibrio. Las siguientes afirmaciones son válidas:
  • A menor tiempo de acceso mayor coste
  • A mayor capacidad mayor coste
  • A mayor capacidad menor velocidad.
Se busca entonces contar con capacidad suficiente de memoria, con una velocidad que sirva para satisfacer la demanda de rendimiento y con un coste que no sea excesivo. Gracias a un principio llamado cercanía de referencias, es factible utilizar una mezcla de los distintos tipos y lograr un rendimiento cercano al de la memoria más rápida.
Los niveles que componen la jerarquía de memoria habitualmente son:
En arquitectura de ordenadores, un registro es una memoria de alta velocidad y poca capacidad, integrada en el microprocesador, que permite guardar transitoriamente y acceder a valores muy usados, generalmente en operaciones matemáticas.
Los registros están en la cumbre de la jerarquía de memoria, y son la manera más rápida que tiene el sistema de almacenar datos. Los registros se miden generalmente por el número de bits que almacenan; por ejemplo, un "registro de 8 bits" o un "registro de 32 bits". Los registros generalmente se implementan en un banco de registros, pero antiguamente se usaban biestables individuales, memoria SRAM o formas aún más primitivas.
El término es usado generalmente para referirse al grupo de registros que pueden ser directamente indexados como operandos de una instrucción, como está definido en el conjunto de instrucciones. Sin embargo, los microprocesadores tienen además muchos otros registros que son usados con un propósito específico, como el contador de programa. Por ejemplo, en la arquitectura IA32, el conjunto de instrucciones define 8 registros de 32 bits.

Tipos de registros
  • Los registros de datos son usados para guardar números enteros. En algunas computadoras antiguas, existía un único registro donde se guardaba toda la información, llamado acumulador.
  • Los registros de memoria son usados para guardar exclusivamente direcciones de memoria. Eran muy usados en la arquitectura Harvard, ya que muchas veces las direcciones tenían un tamaño de palabra distinto que los datos.
  • Los registros de propósito general (en inglés GPRs o General Purpose Registers) pueden guardar tanto datos como direcciones. Son fundamentales en la arquitectura de von Neumann. La mayor parte de las computadoras modernas usa GPR.
  • Los registros de coma flotante son usados para guardar datos en formato de coma flotante.
  • Los registros constantes tienen valores creados por hardware de sólo lectura. Por ejemplo, en MIPS el registro cero siempre vale 0.
  • Los registros de propósito específico guardan información específica del estado del sistema, como el puntero de pila o el registro de estado.
También existen registros banderas y de base

Diagrama explicativo de la jerarquía de memoria.

Gestión de memoria

Los lenguajes de programación actuales generalmente asumen la existencia de únicamente dos niveles de memoria, memoria principal y almacenamiento secundario (normalmente en disco). Aunque en lenguaje ensamblador, ensamblador en línea y lenguajes como C y C++ podemos direccionar datos directamente a los registros del procesador. Para aprovechar de forma óptima las ventajas de la jerarquía de memoria es necesario cooperación entre programadores, compiladores y fabricantes de hardware:
  • Programadores deben ser responsables del movimiento entre memoria principal y disco mediante el uso de ficheros.
  • Hardware el movimiento de datos entre la memoria principal y los niveles de caché es realizado por algoritmos hardware.
  • Compiladores son responsables de optimizar el código de modo que el uso de los registros y la caché sea eficiente.

Características de los buses compartidos
Un bus es un camino eléctrico constituido por líneas conductoras, que permite intercambiar información binaria entre dos o más dispositivos. Si es compartido por más de dos, estos pueden comunicarse entre sí a través del bus a razón de dos por vez, siendo que en un instante dado uno solo puede transmitir. Cualquier señal que este transmite puede ser recibida por cualquier otro dispositivo del bus, pero solo responderá el que fue seleccionado.
En general se trata de que un bus permita económicamente que se conecten a él dispositivos de distinto tipo con tal que cumplan con especificaciones macanico-electricas y de señalización temporal.
El hecho de compartir líneas implica una gran economía de cableado y espacio, en relación con los mismos dispositivos conectados de a dos, “punto a punto”, con un bus independiente dedicado entre cada par. Un bus compartido tiene la limitación que dispositivos conectados al mismo deben esperar para recibir o transmitir datos, pues ello se realiza entre dos dispositivos por vez; y que se necesita circuitería adicional de control de bus, que asegure esto último, para evitar interferencias.
Lo dicho puede equiparse a teléfonos internos que comparten una misma línea. Antes de comunicarse uno con otro debe constatarse que el indicador luminoso de que 2 están hablando no este encendido. En un bus compartido se necesita un protocolo de arbitraje que especifique la secuencia de pasos (señales) que deben ocurrir para que un dispositivo pueda comunicarse con otro. Con los teléfonos seria: ver si el Led está apagado, sino esperar; levantar el tubo; digitar el número del otro interno, etc.
Así se determina, controlador del bus mediante, cual es el próximo dispositivo (“master”9 que va a iniciar una transferencia con otro del bus. El “master” selecciona el dispositivo “Slave” o “target” con el cual realizara la trasferencia de datos en un sentido u otro.
En un bus serie la información se transmite bit a bit por un solo conductor (dos en el BUS), mientras que en un bus paralelo esto se realiza mediante un cierto número de conductores para transmitir simultáneamente n bits.
Cada dispositivo se identifica y selecciona por un número que es su dirección (el número de interno en los teléfonos). Entre dos dispositivos comunicados se establece un enlace o camino entre ellos.

Estructura de un bus paralelo:
En un bus paralelo la selección se realiza mediante líneas de dirección, y la trasmisión de datos usando líneas de datos, cuyo número (8, 16, 32, 64, 128) define el ancho del bus. El 8088 envía una dirección (que llega a todos los dispositivos) para seleccionar una celda de memoria con orden de lectura (línea de control L/E=1). Solo responde la memoria enviando un byte por las líneas de datos.
Es factible que un mismo conjunto de líneas primero se use para direccionar y luego para transmitir. Las líneas de control transmiten señales si/no para: peticiones (por ejemplo la línea IRQ solicita interrupción), ordenes (Por Ej. La línea L/E para leer /escribir), avisos, confirmaciones y tipos de información enviada. Así controlan el acceso y la ocupación de las líneas de dirección y datos, y de hecho indican cuando son válidos los valores presentes en esas líneas.
Si el bus es sincrónico (como el isa o el pci) una de las líneas de control designada “clock” o Mhz recibe pulsos regularmente especiados en el tiempo, generados por un oscilador, los cuales marcan los instantes en que se pueden activar o desactivar líneas de control, o enviar direcciones o datos.
En un bus asincrónico a partir de la activación de una línea por un “master” en un instante no regido por un clock, se sucede en respuesta la activación de otra línea por el “slave”, a la cual puede seguir la activación de otra, etc. Así la activación de una línea depende de la activación de otra, pero no del clock: cada nuevo evento solo es respuesta al evento anterior al mismo. Este bus (como el SCSI) es más complejo de implementar, pues los dispositivos deben ser auto-temporizados.
Una transacción en un bus presenta 2 fases: envío de una dirección seguida del envío de datos. La velocidad de transmisión (Mbytes/seg) o “ancho de banda” de un bus está limitada por su longitud y por el número de dispositivos conectados al mismo. Su causa es la inercia de la velocidad de cambio de las señales eléctricas digitales debido en esencia al tiempo de carga/descarga de capacitores parásitos distribuidos a lo largo de las líneas de un bus, cuyo efecto aumenta con cada dispositivo conectado. Por tal motivo el bus local vinculado al procesador es de corta longitud frente a buses de E/S como el ISA, el SCSI o el USB, que por ser más lentos permiten longitudes mayores y más dispositivos conectados.

Jerarquía de buses
Muchos computadores se hicieron con un único bus. A medida que crece el número de dispositivos conectados aumenta la puja de los mismos por usar el bus, produciéndose “cuellos de botella”. Si bien puede mejorarse la velocidad de transferencia (como se con más líneas para datos, realizando transferencias de datos mediante grandes bloques de bytes sucesivos, arbitrajes rápidos y utilización de buffers) para disminuir el tiempo de ocupación por dispositivo. Ello no se condice con las cada vez mayores exigencias de velocidad de dispositivos para gráficos y video.
A los efectos de descongestionar el tráfico que tiene lugar si se usa un solo bus, hoy día los computadores presentan una jerarquía de buses de distintas velocidades y longitud, que por un lado minimiza la competencia por el acceso a memoria. Por otro permite conectar muchos periféricos reduciendo conflictos y tenerlos fuera del gabinete. Así, el bus que un el cache L2 con la UCP concentra todo el tráfico, que cuando el mismo no existía iba de memoria principal a la UCP por el bus que los une. Este ahora queda más despejado para transferir por ADM datos entre periféricos y memoria. Asimismo, las interfaces de los periféricos no se conectan al bus del sistema PCI, sino a otros buses de E/S como el ISA, USB o SCSI, de modo que al PCI solo están conectados los adaptadores inteligentes o puentes ISA/PCI, USB/PCI, SCSI/PCI, que aíslan al PCI de un numero grande de periféricos de velocidad dispar, conectados a dichos buses. Esto permite conectarlos con los buses de mayor longitud (SCSI, USB) fuera del gabinete, sin ocupar el número limitado conectores (“slots”) existentes. También dichos adaptadores evitan conflictos en relación con la configuración de IRQ y ports de las interfaces.
El nivel más alto de la jerarquía está constituido por el local bus que sale de la UCP, de muy alta velocidad y corta longitud, con muy pocos y veloces dispositivos conectados a él. Como estos operan con velocidades altas y no muy dispares, es recomendable que el bus sea sincrónico, por ejemplo para transferir entre memoria y el caché L2. Mediante un chip “puente” este bus se comunica con el bus PCI, al cual están conectados los buses de E/S citados, a los que se conectan los restantes componentes del computador.

El bus PCI, está ubicado en una jerarquía intermedia entre los buses ultra rápidos que salen de la UCP y los buses de E/S. Por él pasan datos desde o hacia la UCP, la memoria, y dispositivos periféricos.

Debe mencionarse que el denominado Port Acelerado para Gráficos (AGP), que funciona a loa Mhz de la UCP, está pensado como intermediario para la transferencias entre memoria y la tarjeta de video, de modo que se efectúen a máxima velocidad, a través del chip que contiene el puente PCI.

Bus ISA
Éste Bus se identifica en una motherboard, porque a sus líneas están conectados por soldadura, varios zócalos conectores (Slots) de color negro, donde pueden insertarse plaquetas de interfaces de periféricos. La función del Bus ISA, es permitir la comunicación entre la porción central, ubicada en la plaqueta principal, y los registros ports de dichas interfaces.
Los zócalos vinculados al bus, permiten expandir el número de periféricos de una PC, de donde resulta también su denominación de Bus de Expansión, habiendo sido creado por IBM para las primeras PC, de donde resulta también su denominación de "I/O Channell". Si bien IBM nunca publicó las normas mecánicas y eléctricas que debían cumplir los conectores, y el tipo de señal a transmitir por cada línea del Bus, éste se convirtió en un stándard de hecho, conocido como Industry Estándar Architecture (ISA), siendo otras denominaciones: Bus AT, Bus del Sistema, Bus Convencional, Bus de E/S e IBM PC Bus.
Los fabricantes de motherboards incorporaron el Bus ISA masivamente, y los proveedores de plaquetas interfaces también adecuaron las mismas para ser compatibles con los conectores de los zócalos de éste bus. De éste modo surgió una "Arquitectura Abierta", flexible, a la cual podrían conectarse periféricos de distintos fabricantes, con tal de que se proveyera la plaqueta Interface que cumpla con el estándar ISA. Esto, sin duda, fue uno de los factores que contribuyó a abaratar los precios de los periféricos y plaquetas, lo cual a su vez, provocó ventas masivas de PC, desarrollando las bases de la revolución informática actual. El Bus ISA sigue formando parte de más del 90% de las PC corrientes.
Cabe aclarar que en el Bus ISA, cuando se inserta una plaqueta nueva, se deben elegir las opciones para los parámetros siguientes: las direcciones que tendrán los registros que los componen, el número de identificación para solicitar interrupción, y otras señales, mediante llaves o puentes llamados "jumpers", cuya posición indican los fabricantes.

Bus VESA
En 1992, los fabricantes reunidos en la Video Electronics Standard Association (VESA), establecieron el estándar VESA VL, con especificaciones para la implementación del bus, señales eléctricas, y diseño constructivo de los zócalos conectores de éste bus.
Éstos se parecen a los conectores del Bus MCA de IBM, son de color marrón, tienen cincuenta y seis contactos por lado, y están dispuestos cerca de la CPU alineados con los zócalos del Bus ISA. Acorde a los estándares actuales, su número máximo es de tres.

Bus PCI
El Peripherial Component Interconnect (PCI) Bus, es otra forma de acceder al Bus Local desarrollado por Intel para el Pentium, después de que el Bus VESA dominara el mercado de las486. Es apto para PC y otros tipos de computadoras.
A diferencia del VESA, el bus se acopla al bus local a través de un chip controlador especial, y está pensado para soportar en sus zócalos (color blanco, de 124 conectores para 32 bits), además de las interfaces de video, disco rígido y red local, las plaquetas para multimedia, audio, video y otras.
El PCI funciona a 33 Mhz, con 32 y 64 líneas de datos transfiere hasta un máximo de 132 MB/Seg. Y 264 MB/Seg., respectivamente como el Bus VESA (32 bits solamente). Las plaquetas que se insertan en los zócalos PCI se auto-configuran, o pueden ser configuradas por el sistema, al igual que los Buses MCA, EISA y otros. Esto es, los circuitos están preparados para elegir automáticamente, las direcciones que tendrán los registros que los componen, el número de identificación para solicitar interrupción, y otras señales, de modo que no exista incompatibilidad con otras plaquetas conectadas.

Conexionado SCSI
Se trata de un conexionado para periféricos "inteligente" (con adaptador "SCSI"), que se conectan a un computador mediante una plaqueta interfaz SCSI ("Small Computer System Interface"), la cual se inserta en un zócalo ISA, EISA, MCA, VESA o PCI, según sea el bus para el cual se adquirió dicha plaqueta.
A una interfaz SCSI insertada en un bus de una PC, es factible conectar hasta siete periféricos externos, encadenados uno detrás del otro, ligados entre sí mediante cables apropiados.
Los periféricos a conectar pueden ser cualesquiera, con tal que su electrónica presente un adaptador SCSI. Por ejemplo, fabricantes venden discos duros y CD ROM para ser conectados sólo a una interface SCSI (o a otro periférico SCSI).
Esto último supone haber adquirido también una interfaz SCSI. Pero dado a que fueron apareciendo sucesivas normas SCSI (1, 2, y 3), cada vez con más prestaciones, y que en diseños anteriores, el software para una interfaz SCSI insertada en un bus puede no estar preparado para manejar periféricos con adaptador SCSI de otros fabricantes, es común que al querer adicionar periféricos en un Bus SCSI, existan problemas de compatibilidad.
El Bus SCSI se desarrolló en 1970 para grandes computadoras y fue popularizado por las Macintosh.
Éste tipo de bus suele ser una solución cuando se tiene un número de periféricos tal que los zócalos de los buses están ocupados, porque es externo y tiene una muy buena velocidad de transferencia, también permite compartir periféricos en redes locales, entre equipos distintos, o manejar conjuntos de discos múltiples (RAID).
La electrónica de los discos rígidos SCSI presenta un buffer de pista, para la lectura anticipada.
Así, en una cadena SCSI, mientras una unidad de disco envía desde su buffer datos por el conexionado SCSI, otros pueden estar con su cabezal buscando una pista, a la par que otros pasan a su buffer de pista la lectura realizada.

PCMCIA 
Hacia 1990, la PCMCIA estableció un estándar para tarjetas de memoria RAM o ROM del tamaño de una tarjeta de crédito (85,6 mm x 54 mm) y 3,3 mm de grosor (Tipo I), insertables en PC portátiles a través de un conector con 68 pines.
En el presente, y salvados muchos inconvenientes que presentaban, también se las conoce como "PC Cards", existiendo tarjetas de 8 mm de grosor (Tipo II) para portar módems o adaptadoras de red; y de 10,5 mm de grosor (Tipo III) para discos rígidos de hasta 170 Mb. También existen tarjetas para multimedia.
Llamadas tarjetas IC, de ROM y de RAM, utilizan una gran variedad de tipos de chips, incluyendo memoria RAM, ROM EEPROM, y FLASH ROM. Las tarjetas de RAM utilizan una batería para mantener cargadas las celdas. También podemos encontrar tarjetas PCMCIA que permiten una gran interfaz con periféricos durante los viajes.
Típicamente funcionan con 5 volts y consumen entre 150 y 200 mA, lo cual significa un 25% o más del consumo de una PC portátil. Requieren programas o drivers conocidos como Socket o Card Services y existen adaptadores para usarlas en la PC de escritorio.
Todas las tarjetas PCMCIA, se colocan en ranuras que aceptan dispositivos de entrada de datos y salida de información, del tamaño de tarjetas de crédito, como módems o radios celulares para enviar y recibir información a través de un sistema celular de voz existente (por ejemplo los modelos PC Tipo II Air Card PCMCIA Cellular Radio y la Air Card PCMCIA Módem), o tarjetas para la expansión de memorias o RAM no volátil para almacenamiento. Actualmente hay tres versiones estandarizadas: Tipo I, Tipo II y Tipo III.
Como dato afirmativo, debo decir que existe la Asociación Internacional de Tarjetas de Memoria para Computadoras Personales, que es una organización de compañías japonesas y de U.S. para estandarizar las tarjetas de memoria.




Nahuel Ferreyra, Alberto Diaz y Emiliano Bolzán