You are on page 1of 57

THE VON NEUMANN MODEL

En las primeras computadoras electrónicas, programar era sinónimo de conectar
cables. No existía la arquitectura en capas (layered architecture), por lo que
programar una computadora era más una hazaña de ingeniería eléctrica que un
ejercicio de diseño de algoritmos. Antes de que su trabajo en la ENIAC estuviera
completo, John W. Mauchly and J. Presper Eckert concibieron una manera más fácil
de cambiar el comportamiento de su máquina calculadora.
Ellos estimaron que los dispositivos de memoria, en la forma de líneas de
retardo de mercurio, podían proveer una manera de almacenar instrucciones de
programa. Esto terminaría por siempre con el tedio de recablear el sistema cada
vez que hubiera un nuevo problema por resolver, o uno viejo por depurar.
Mauchly y Eckert documentaron su idea proponiéndola como el fundamento de su
próxima computadora, la EDVAC. Desafortunadamente, mientras estaban envueltos en
el proyecto altamente secreto de ENIAC durante la segunda guerra mundial,
Mauchly y Eckert no podían publicar inmediatamente su revelación.
Tales prohibiciones, no se aplicaban a un número de personas trabajando en la
periferia del proyecto ENIAC. Una de estas personas era un famoso matemático
llamado John von Neumann. Después de leer la propuesta de Mauchly y Eckert para
el EDVAC, von Neumann publicó y publicitó la idea. Expresó el concepto de manera
tan efectiva que la historia le ha acreditado su invención. Todas las
computadoras de programas almacenados han llegado a conocerse como sistemas von
Neumann usando la arquitectura von Neumann.
La versión actual de la arquitectura de las computadoras de programas
almacenados (stored-program), satisface al menos las siguientes características:
· Consiste de tres sistemas de hardware: una unidad central de proceso (CPU) con
una unidad de control, una unidad aritmético lógica (ALU), registros (pequeñas
áreas de almacenamiento), un program counter, un sistema de memoria principal,
que almacena programas que controlan las operaciones de la computadora, y un
sistema de entrada y salida (I/O).
· Capacidad para llevar a cabo procesamiento secuencial de instrucciones.
· Contiene un solo camino (path), ya sea físico o lógico, entre la memoria
principal del sistema y la unidad de control del CPU, forzando la alternación de
ciclos de instrucción y ejecución. Este camino es referido a menudo como el
cuello de botella von Neumann.

La figura muestra como estas características trabajan juntas en los sistemas de
computadoras modernos. El sistema pasa todas sus I/O a través de la ALU (en
realidad a través del acumulador, que es parte de la ALU). Esta arquitectura
corre programas en lo que se conoce como el ciclo de ejecución von Neumann
(también llamado fetch-decode-execute cycle), el cual describe cómo trabaja la
máquina.
Una iteración de este ciclo es la siguiente:
1. La unidad de control hace un fetch de la siguiente instrucción del programa de
la memoria, usando el PC para determinar la ubicación de la misma.
2. La instrucción se decodifica en un lenguaje que la ALU puede comprender.
3. Cualquier dato (operando) requerido para ejecutar la instrucción es traído de
la memoria y ubicado en registros dentro de la CPU.
4. La ALU ejecuta la instrucción y ubica los resultados en registros o en la
memoria.
Las ideas presentes en la arquitectura de von Neumann han sido extendidas de
modo que los programas almacenados en medios de almaceniamento de acceso lento,

como discos duros, puedan ser copiados a medios de rápido acceso, volátiles,
como RAM, previo a la ejecución. Esta arquitectura también se ha simplificado en
lo que actualmente se llama el modelo de sistema de bus (system bus model) que
se muestra en la figura 1.5. El bus de datos mueve datos de la memoria principal
a los registros del CPU y viceversa. El bus de direcciones contiene la dirección
del dato a la que el bus de datos está accediendo actualmente. El bus de control
lleva las señales de control necesarias que especifican cómo debe llevarse a
cabo la transferencia de la información.
Otras mejoras a la arquitectura de von Neumann incluyen utilizar registros
indexados para direccional, agregar datos de punto flotante, usar interruciones
y I/O asíncronos, agregar memoria virtual y registros generales.

1.8 NON–VON NEUMANN MODELS
Hasta recientemente, casi todas las computadoras de propósito general utilizaban
el dieño de von Neumann. Sin embargo, el cuello de botella de von Neumann
continúa frustrando a los ingenieros que buscan maneras de construir sistemas
más rápidos que sean económicos y compatibles con el basto cuerpo de software
comercial disponible. Los ingenieros que no están obligados a mantener
compatibilidad con los sistemas de von Neumann son libres de usar muchos modelos
distintis de computar. Un número de subáreas cae en la categoría no-von Neumann,
incluyendo redes neurales (usando ideas de modelos del cerebro como paradigma de
computación), algoritmos genéticos (explotando ideas de la biología y la
evolución del ADN), computación cuántica y computadoras paralelas. Hoy, el
procesamiento paralelo resuelve algunos de los problemas más grandes casi en el
mismo modo que los colonos del viejo oeste resolvían sus problemas usando bueyes
paralelos. Si estaban usando a un buey para mover un árbol y el buey no era lo
suficientemente grande o fuerte, ciertamente no necesitaban tratar de criar un
buey más grande, usaban dos bueyes. Si una computadora no es lo suficientemente
rápida o poderosa, en lugar de tratar de desarrollar una computadora más rápida

y poderosa, por qué no usar simplemente múltiples computadoras. Esto es
precisamente lo que hace la computación paralela. Los primeros sistemas de
procesamiento paralelo se construyeron en los 60 y solo tenían dos procesadores.
Los 70s vieron la introducción de las supercomputadoras con 32 procesadores y
los 80s trajeron los primeros sistemas con más de 1000 procesadores. Finalmente
en 1999, IBM anunció la construcción de una super computadora llamada Blue Gene.
Este masivo computador paralelo contiene más de un millón de procesadores, cada
uno con su memoria dedicada. Su primera tarea es analizar el comportamiento de
moléculas de proteínas.
Sin embargo, incluso la computación paralela tiene sus límites. A medida que
aumenta el número de procesadores, también lo hace la sobrecarga de manejar cómo
las tareas se distribuyen a esos procesadores. Algunos sistemas de procesamiento
paralelo requieren procesadores extra sólo para manejar el resto de los
procesadores y los recursos que se les asignan.
Sin importar cuantos procesadores se pongan en un sistema, o cuantos recursos se
les asignen, de alguna manera, en algun lugar, un cuello de botella es propenso
a desarrollarse. Lo mejor que se puede hacer para remediar esto es asegurarse de
que las partes más lentas del sistema sean las menos utilizadas. Esta es la idea
detrás de la ley de Amdahl, que asegura que la mejora obtenida en el rendimiento
de un sistema debido a la alteración de uno de sus componentes está limitada por
la fracción de tiempo que se utiliza dicho componente. La premisa subyacente es
que cada algoritmo tiene una parte secuencial que en última instancia limita el
aumento de velocidad que puede ser alcanzado por la implementación del
multiprocesador.

CAPITULO 6 – MEMORIA
La mayoría de las computadoras se constuyen utilizando el modelo de Von Neumann,
el cual está centrado en la memoria. Los programas que desempeñan el
procesamiento están almacenados en memoria.
Examinamos una pequeña memoria de 4x3 bits en el capítulo 3 y aprendimos a
direccional memoria en los capítulos 4 y 5. Sabemos que la memoria está
lógicamente estructurada como un arreglo lineal de locaciones, que se
direccionan desde 0 hasta la máxima dirección de memoria que el procesador pueda
direccionar.
ETC…

6.2 TIPOS DE MEMORIA
Continuamente se introducen nuevas tecnologías de memoria que tratan de igualar
las mejoras en el diseño de la CPU – la velocidad de la memoria tiene que, de
alguna forma, mantener el ritmo de la CPU, o la memoria se convierte en un
cuello de botella.
Las mejoras en la memoria principal para mantener el ritmo de la CPU no son tan
críticas debido a la memoria caché. La memoria caché es un tipo de memoria
pequeña, de alta velocidad (y por lo tanto alto costo), que sirve como buffer
para datos frecuentemente accedidos. El costo extra de usar tecnologías muy
rápidas para la memoria, no siempre puede ser justificado porque memorias más
lentas pueden “esconderse” detrás de sistemas de caché de alta performance.
Sin embargo, antes de discutir la memoria caché vamos a ver las diversas
tecnologías de memoria.
Aunque existe un largo número de tecnologías de memoria, solo hay dos tipos
básicos: RAM (random access memory) y ROM (read-only
memory). RAM es un nombre poco apropiado, más apropiado sería llamarla de
lectura-escritura. RAM es la memoria a la que se refieren las especificaciones
de las computadoras. Es también la “memoria principal” a la que continuamente
hacemos referencia. Frecuentemente llamada memoria primaria, la RAM se utiliza
para almacenar programas y datos que la computadora necesita al ejecutar
programas, pero es volátil, y pierde su información una vez que se apaga. Hay
dos tipos generales de chips que se usan para construir el cuerpo de la memoria
RAM en las computadoras de hoy: SRAM y DRAM (static y dynamic RAM)
La RAM dinámica está construida de pequeños capacitores que pierden electricidad.
La DRAM requiere una recarga cada tantos milisegundos para mantener sus datos.
En contraste, la tecnología estática, mantiene su contenido mientras haya
electricidad. La SRAM consiste en circuitos similares a los flip-flops D, es más
rápida y mucho más cara que la DRAM, sin embargo, los diseñadores usan DRAM
porque tiene mayor densidad (puede almacenar más bits por chip), usa menos
energía, y genera menos calor que la SRAM. Por estas razones, ambas tecnologías
usualmente se combinan: DRAM para memoria principal y SRAM para caché. La
operación básica de todas las memorias DRAM es básicamente la misma, pero hay
“muchos sabores” incluyendo:

cada una con distintas . juguetes y la mayoría de los automóviles utilizan chips de ROM para mantener la información cuando no hay energía. and Direct Rambus (DR) DRAM. todo el chip tiene que ser borrado primero. la mayoría de las computadoras contienen una pequeña cantidad de ROM que almacena información crítica necesaria para operar el sistema como la lo necesario para arrancar la computadora. y algunos tipos son mucho menos eficientes y por lo tanto más baratos que otros. con la ventaja de que es reprogramable (borrar una EPROM requiere una herramienta especial que emite luz ultravioleta). Hay cinco tipos básicos diferentes de ROM: ROM. Además de la RAM. Fast-Page Mode (FPM) DRAM. Extended Data Out (EDO) DRAM. como impresoras laser que almacenan sus fuentes en ROMs. más caro es su costo por bit de almacenamieto. Burst EDO DRAM (BEDO DRAM). Las ROM se utilizan también en calculadoras y periféricos.3 JERARQUIA DE LA MEMORIA Una de las consideraciones más importantes para comprender las capacidades de performance de un procesador moderno es la jerarquía de la memoria. no toda la memoria se crea de la misma manera. cuando más rápida es la memoria. Esto hace que la memoria flash sea más rápida que la EEPROM. PROMs pueden ser programadas por el usuario con el equipo apropiado. Utilizando una jerarquía de memorias. mientras que las ROMS son hardwired. Los diferentes tipos de SRAm incluyen SRAM sincrónica. EEPROM y memoria flash. un byte por vez. como hemos visto. Flash memory es escencialmente EEPROM con el beneficio agregado de que la información puede ser escrita o borrada en bloques. asincrónica y pipeline Bursa SRAM. Desafortunadamente. EPROM. eliminando la limitación de “un byte por vez”.Multibank DRAM (MDRAM). Muchos electrodomésticos. EEPROM (electrically erasable PROM) elimina muchas de las desventajas de la EPROM: no se requieren erramientas especiales para borrarla (esto se realiza aplicando un campo eléctrico) y se pueden borrar solo porciones del chip. EPROM (erasable PROM) es programable. Una vez programado. PROM. Synchronous-Link (SL) DRAM. Este enfoque se llama memoria jerárquica Como regla. 6. Para reprogramar la EPROM. PROM (programmable read-only memory) es una variante de la ROM. Para manejar esta disparidad. Synchronous Dynamic Random Access Memory (SDRAM). los datos e instrucciones en los PROM no pueden cambiarse. los sistemas de las computadoras actuales usan una combinación de tipos de memoria para proveer la mejor performance al mejor costo. Este tipo de memoria es utilizada también en sistemas embebidos o cualquier sistema donde la programación no necesita cambiar. Double Data Rate (DDR) SDRAM. ROM no es volátil y siempre mantiene los datos. las PROMs tienen fusibles que pueden fundirse para programar el chip.

• Miss rate—El porcentaje de accesos a memoria no encontrados en un nivel de memoria dado. podemos afrontar tiempos de acceso más largos. En cada una de las computadoras actuales hay una pequeña porción de memoria de muy alta velocidad llamada caché. • Hit rate—El porcentaje de accesos a memoria encontrados en un nivel de memoria dado. más rápida y más cara se vuelve la memoria. más el tiempo adicional para entregar los datos solicitados al procesador. Cuando más cerca está la memoria del procesador. con la distancia medida por el número de ciclos de máquina requeridos para el acceso. donde los datos de locaciones de memoria frecuentemente utilizados pueden estar temporalmente almacenados. La siguiente terminología se utiliza para referirse a esta jerarquía de memoria: • Hit—El dato requerido reside en un nivel de memoria dado (típicamente. Esto permite a los diseñadores crear una computadora con performance aceptable a un costo razonable. usando solo un pequeño número de chips rápidos (y caros). un sistema de computadora puede exhibir performance por sobre lo que sería posible sin una combinación de los varios tipos. uno puede mejorar la velocidad de acceso efectiva de la memoria. Así. compuesta de un disco rígido y varios medios removibles. (El tiempo para procesar un miss es típicamente significantmente más largo que el tiempo para procesar un hit. nos importa el hit-rate solo en niveles más altos de memoria) • Miss—El dato requerido no se encuentra en el nivel dado de memoria. Esta caché es conectada a una mucho más grande memoria principal. Clasificamos la memoria de acuerdo a su “distancia” del procesador. • Hit time—El tiempo requerido para acceder a la información en un nivel dado de memoria. Los tipos básicos que normalmente constituyen la memoria jerárcica incluyen registros. las tecnologías más lentas se utilizan para estas memorias.velocidades de acceso y capacidades de almacenamiento. • Miss penalty—El tiempo requerido para procesar un miss. Esta memoria es complementada por una más grande aún memoria secundaria. las memorias más ràpidas tienden a ser más pequeñas que las más lentas.) . y las más rápidas se utilizan para memorias más cerca de la CPU. Utilizando un sistema jerárquico. memoria principal y memoria secundaria. Cuanto mejor es la tecnología.Hit Rate. A medida que la memoria se aleja del procesador principal. más rápido debería ser. la cual es típicamente de mediana velocidad. caché. De este modo. Miss Rate = 1 . debido al costo. el cual incluye remplazar un bloque en un nivel de memoria superior.

Las memorias más cercanas al tope tienden a ser menores en tamaño. lo cual. La esperanza es que estos datos extras sean referenciados en el futuro cercano. Para cualquier dato dado. y así sucesivamente. Si el dato se encuentra en este nivel. todo el bloque en el que reside el dato es transferido a caché. el pedido es reenviado al siguiente nivel más abajo en la jerarquía y el proceso de búsqueda comienza nuevamente. sucede así. Los números a la izquierda indican tiempos de acceso típicos. X+2… devolviendo de este modo un bloque completo de datos al nivel mayor de memoria. el pedido se reenvía al siguiente nivel más abajo. al mismo tiempo. estas memorias más pequeñas tienen mayor performance y por lo tanto mayor costo (por bit) que las memorias que se encuentran más abajo en la pirámide. La jerarquía de la memoria es funcional porque los programas tienden a presentar una propiedad conocida como localidad la cual frecuentemente permite al . sin embargo. puede ser cargado rápidamente en la CPU. Si el dato se encuentra en caché. porque los registros tienden a ser de propósito más especial). los datos localizados en las direcciónes X+1. y barato) de los niveles de jerarquía responde a un pedido de más altos niveles por el contenido de la locación X. en la mayoría de los casos. Si no.Este dibujo en forma de pirámide nos ayuda a indicad los tamaños relativos de estas varias memorias. grande. La idea clave es que cuando el más bajo (lento. Si no. también envíe. el procesador envía su pedido a la partición más rápida y pequeña de memoria (típicamente caché.

4 MEMORIA CACHÉ El procesador de una computadora es muy rápido y está constantemente leyendo información de la memoria. aunque haya un miss para el. puede que haya varios hits en caché con el recientemente devuelto bloque. en lugar de simplemente transferir el dato solicitado a un nivel más alto. De este modo. • Spatial locality—Localidad espacial: Los accesos tienden a estar agrupados en el espacio de direcciones (por ejemplo en arreglos o loops) • Sequential locality—Localidad secuencial: las instrucciones tienden a ser accedidas secuencialmente. 6. y aún provee casi las mismas velocidades de acceso que resultarían de usar una memoria muy rápida pero muy cara. solo una pequeña cantidad del espacio completo de memoria está siendo accedido en un tiempo dado. Esta agrupación de referencias a memoria es un ejemplo de localidad de referencias. si se accede a la posición de memoria X en un tiempo t. 6.1 Localidad de las referencias En la práctica.procesador acceder a los datos devueltos por las direcciones X+1. debido a la localidad. el PC en MARIE es incrementado en uno después de cada fetch. cuando se procesa un miss. Hay tres formas básicas de localidad: • Temporal locality—Localidad temporal: Datos accedidos recientemente tienden a ser accedidos nuevamente en el futuro cercano. Debido a la localidad de referencia. El principio de localidad provee la oportunidad para un sistema de usar una pequeña cantidad de memoria muy rápida para efectivamente acelerar la mayoría de los accesos a memoria. el bloque completo que contiene el dato es transferido. Por ejemplo. para X. De esta forma. y los valores en ese espacio se acceden repetidamente. . X+2 y así sucesivamente. Esta localidad puede ser explotada implementando la memoria como jerarquía. podemos copiar esos valores de una memoria más lenta a una más pequeña pero más rápida que se encuentra más alta en la jerarquía. Esto resulta en un sistema de memoria que puede almacenar una larga cantidad de información en una gran memoria de bajo costo. porque los tiempos de acceso de la memoria son más lentos que la velocidad del procesador. hay una alta probabilidad que la posición de memoria X+1 sea accedida en un futuro cercano. digamos caché. en ausencia de bifurcaciones. los procesadores tienden a acceder a la memoria en siguiendo un patrón. Una memoria caché es una pequeña. estos datos pueden ser cargados rápidamente de la memoria más rápida. lo que significa que frecuentemente tiene que esperar a que llegue la información.3. es probable que los datos adicionales en el bloque se necesiten en un futuro cercano. Típicamente. y de ser así. De este modo.

es posible que necesite una de otro tamaño muy pronto. La caché puede ser tan desorganizada como un escritorio y organizada como una agenda. agarramos otra. volvemos a bajar…. Vamos al garage. Esto es lo que hace la memoria caché: almacena datos que han sido accedidos y datos que es posible que sean accedidos por el CPU en una memoria más rápida y más cercana. volvemos al garage. los datos deben ser accesibles (locatable). cinta métrica. más que requiriendo accesos a memoria para obtener los datos. De cualquier forma. agarramos el taladro. permanecen almacenadas en el lugar que está más lejos y requiere más tiempo de acceso.temporaria. mejor aún “una vez que haya terminado con cierta herramienta seguramente necesitaré otra. Ahora decidimos atornillar las maderas. agarramos la sierra. llaves inglesas. Más ejemplos: guía telefónica y agenda. así que juntamos una pequeña caja de herramientas y la llevamos al sótano”. volvemos al garage. volvemos al sótano. van a la librería (memoria principal) y traen a su casa (memoria caché) todos los libros que podrían llegar a necesitar. martillos. Hemos agarrado algunas de las herramientas para fácil y rápido acceso. Otra analogía del caché está en la compra de comestibles: Rara vez vamos a comprar un solo item. cuando los estudiantes hacen investigaciones. volvemos corriendo al sótano. mantenemos las herramientas que necesitamos más cercas. así que agarramos todo el set de llaves”. Existen muchísimos ejemplos de caching fuera de las computadoras. cortamos la madera. dejamos la cinta. La memoria caché en una computadora difiere de los ejemplos cotidianos en un modo muy importante: La . tu casa es el caché. De este modo. Sabemos que este arreglo va a requerir taladros. Supongamos que tenemos que hacer un arreglo en el sótano. Pensemos en el dueño de una casa con un baúl muy grande de herramientas en el garage. vemos que la llave es del tamaño equivocado. Mantenerlos en mente ayuda a entender el caching de la memoria de la computadora. pero rápida memoria que el procesador usa para información que es probable que necesite en un futuro muy cercano. Lo primero que hay que hacer es medir y cortar madera. tomamos la cinta métrica del baúl de herramientas. medimos la madera. dejamos el taladro agarramos una llave. varios tipos de sierras y varios tipos y tamaños de destornilladores. Las herramientas que es menos probable que usemos. ¿Trabajarías de este modo? No! Siendo una persona razonable pensas “si necesito una llave. copiando datos utilizados frecuentemente en el caché. para tenerlas rápido. volvemos al sótano. volvemos al sótano. La tienda es similar a la memoria principal. agujereamos la madera. oficina cajones (memoria principal) escritorio desorganizado (memoria caché) La memoria caché trabaja con los mismos principios básicos que los ejemplos anteriores. Vamos a la cochera. compramos los que vamos a requerir de inmediato y los que posiblemente necesitemos en el futuro. volvemos al garage.

el dato que se encuentra en la dirección de memoria principal 2E3 podría estar ubicado en la primer ubicación del caché. ¿Qué hace “especial” a la caché? La caché no se accede por direcciones si no por su contenido. a priori. en lugar de almacenarlo en memoria principal. La relación entre estas dos puede ilustrarse usando el ejemplo del almacén. la dirección del dato en el caché no es la misma que en la memoria principal. En una computadora personal típica. Bajo la mayoría de los esquemas de mapeo de la caché. el caché de nivel 2 (L2) es de 256K o 512K. Si la probabilidad de usar algo más en ese bloque es alta. El propósito de la caché es acelerar los accesos a memoria almacenando data recientemente utilizada más cerca al CPU. Mientras que la memoria principal está compuesta típicamente de DRAM con.computadora realmente no tiene forma de saber. no es viable usar la tecnología encontrada en la memoria caché para construir toda la memoria principal. digamos. cuales son los datos más probables de ser accedido. mientras que la L2 reside entre el CPU y la memoria principal. debe almacenar datos útiles. así que usa los principios de localidad y transfiere bloques enteros de la memoria principal al caché siempre que tiene que hacer accesos a memoria.1 Esquemas de mapeo de la caché Para que la caché sea funcional. Como esta memoria más rápida es más cara. la caché está típicamente compuesta de SRAM. es más rápida que L2. estos datos se vuelven inútiles si el CPU no puede encontrarlos. Cuando accede a datos o instrucciones. La regla de oro general es hacer la caché lo suficientemente pequeña para que el costo por bit se acerque a la memoria principal. y el tamaño (que afecta al espacio que hay para el nuevo bloque). Sin embargo. L1 se encuentra en el procesador. 6. tranferir el bloque completo ahorra tiempos de acceso. el CPU primero genera una dirección de memoria principal. Por esta razón a veces se la llama “memoria de contenido direccionable” (content addressable memory o CAM). La caché no nececesita ser muy grande para desempeñarse bien. pero lo suficientemente grande para ser beneficiosa. 60ns de tiempo de acceso. por lo tanto. Aunque la caché no sea tan larga como la memoria principal es considerablemente más rápida. proveyendo más rápido acceso con un ciclo mucho más corto de tiempo que la DRAM (un típico tiempo de acceso a caché es de 10ns). la heladera es la caché L2 y la mesa la caché L1. entonces. ¿Cómo encuentra entonces el CPU los datos cuando han sido copiados . L1. Para simplificar este proceso de encontrar el dato deseado. La ubicación de este bloque en memoria caché depende de dos cosas: La política de mapeo del caché.4. Por ejemplo. Si el dato se ha copiado en el caché. se utilizan muchos algoritmos de mapeo. típicamente 8K o 16K. El tamaño de la memoria caché varía enormemente. si el almacén es la memoria principal. las entradas deben ser chequeadas o buscadas para ver si el valor que se requiere está almacenado en la caché. La caché de nivel 1 (L1) es más pequeña.

Esto se hace asociando un valid bit a cada bloque de caché. y no tener que hacer muchos viajes más al garage. este esquema es existoso por el principio de localidad – si una palabra ha sido referenciada. (El tag es un grupo especial de bits que se deriva de la dirección de memoria principal y es almacenado con su correspondiente bloque en caché). Por ejemplo. Cómo los utilizamos depende de el esquema de mapeo particular que estemos usando. El esquema de mapeo determina donde se ubica el dato cuando es copiado originalmente al caché y también provee un método para que la CPU encuentre datos previamente copiados cuando busca en el caché. Esto es un poco diferente para el mapeo asociativo. Como acceder a una palabra en caché es más rápido que acceder a una palabra en memoria principal.Todos los mapeos de caché requieren un campo de palabra. hay una alta probabilidad de que las palabras en la misma vecindad general sean referenciadas también. o donde tiene que ser ubicado si no está (caché miss). En este punto. El bloque de caché referenciado se chequea para ver si es válido. La memoria principal y el caché están ambos divididos en el mismo tamaño de bloques (el tamaño de estos bloques varía). esperas tener varios “hits” mientras trabajás en tu proyecto. Primero dividimos los bits en distintos grupos que llamamos campos. primero se busca en el caché para ver si la palabra solicitada está ahí. tenés un “miss” y tenes que ir al garage. Así que ¿cómo utilizamos los campos en la dirección de memoria principal? Uno de los campos apunta a la ubicación en caché en donde reside el dato si es que está en caché (caché hit). Si los tags son iguales entonces encontramos el bloque deseado (tenemos un hit). Como se mencionó anteriormente. Si el bit es 0 significa que ese bloque no es válido (tenemos un miss) y debemos acceder a la memoria. Cuando la palabra no es encontrada en caché. Entonces. Dependiendo del esquema de mapeo puede haber dos o tres campos. comparamos el tag en el bloque de caché a el campo tag de nuestra dirección. la memoria caché acelera el tiempo total de acceso. Esta conversión se hace dando especial significado a los bits en la dirección de memoria principal. De esta forma. Si es 1 significa que es válido (podríamos tener un hit pero falta un paso más para estar seguros). una palabra perdida usualmente resulta en muchas palabras encontradas. tenemos que encontrar la palabra deseada en el bloque. Veremos tres de estos posibles esquemas: Caché de mapeo directo . los campos restantes son determinados por el esquema de mapeo. Esto puede hacerse utilizando una porción diferente de la dirección de memoria principal llamada campo de palabra. todo el bloque de memoria en el que reside la palabra es cargado en el caché. Si juntás un grupo de herramientas que podrías necesitar y volvés al sótano. Cuando se genera una dirección de memoria principal. cuando estás en el sótano y necesitás herramientas por primera vez. sin embargo.al caché? El CPU utiliza un esquema de mapeo específico que “convierte” las direcciones de memoria principal en una ubicación de caché.

El mapeo directo mapea el bloque X de memoria principal al bloque Y de caché. 30.La caché de mapeo directo asigna “caché mappings” utilizando un enfoque modular. si el caché tiene 10 bloques entonces el bloque 0 de memori principal mapea al bloque 0 de caché. debería quedar claro que los bloques de memoria principal compiten por ubicaciones de caché. Como hay más bloques en memoria principal que en Caché. Esto se ilustra en la figura 6. En esta figura hay dos bloques válidos. Como se indica en la figura 6. Por ejemplo. los bloques 0 y 10 (y 20. El bloque 1 tiene las palabras identificadas con el tag“11110101”. mod N donde N es el número total de bloques en caché. almacena más que solo los datos copiados por la memoria. Los otros dos bloques de caché no son válidos. el bloque 0 contiene multiples palabras de la memoria principal identificadas usando el tag “00000000”. el 9 al 9.….2 De este modo. Si miramos más de cerca la caché. Comentario: Buscar traducción . ¿Cómo sabe la caché que bloque se encuentra residiendo en el bloque de caché 0 en un tiempo dado? La respuesta es que cada bloque se copia a la caché y se identifica con el tag previamente descripto.3. etc) todos compiten por el bloque 0. y el 10 al 0. el 1 al 1.

Como se mencionó anteriormente. Necesitamos 4 bits para seleccionar un bloque específico en la caché. El campo palabra (a veces llamado el campo offset) identifica unívocamente una palabra de un bloque específico. el caché 16 bloques y cada bloque 8 palabras. debe contener el número de bits apropiado para hacer esto. el tag para cada bloque se almacena con ese bloque en caché. el campo tag le permite al sistema diferenciar entre los bloques 0 y 16. Esto también es cierto para el campo bloque – debe seleccionar un bloque único en la caché. Sabemos que cada dirección de memoria requiere 14 bits. de este modo.4. Las direcciones binarias del bloque cero . este tag es almacenado con el bloque y unívocamente identifica a este bloque. De esto determinamos que la memoria tiene 211 bloques. por lo que el campo del bloque consiste en los 4 bits del medio. El tamaño de cada campo depende de las características físicas de la memoria principal y del caché. Cuando un bloque de memoria principal se copia al caché. De estos 14 bits los 3 que están más a la derecha reflejan el campo de la palabra (necesitamos 3 bits para identificar unívocamente a las 8 palabras del bloque). la dirección de memoria principal en binario es particionada en los campos que muestra la figura 6. Ejemplo: supongamos que la memoria tiene 214 palabras. El campo tag son los bits restantes. El total de los tres campos debe por supuesto sumar el número de bits en una dirección de memoria principal. como los bloques de memoria principal 0 y 16 ambos mapean al bloque 0 del cache. En este ejemplo.Para realizar el mapeo directo. Los restantes 7 son el campo tag.

00 indica bloque 0.Una dirección de memoria tiene 4 bits . La computadora. lo cual significa que el bloque 4 de memoria principal con las . entonces el bloque 4 ya se encuentra actualmente en el bloque de caché. Este dirección en binario es: 1001. Supongamos que generamos la dirección de memoria principal 9. sin embargo. utiliza la dirección actual de memoria para determinar el bloque de mapeo del cache. Si el tag del caché es 1. miremos un ejemplo más pequeño. Cuando el CPU genera esta dirección primero toma los bits del campo de bloque 00 y los usa para dirigirlo al bloque apropiado en caché. Para ver como difieren estas direcciones. El de la palabra es de un bit (solo necesitamos un bit para diferenciar las dos palabras del bloque). Asumiendo que los tags son iguales.difieren de las del blque 16 en los 7 bits más a la izquierda. Podemos ver por el mapeo que está en el bloque 4 de memoria principal y debería mapear al bloque 0 (lo cual significa que los contenidos en el bloque de memoria principal 4 deberían copiarse al bloque de caché 0). Asmiendo que la caché es de 4 bloques en tamaño (total 8 palabras). el campo del bloque es de 2 bits (para diferencias 4 bloques en memoria principal). sabemos: .Los cuatro bits se dividen en tres campos. por loque los tags son diferentes y únicos. Supongamos que tenemos un sistema que usa mapeo directo con 16 palabras en memoria principal dividido en 8 bloques (2 palabras por bloque). Si el tag es 0 entonces el bloque 0 de memoria principal se encuentra en el bloque 0 de caché. el tag es de 1 bit (el restante).

una caché con 16 bloques de 8 palabras cada uno. el campo de la palabra. En lugar de especificar una dirección única para cada bloque de memoria. si se encuentra una coincidencia el bloque ha sido encontrado (el tag identifica unívocamente a un bloque de memoria principal). 26 bloques/lineas en caché cada uno con 23 palabras => 29 palabras en caché => 215/29 = 26 bloques de memoria principal ¿? Tag 6) Fully Associative Cache La caché de mapeo directo no es tan cara como otras porque el esquema de mapeo no requiere de ninguna búsqueda. Cuando se busca en caché por un bloque especifico de memoria principal. El único modo de encontrar un bloque mapeado de este modo. es bastante cara. Si tenemos un sistema con direcciones de memoria de 15 bits y 64 bloques de caché cada uno de 8 palabras. Como el bit es uno seleccionamos la palabra con offset 1 lo cual resulta en la devolución de los datos copiados de la dirección de memoria principal 9. donde las páginas tienen un índice alfabético. la dirección de memoria principal se particiona en dos. un campo de bloque de 6 bits y un campo de tag de 6 bits. por lo tanto. Esto es. direccionamiento a palabra. cuando una dirección de memoria principal se convierte en una dirección de caché. Esto requiere que toda la caché sea construida de memoria asociativa así puede buscarse en paralelo. Si no hay coincidencias. Cada bloque de memoria principal tiene una ubicación específica a la que se mapea en caché. el tag y la palabra. el campo tag de la dirección se compara con todos los tags válidos en caché. Usando mapeo asociativo. si un bloque ya esta ocupando la posición de caché en la que un nuevo bloque debería ser ubicado. Con el mapeo directo. simplemente examinando el campo del bloque. o sobrescribirlo si no fue modificado). La memoria asociativa requiere hardware especial para permitir la búsqueda asociativa y. es buscar en toda la caché. se usa para seleccionar una de las dos palabras del bloque. podemos ver el extremo opuesto: permitir que un bloque de memoria principal de aloje en cualquier parte del caché. (215 direcciones. una simple búsqueda debe comparar el tag solicitado con todos los tags en caché para determinar si el bloque deseado está en caché. Por ejemplo con una memoria principal de 214 palabras. el campo de palabra es 3. el CPU sabe exactamente donde buscar en el caché ese bloque de memoria. Tenemos un campo de palabra de 3 bits. entonces tenemos un miss y el bloque debe ser transferido de memoria principal. Este tag debe ser almacenado con cada bloque en caché.direcciones 8 y 9 reside en el bloque de caché 0. Esto es similar a las agendas. Con el mapeo totalmente asociativo. el bloque que está en caché debe eliminarse (escribirse devuelta a memoria principal si fue modificado. cuando se llena la caché. 1. necesitamos un algoritmo de reemplazo para decidir qué bloque . pero ahora el campo tag es de 11 bits.

El tag y la palabra tienen el mismo rol que en los ejemplos anteriores. Supongamos que estamos usando mapeo asociativo por conjuntos de dos vias. La caché de mapeo directo es un caso especial de asociatia por conjuntos de Nvías donde el tamaño del set es 1. como también LRU. el campo palabra es de 3 bits y el tag de 8 bits. requiere que un tag más largo se almacene con el bloque (lo cual resulta en una caché más grande) además de requerir hardware especial para buscar simultáneamente en todos los bloques de la caché (lo que implica una caché mucho más cara). En el mapeo asociativo por conjuntos la memoria principal se particiona en tres: el campo tag. supongamos que estamos corriendo un programa en la arquitectura descripta en ejemplos anteriores. Sin embargo. después el 0 después el 16 y así sucesivamente cuando ejecuta instrucciones. Para ver como el mapeo directo limita el uso de la caché. Por ejemplo. el campo set es de 3 bits. Un sencillo algoritmo FIFO podría funcionar. . las direcciones mapean a un conjunto de varios bloques de caché. hay dos bloques de caché por set. Set Associative Cache Devido a su velocidad y complejidad. Como ambos bloques mapean a la misma dirección. Supongamos que el programa está usando el bloque 0. una combinación de los dos anteriores. Con una memoria principal de 214 palabras. El tercer esquema de mapeo que introducimos es el de mapeo de caché asociativo por conjuntos de n-vias (N-way set associative cache mapping). Aunque el mapeo directo no es caro es muy restrictivo. el campo set y el campo palabra. después el 16. la caché asociativa es muy cara. significa que el programa repetidamente va a tirar el 0 para traer el 16 y viceversa. Si cada set tiene dos bloques entonces hay 8 sets en caché. Existen muchos algoritmos de reemplazo que pueden utilizarse. El campo set indica a que set de la caché mapea el bloque de memoria principal. La diferencia importante es que en lugar de mapear a un único bloque de caché. en el caché asociativo por conjuntos de dos vías. una caché de 16 bloques cada bloque con 8 palabras. por lo tanto. Este esquema es similar al mapeo directo ya que usa la dirección para mapear el bloque a una cierta ubicación de caché.vamos a sacar del caché (lo llamamos el victim block). aunque el resto de los bloques de la caché no estén siendo utilizados. La caché totalmente asociativa soluciona este problema permitiendo que el bloque de memoria se ubique en cualquier lado. Necesitamos un esquema intermedio.

Podemos adivinar que cualquier valor que no ha sido usado recientemente es poco probable que se vuelva a necesitar pronto. Con el mapeo directo. Por ejemplo. y elegir como víctima el bloque que ha sido menos utilizado recientemente. Hay varias politicas de reemplazo populares. Este es el algoritmo LRU. hay maneras de aproximarse al LRU. Sin embargo. efectivamente. El algoritmo óptimo garantiza la taza más baja posible de miss. Tenemos varias opciones. Con este algoritmo. Un algoritmo que pudiera mirar a futuro para precisar cuales bloques mantener o eliminar en base a estos dos criterios sería el mejor. si hay disputa por un bloque en caché hay una única acción posible: eliminar el bloque existente para hacer espacio para el nuevo. Una que no es práctica que puede usarse como punto de referencia (benchmark) para medir a todas las demás es el algoritmo óptimo Queremos mantener valores en caché que van a necesitarse pronto nuevamente y deshacernos de aquellos bloques que no volveremos a necesitar o que no necesitaremos por algún tiempo. necesitamos políticas de reemplazo para determinar el bloque “víctima” que será removido de la caché.2 Políticas de reemplazo En la caché de mapeo directo. Desde un punto de vista práctico no podemos mirar en el futuro. De todas formas. Este proceso se llama reemplazo. Con el caché de mapeo asociativo por conjuntos de N-vías. mejor. Queremos reemplazar el bloque que no va a ser usado por mayor tiempo a futuro. pero podemos correr un programa y volver a correrlo para. Cuando usamos caché totalmente asociativa hay K posibles locaciones (donde K es el número de bloques en caché) para los cuales una dirección de memoria principal dada podría mapear.4.6. Necesitamos algoritmos que se aproximen lo mejor posible al algoritmo óptimo. Otro enfoque es RANDOM El problema con LRU y FIFO es que hay situaciones de referenciacion degeneradas que pueden hacer que constantemente estemos tirando un bloque y volviendolo a traer a memoria repetidamente. Podemos mantener un registro de la última vez a la que cada bloque fue accedido (asignarle un timestamp al bloque). conocer el futuro. no se necesitan políticas de reemplazo porque la ubicación para cada nuevo bloque está predeterminada. Cuanto más se acerca el desempeño al algoritmo óptimo. podríamos considerar la localidad temporal. Esto es lo que hace el algoritmo óptimo. para la caché totalmente asociativa y la asociativa por conjuntos. el bloque que ha estado en caché por mas tiempo (sin importar cuan recientemente haya sido usado) se selecciona como víctima para remover del caché. . El algoritmo que determina el reemplazo se llama “política de reemplazo”. el algoritmo óptimo solo se usa como medida para determinar cuan bueno o malo es otro algoritmo. Como no podemos ver el futuro en cada programa que corremos. un bloque puede mapear a cualquiera de los N bloques diferentes en un set dado. Luego podríamos aplicar el algoritmo óptimo en la segunda corrida. Desafortunadamente LRU requiere que el sistema mantenga la historia de accesos por cada bloque de caché lo cual requiere un espacio significante y disminuye la velocidad de operación del caché. FIFO es otro enfoque popular.

supongamos que cada tiempo de acceso a caché es de 10ns.Alguna personas dicen que el reemplazo aleatorio.3 Tiempo de acceso efectivo y tasa de hit La performance de la memoria jerárquica se mide por su tiempo de acceso efectivo (EAT). Sin embargo. Esta fórumula puede extenderse par aplicarse a memorias de tercer o incluso cuarto nivel. nunca “colapsa” Desafortunadamente.4. EAT es una medida ponderada promedio que usa el hit ratio y los tiempos relativos de acceso de los sucesivos niveles de la jerarquía. El algoritmo elegido por lo general depende de cómo será usado el sistema. la programación orientada a objetos puede causar que los programas muestren localidad menor a la óptima. este sistema se desempeña como si tuviera una única gran memoria con un tiempo de acceso de 11ns. 6. Por esa razón los diseñadoras usan algoritmos que se desempeñan bien en una amplia variedad de circunstancias. La fórmula para calcular el tiempo de acceso efectivo de una memoria de nivel dos está dada por: Donde H es el hit rate del caché. No hay un único algoritmo (práctico) que sea el mejor para todos los escenarios. En particular. es dificil tener un verdadero algoritmo de reemplazo aleatorio. Accesscc es el tiempo de aceso del caché y AccessMM es el tiempo de acceso a memoria. o por el tiempo promedio por acceso. El tiempo promedio que le toma al procesador acceder a un item en su memoria de segundo nivel sería entonces: Si miramos a los tiempos de acceso durante un largo período de tiempo. Otro ejemplo de mala localidad puede verse en los accesos a arreglos de Comentario: Buscar en inet un termino más amigable para never trashes . porque puede disminuir el desempeño promedio.4. si los programas tienen mala localidad. Una caché con hit rate de 99% permite al sistema desempeñarse muy bien. la memoria caché se “rompe” y la performance de la memoria jerárquica es pobre. el tiempo de acceso a memoria principal es de 200ns y el hit rate es de 99%. Por ejemplo. 6. aunque a veces tira datos que serán necesitados pronto. incluso si la mayoría de la memoria está construida utilizando tecnología más lenta con un tiempo de acceso de 200ns.4 When Does Caching Break Down? Cuando los programas muestran localidad el caché trabaja bastante bien.

Como la caché no es lo suficientemente grande esto produciría 20 miss en 20 accesos. es las aplicaciones reales. o bloques que han sido modificados. Es más lenta que la política write-back. el primer acceso resulta en un mis después del cual toda la fila se transfiere a la caché. el segundo acceso resulta en otro miss. los datos que se están transfiriendo de cada fila no estan siendo usados porque se está accediendo al arreglo por columnas. por lo tanto disminuye la velocidad del sistema (si todos los accesos son escrituras. Por lo que un arreglo de 5x4 produciría 5 misses y 15 hits en 20 accesos (asumiendo que estamos accediendo a todos los elementos del arreglo). Este metodo es normalmente más rápido que el anterior porque no se pierde tiempo en escribir información a la memoria con cada escritura en caché. esto esencialmente disminuye la velocidad del sistema a la velocidad de la memoria principal). también llamada copyback solo actualiza los bloques en memoria principal cuando el bloque de caché es seleccionado como víctima y debe ser removido de la caché. Habría una significante reducción en la localidad cuando la memoria se utiliza de este modo. 6. Sin embargo. Si el programa accede al arreglo a una fila por vez. Un tercer ejemplo podría ser un programa que loopea sobre un arreglo lineal que no entra en caché. Sin embargo. Si el programa accede al arreglo en por columnas.dos dimensiones. pero una vez que el bloque está transferido al caché los accesos subsecuentes son hits. los diseñadores deben decidir también que hacer con los llamados dirty blocks de la caché. el primer acceso produce un miss. la mayoría de los accesos son lecturas por lo que esta disminución de la velocidad es despreciable. La desventaja obvia es que cada escritura ahora requiere un acceso a memoria. La desventaja es que la memoria principal y el caché pueden no contener el mismo Comentario: Chequear otras traducciones de este término .4. Usar esta política signficia que cada escritura en caché necesita una escritura en memoria principal.5 Políticas de escritura en Caché Además de determinar qué víctima elegir para el reemplazo. la política de escritura de la caché determina cuando será actualizado el bloque de memoria principal para coincidir con el bloque de caché. pero asegura que el caché es consistente con el sistema de memoria principal. También se reduce el tráfico a la memoria. Si el bloque de caché es modificado. • Write-back— Esta política. Hay dos políticas básicas: • Write-through—Actualiza tanto el caché como la memoria principal simultaneamente en cada escritura. los datos pueden ser escritos en la caché en su lugar. Los arreglos se almacenan tipicamente por filas (en row-major order Supongamos que una fila ocupa exactamente un bloque de caché y que la cacllé puede contener todas excepto una de las filas del arreglo. Cuando el procesador escribe a memoria principal. bajo la asunción de que el procesador probablemente vuelva a leerlos pronto.

La L2 es de 512KB hasta 1MB. mejores estrategias para operaciones de escritura (hasta un 10%) y mejores prácticas de código. Ambas utilizan mapeo asociativo por conjuntos de dos vías. (3) S: shared (this line/block may be shared with another cache line/block).valor en un instante dado. .6 UN EJEMPLO DE MANEJO DE MEMORIA REAL El Pentium tiene dos cachés. y si un proceso termina (crashes) antes de que se haya escrito a la memoria principal. Solo aumentar el tamaño de la caché puede mejorar el hit ratio entre un 1 y un 4% pero no está garantizado. Ambas L1 utilizan un bit LRU para el reemplazo de bloques. los datos en el caché pueden perderse Para mejorar la performance del caché. and (4) I: invalid (the line/block is not in cache). como vimos en el ejemplo anterior accesos por filas vs. Cada línea tiene dos bits que almacenan los siguientes estados MESI: (1) M: modified (cache is different than main memory). ambas utilizando un tamaño de bloque de 32 bytes. el Pentium (como muchas otras máquinas) separa la caché entre la utilizada para instrucciones y la utilizada para datos. L1 y L2. accesos por columnas (hasta el 30%). 6. L1 es la más cercana al procesador mientras que la L2 está entre el procesador y la memoria. La memoria de intrucciones y la L2 utilizan el protocolo de coherencia MESI. también usa mapeo asociativo por conjuntos de dos vías. El L1 son en realidad dos cachés. (2) E: exclusive (cache has not been modified and is the same as memory). uno debe incrementar el hit ratio usando un mejor algoritmo de mapeo (aproximadamente un 20%).

4. whereas main memory is accessed by its _______. L1 or L2 cache is faster? Which is smaller? Why is it smaller? accessed by its ________.REVIEW OF ESSENTIAL TERMS AND CONCEPTS 1. What is the difference between a virtual memory address and a physical memory address? Which is larger? Why? 25. Give two 8. 27. What is the worst-case cache behavior that can develop using LRU and FIFO cache replacement policies? 19. What causes external fragmentation and how can it be fixed? . 13. 6. Explain the four cache replacement policies presented in this chapter. Why is the optimal cache replacement policy important? 18. Which of 9. What causes internal fragmentation? 29. Exercises 267 10. is effective access time (EAT)? 20. Name three different applications where ROMs are often used. Which is faster. Explain how fully associative cache is different from direct mapped cache. When would a system ever need to page its page table? 33. 14. Explain the concept of locality of reference and state its importance to memory systems. How does associative memory differ from regular memory? Which is more expensive and why? 12. What are the components (fields) of a virtual address? 30. 17. What are the three fields in a set associative cache address and how are they used to access a location in cache? 16. Explain how set associative cache combines the ideas of direct and fully associative cache. Direct mapped cache is a special case of set associative cache where the set size is 1. What. Cache is the three forms of locality? noncomputer examples of the concept of cache. 24. What are the advantages and disadvantages of virtual memory? 32. What are the advantages of using DRAM for main memory? 3. What is the objective of paging? 26. What is a dirty block? 23. exactly. Explain how to derive an effective access time formula. Describe the advantages and disadvantages of the two cache write policies. What are 7. When does caching behave badly? 22. What is a page fault? 28. So fully associative cache is a special case of set associative cache where the set size is ___. What are the three fields in a direct mapped cache address? How are they used to access a word located in cache? 11. Discuss the pros and cons of paging. 21. Why did your authors choose to represent it as a pyramid? 5. 15. What is a TLB and how does it improve EAT? 31. SRAM or DRAM? 2. Explain the concept of a memory hierarchy.

si no en cómo el Veremos como los I/O y la capacidad de almacenamiento pueden ser optimizados permitiendo tomar la decisión correcta de almacenamiento. En símbolos: Donde: S es la velocidad.3 ARQUITECTURAS I/O . Esta lentitud puede tener un impacto sustancial en la productividad. Digamos que la mayoría de tus procesos diarios pasan el 70% del tiempo corriendo en la CPU y el 30% esperando servicios del disco. Cuantificó sus observaciones en una fórmula que hoy se conoce como ley de Amdahl. y k es la velocidad de un nuevo componente.INPUT – OUTPUT AND STORAGE SYSTEMS Ac Una computadora no tiene mucho uso sin medios para ingresar y sacar información de ella. establece que la velocidad (speedup) total de un sistema de computación depende tanto de la aceleración en un componente particular como de cuanto es utilizado ese componente por el sistema. Nos ofrecen un nuevo procesador que es 50% más rápido del que tenemos por $10000 o un conjunto de discos que son 2. Es más frecuente que la causa de este problema no se encuentre en el procesador o en la memoria.2 AMDAHL’S LAW Aumentar el 40% la velocidad de un componente ciertamente no va a aumentar el 40% de la velocidad del sistema. aunque el costo por cada 1% de mejora es menor en los discos.5 veces más rápidos que tu disco actual por $7000. En esencia. f es la fracción de trabajo que realiza el componente más rápido. los usuarios se quejan de que es lenta. 7. En 1967 George Amdahl reconoció la interrelación de todos los componentes con la eficiencia total de un sistema de computación. Cuando el tiempo de procesamiento excede el tiempo de “pensar” del usuario. Entonces para el procesador tenemos: y para el disco: El aumento de performance es relativamente igual. 7.

Las interfaces manejan los detalles para asegurarse de que los dispositivos están listos para la próxima tanda de datos. señales de estado como “tape ready”. Los subsistemas I/O incluyen. La forma y significado exacto de las señales que se intercambian entre emisor y receptor se llama protocolo Los Protocolos constan de señales de control como “Printer reset”. Los módulos I/O se ocupan de mover datos entre la memoria principal y la interfaz de un dispositivo en particular. o que el servidor está listo para recibir la próxima tanda de datos que proviene de un periférico. pero no están limitados a: · Bloques de memoria principal que están dedicados a funciones I/O · Buses que proveen los medios para mover los datos dentro y fuera del sistema · Módulos de control en el servidor y en los periféricos.Definimos input/output como un subsistema de componentes que mueve datos entre componentes externos y un servidor (host system). En la mayoría de los protocolos de intercambio de . Las interfaces están diseñadas específicamente para comunicarse con un cierto tipo de dispositivos como teclados. consistente de una CPU y una memoria principal. o señales para el paso de datos. · Interfaces a componentes externos como teclados y discos · Cableado o links de comunicación entre el servidor y sus periféricos. discos y impresoras.

El objetivo es saber cuando el método I/O empleado por una arquitectura particular es apropiado y cómo será utilizado el sistema. Estar constantemente haciendo polling. tanto como para sus prioridades e intervalos de polling. Una vez que la CPU detecta la condición de “dato listo”. Los discos y las sintas son formas de almacenamiento durable llamados así porque los datos que son grabados en ellos duran más de lo que durarían en memoria principal volátil.3. es un problema. I/O por manejo de interrupciones. El CPU continuamente monitorea cada registro.datos el receptor debe reconocer (acknowledge) los comandos y datos que se le envían. Los cambios en el programa pueden consistir en ajustes para el número y tipo de dispositivos en el sistema. o indicar que está listo para recibir datos. 7. eyectan el papel. Este tipo de protocolo de intercambio se denomina handshake. mientras que las impresoras usualmente tienen una RAM más lenta. La vida esperada de los datos en estos medios es de aproximadamente 5 años para los medios magnéticos y tanto como 100 años para los medios ópticos. estos son: I/O programado. esto se llama polling. Para las impresoras. Los dispositivos externos que manejan largos bloques de datos (como impresoras. En caso de escribir en discos. Programmed I/O (E/S por polling o programada) Los sistemas que usan programmed I/O dedican por lo menos un registro para uso exclusivo de cada dispositivo I/O. La memoria dedicada en los discos es usualmente del tipo de la caché más rápida. discos. Aunque ningún método es necesariamente mejor que el otro. la manera en que la computadora ontrola sus I/O influencia enormemente el diseño y performance general del sistema. esto incluye asegurarse de que el disco está posicionado de la manera adecuada para que la información sea escrita en un lugar particular. Los Buffers permiten al servidor enviar largas cantidades de datos a los periféricos de la manera más rápida posible. estos circuitos mueven el cabezal de impresión a la posición del siguiente carácter. sin embargo. etc. Los circuitos de control de los dispositivos toman los datos de para o desde buffers incorporados y se aseguran de que llegue a donde debe ir. Por lo tanto se refiere usualmente a la programmed I/O como polled I/O. Sin embargo. sin tener que esperar a que los dispositivos mecánicos más lentos hayan escrito los datos. activan el cabezal. No realiza ningún trabajo útil hasta que haya I/O para Comentario: Ver qué sería esto .1 Métodos de Control I/O Los sistemas de computación emplean cualquiera de los cuatro metodos de control generales de I/O. actúa de acuerdo a las instrucciones programadas para ese registro particular. ningún método de almacenamiento es permanente. La CPU se encuentra constantemente en un loop de “busy wait” hasta que empieza a atender una solicitud de I/O. y cintas) están usualmente equipados con memoria buffer. acceso directo a memoria y channel-attached I/O. esperando que lleguen los datos. El beneficio de usar este enfoque es que tenemos control programático sobre el comportamiento de cada dispositivo.

el fabricante de ese disco puede actualizar el vector de I/O del disco para apuntar a un código particular para ese disco. Direct Memory Access (E/S por acceso directo a memoria) Tanto con I/O como con interrupt-driven I/O. este método es apropiado para sistemas de propósito especial como cajeros automáticos. Reemplazaban los vectores de I/O para que apuntaran a su código. Luego de que la CPU haya terminado con la rutina. Timeout. Durante el I/O. los dispositivos le dicen a la CPU cuando tienen datos para enviar. la CPU muvede datos desde y hacia el dispositivo I/O. En lugar de que la CPU este continuamente preguntando a sus dispositivos conectados si tienen algún input. OR Error ENDWHILE . La CPU continua con otras tareas hasta que la interrumpe el pedido de un dispositivo. Las interrupciones son usualmente señaladas con un bit en el registro de flags del CPU llamado interrupt flag. erradicando muchos sistemas en el proceso. Desafortunadamente. estos vectores pueden ser fácilmente cambiados para apuntar a código especifico del comerciante. o sistemas que controlan o monitorean eventos ambientales. la CPU corre instrucciones similares al siguiente pseudocódigo: WHILE More-input AND NOT Error ADD 1 TO Byte-count IF Byte-count > Total-bytes-to-be-transferred THEN EXIT ENDIF Place byte in destination buffer Raise byte-ready signal Initialize timer REPEAT WAIT UNTIL Byte-acknowledged. algunos algunos de los primeros escritores de virus basados en DOS también tuvieron esa idea. Como los vectores de los distintos tipos de hardware usualmente se mantienen en las mismas ubicaciones en sistemas que corren el mismo tipo y nivel de sistema operativo. El sistema luego hace un fetch del vector de interrupciones que apunta a la dirección de la rutina del I/O. Una vez que se setea el flag de interrupción. Interrupt-Driven I/O (E/S por interrupcioneS) Interrupt-driven I/O puede ser pensada como l contrario de programmed I/O. La mayoria de los SO actuales emplean manejo de interrupciones. y continúa la ejecución del programa. el sistema operativo interrumpe el programa que estaba ejecutando guardando el estado y la información variable. restaura la información que había guardado del programa que estaba corriendo cuando ocurrió la interrupción. Por ejemplo. estos tienen mecanismos para salvaguardarse contra este tipo de manipulación del vector.procesar. si a alguien se ocurre un nuevo tipo de disco que todavía no es soportado por un SO popular. Debido a estas limitaciones. Afortunadamente. Este método es similar al anterior en el sentido en que las rutinas de atención pueden ser modificadas para acomodarse a cambios de hardware.

el número de bytes y el dispositivo de destino o la dirección de memoria. Para efectuar la transferencia. Para evitarlos. Si no detectan actividad dentro de un período de tiempo especificado se produce un timeout y abortan el proceso de I/O. la CPU le provee al control de DMA la locación de los bytes a ser transferidos. Una vez que los valores apropiados se ubican en memoria.Claramente estas instrucciones son lo suficientemente simples como para ser programadas en un chip dedicado. la CPU se livera de la ejecución de las tediosas instrucciones de I/O. porque muchos dispositivos de I/O operan con parámetros de tiempo ajustados. El controlador del DMA y la CPU comparten el bus de memoria. la CPU envía una señal al subsistema de DMA y procede con su siguiente tarea. Esto se llama cycle stealing. Luego de que el I/O se completa (o termina en error). esto es. Solo uno de ellos a la vez puede tener control del bus. Generalmente. I/O tiene prioridad sobre los fetches de memoria del CPU para instrucciones y datos. ser el bus master. . Afortunadamente I/O tiende a crear tráfico en ráfagas bursty en el bus: los datos se envían en bloques o clusters. Cuando un sistema usa DMA. mientras el DMA se ocupa de los detalles del I/O. el DMA usa ciclos de memoria que de otra forma serían utilizados por el CPU. el DMA envía una nueva interrupción al CPU. Esta es la idea detrás de direct memory access (DMA). Esta comunicación usualmente tiene lugar a través de registros de I/O especiales en la CPU.

Después de que el IPO haya completado su trabajo. los IOPs tienen la habilidad de ejecutar programas que incluyen lógica aritmética y bifurcación de instrucciones. Una vez que el programa de I/O se ha ubicado en memoria el servidor expide un comando de start subchannel (SSCH). la CPU solo es responsable por tomar la acción apropiada. La principal diferencia entre el DMA y el channel I/O reside en la inteligencia del IOP. La I/O por interrupciones puede manejar datos de un byte por vez en pequeños bloques. para nombrar algunos. aunque este acceso puede no ser de la duración necesaria para ahorrarle al sistema la acusación de ir muy lento durante los I/O (“crawling during I/O”). que incluyen no solo las instrucciones de la transferencia actual. no se comporta bien en sistemas grandes de múltiples usuarios como computadoras mainframe (centrales). Estos comandos incluyen cosas como varios tipos de inicialización de dispositivos. las cuales están optimizadas para I/O. Estos ejecutan programas que son ubicados en la memoria principal del sistema por el procesador servidor. sino también comandos que controlan los dispositivos de I/O. ubica la información de terminación en la memoria y envía una interrupción a la CPU. traduce código de almacenamiento en código de memoria. un canal multiplexado es llamado un multiplexor channel. Los Channel paths para dispositivos lentos como terminales e impresoras pueden ser combinados (multiplexados) permitiendo el manejo de varios de estos dispositivos a través de un solo controlador. Channel I/O (Canal de E/S) La I/O programada transfiere datos un byte por vez. Así la DMA requiere solo un poco menos de participación de la CPU de lo que las interrupciones. uno o más procesadores de I/O controlan varios caminos de I/O llamados channel paths. informando al IOP de la ubicación en memoria donde puede ser encontrado el programa. La CPU obtiene la informción de termiación y realiza las acciones apropiadas para los códigos devueltos. Los dispositivos más lentos como los teclados. Luego de que el DMA avisa el final del I/O. Con channel I/O. y puede transferir archivos completos o grupos de archivos independiente al CPU servidor. En caso de que el evento falle. El IOP negocia protocolos. dependiendo del tipo de dispositivo que participa en el I/O. Los canales para discos y otros dispositivos más rápidos se llaman selector channels. En los mainframes de IBM. El . expide los comandos de los dispositivo. generan más interrupciones por numero de byte transferido que los discos o las impresoras. A diferencia de los circuitos DMA. y comandos para rebobinar cintas. Los canales de I/O son manejado por pequeñas CPUs llamadas I/O processors (IOPs). eyección de páginas de la impresora. interrumpiendo la CPU solo después de terminar (o fallar) la transferencia de un grupo de bytes. Los métodos DMA son todos orientados a bloques. sin embargo.La CPU debería tener el acceso permitido al bus entre ráfagas. Tal costo está bien para sistemas pequeños de un solo usuario. Estos programas consisten en una serie de channel command words (CCWs). La mayoría de las mainframes utilizan un tipo inteligente de interfaz DMA conocida como I/O channel. la CPU puede darle la dirección para el siguiente bloque de memoria a ser leido o escrito.

Cuando se copia un archivo de disco a cinta. por ejemplo. el IOP usa el bus de memoria del sistema solo para hacer el fetch de instrucciones de la memoria principal. channel I/O es utilizado en ambientes de procesamiento de transacciones de alto rendimiento. El resto de la transferencia se efectúa utilizando solo el bus de I/O. 7. Debido a su inteligencia y el aislamiento del bus.3. un IOP debe robar ciclos de memoria del CPU.servidor solo tiene que crear las instrucciones de programa para la operación I/O y decirle al IOP donde encontrarlas. donde su costo y complejidad puede ser justificado. A diferencia de la DMA los sistemas de channel I/O están equipados con buses de I/O separados lo cual ayuda a aislar al servidor de la operación de I/O.2 I/O Bus Operation . Como la DMA.

Por otro lado. Deben tener en cuenta el hecho de que los dispositivos de I/O no siempre pueden estar listos para procesar la transferencia I/O. Como estos handshakes tienen lugar cada vez que se accede al bus. Por esto se requiere un bus de control El bus de memoria y el de I/O pueden ser entidades separadas. los buses de I/O no pueden operar sincrónicamente. En un sistema que funciona correctamente. Consideremos. de hecho. • El acceso a este recurso compartido debe ser controlado. la configuración de la figura 7. Pero los protocolos asincrónicos también requieren un clock para bit timing (temporización de bit?) y para delinear las transiciones de las señales. una vez más. Los circuitos de control ubicados en el bus de I/O y en los dispositivos de I/O negocian entre ellos para determinar el momento en el que cada dispositivo puede usar el bus. Una buena razón para que la memoria tenga su propio bus es que las transferencias de memoria pueden ser sincrónicas. La conexión entre el circuito DMA y los . direcciones y control. utilizando muchos ciclos del CPU para recuperar datos de la memoria principal. No separamos las lineas de datos.De este diagrama podemos desprender las siguientes ideas: · Un bus de sistema es un recurso compartido entre muchos componentes de un sistema de computación.2. a menudo es una buena idea separarlas. como que le falte papel a una impresora en uso. nunca es un problema de la memoria encontrarse offline o mantener el mismo tipo de errores que afectan a los periféricos. los buses de I/O se denominan asíncronos. Solemos distinguir transferencias sincrónicas de asincrónicas diciendo que una transferencia sincrónica requiere que tanto el emisor como el receptor compartan el mismo clock.

circuitos de interfaz de los dispositivos puede verse más claramente en la siguiente figura que muestra los buses individuales de los componentes. La dirección en el bus de datos consiste de un número de conductores individuales cada uno de los cuales lleva un bit de información. Un bus de datos con ocho lineas de datos lleva un byte por vez. Esta figura detalla como la interfaz del disco se conecta a los tres buses. Los buses I/O reales tienen tipicamente más de una docena de líneas . El bus de direcciones tiene suficientes conductores para identificar unívocamente cada dispositivo en el bus. El número de líneas de datos determina el ancho del bus. El grupo de lineas de control que se muestran es el mínimo que necesitamos para un propósito ilustrativo.

los ingenieros describen la operación del bus a través de diagramas de tiempo.de control (la PC original de IBM tenía más de 20). 3. En un diagrama de tiempo real se . Cuando el controlador del disco ve la señal baja en Request transfiere el byte de las lineas de datos al buffer del disco y luego baja la señal de Ready. los circuitos decodificadores en el controlador leen las líneas de dirección. 1. Para escribir datos en el disco el bus ejecuta la siguiente secuencia de operaciones. Con la línea de Request levantada. Con la señal de Ready levantada. 2. ningún otro dispositivo puede usar el bus. el handshake entre el controlador y el DMA está completo. el decodificador habilita los circuitos de control del disco. Las líneas de control coordinan las actividades del bus y sus dispositivos asociados. Si el disco está disponible para escribir datos. Para describir esto de manera más precista. 5. el controlador sube la señal en la linea de Ready En este punto. Los circuitos del DMA ubican los datos en las lineas y bajan la señal de Request. Al leer su propia dirección. 4. El circuito DMA ubica la dirección del controlador de disco en las líneas de direcciones y levanta las señales de Request y Write. Las líneas t0 a t10 especifican la duración de las varias señales.

El número de lineas de interrupción es limitado en cada sistema. los sistemas pequeños emplean I/O por interrupciones. Este settle time. las líneas de datos pueden ser usadas para llevar la dirección del dispoisitivo. hemos asumido que el equipamiento perfiderico se encuentra inactivo en el bus hasta que un comando para hacer lo contrario aparece en la línea. Debido a la naturaleza asíncrona de los buses de I/O. Una pequela cantidad de tiempo debe permitirse para que la señal se estabilice. Este desición de diseño está cableada en el controlador (hardwirerd). no tienen lineas separadas de datos y direcciones. un scanner y una impresora usualmente pueden coexistir perfectamente usando la misma interrupción.asigna una duración exacta a los intervalos de tiempo. excepto que ahora los periféricos tienen una forma de comunicarse con la CPU. Cuando se detecta una línea de interrupción. En pequeños sistemas de computadoras este enfoque de “habla solo cuando te hablen” no es muy útil. Las interrupciones compartidas no causan problemas cuando es claro que ninguno de los dos dispositivos necesitará la misma interrupción al mismo tiempo. Este enfoque contrasta con el bus de memoria donde las direcciones y los datos deben estar disponibles simultáneamente.3 Another Look at Interrupt-Driven I/O Hasta este punto. El chip de control de la interrupción tiene un input por cada línea de interrupción. podrían usar la misma interrupción causando comportamientos extraños en ambos. Implica que toda la actividad del sistema se origina en el CPU cuando. puede bajar su señal INT. y en algunos casos la interrupción puede ser compartida.3. la actividad se origina con el usuario. Las señales del bus pueden cambiar solo durante el ciclo de transición de un clock. Una vez que el controlador de interrupciones tiene este recocnocimiento. Muchos buses I/O reales. donde sin el conocimiento del instalador. en realidad. el usuario tiene que tener una forma de llamar su atención. conectará los dispositivos de alta prioridad (como el teclado) a la misma línea de interrupción. Los diseñadores de sistemas deben decidir que dispositivos debieran tener precedencia sobre otros cuando más de un dispositivo levanta las interrupciones simultáneamente. Cuando el CPU está listo para procesar la interrupción levanta la señal Interrupt Acknowledge(INTA). Todo es lo mismo que en los ejemplos anteriores. Por ejemplo. Todo lo que necesitamos es agregar otra línea de control que indique si las señales en las líneas de datos representan direcciones o datos. Las señales no suben y bajan instantáneamente. . el controlador la decodifica y levanta la entrada Interrupt (INT) del CPU. Este no es siempre el caso con un mouse serial y los modems. Para poder comunicarse con la CPU. aunque pequelo. usualmente cerca de los 50 ns. 7. esot refleja la realidad física del bus. Cada sistema que utiliza el mismo SO y controlador de interrupción. Todo dispositivo periférico en el sistema tiene acceso a una línea de pedido de interrupción. contribuye a los largos restrasos durante largas transferencias I/O. Para este fin.

.

o solo pueden tener direcciónes o solo información de control. Los registros no se direccionan de la misma manera que la memoria (cada palabra de memoria tiene una dirección binaria única que comienza con la ubicación 0). o datos necesarios para le ejecución del programa. registros índice que controla los . conectados juntos al mismo clock). estos componentes realizan las tareas del CPU: hacer el fetch de las instrucciones.64 bits (tipicamente una potencia de 2). Por lo tanto la mayoría de las computadoras tienen registros de un cierto tamaño: 16.32. El procesamiento de datos de la computadora se hace por lo general con un tamaño fijo de palabra binaria que se encuentra almacenada en los registros.1. La unidad central de proceso CPU es la responsable de hacer el fetch de las instrucciones. un módulo responsable por ordenar las operaciones y asegurarse de que los datos correctos están donde se necesitan en el momento correcto. En los sistemas de computación modernos. el cual es una red de unidades de almacenamiento (registros). Componentes: The Registers Los restistros se utilizan en los sistemas de computación para almacenar una variedad de datos.1 CPU Basics and Organization La computadora manipula datos en código binario. La primera es el datapath. y unidades aritmético lógicas (para realizar varias operaciones en los datos) conectados por buses (capaces de mover data de un lugar a otro) donde el tiempo está controlado por clocks. La memoria se usa tanto para almacenar datos como instrucciones (Von Neumann).4. Algunos registros tienen un propósito especial y solo pueden contener datos. Se pueden utilizar flip-flops D para implementar registros (uno por bit. Otros registros son más genéricos y pueden contener cualquiera de estas cosas en distintos momentos. registros para desplazar (shift) datos. Un registro es un dispositivo de hardware que almacena datos binarios.1 MARIE AMachine Architecture that is Really Intuitive and Easy 4. se lee de ellos y puede transferirse de uno a otro. registros para comparar valores y registros que cuentan. Todas las computadoras tienen un procesador central. Juntos. program counters. El desempeño de una máquina está directamente relacionado con el diseño del datapath y la unidad de control. Están ubicados en el procesador para que la información pueda ser accedida muy rápido. La información se escribe en los registros. hay muchos tipos especializados de registros: registros para almacenar información. direcciones o información de control. Hay registros “anotadores” que almacenan valores temporarios. Los registros son direccionados y manipulados por la misma unidad de control. decodificarlas y finalmente realizar la secuencia indicada de operaciones. como direcciones. decodificarlas y realizar la secuencia indicada de operaciones en los datos correctos. Los registros contienen datos. Esta unidad puede estar dividida en dos partes. El segundo componente de la CPU es la unidad de control control unit.

la memoria o algún otro componente) puede usar el bus. Monitorea la ejecución de todas las instrucciones y la transferencia de toda la información. Generalmente la ALU tiene dos entradas de datos y una salida. Los buses son de bajo costo pero muy versátiles y hacen facil conectar nuevos dispositivos entre ellos y al sistema. le dice a la ALU que registros usar. la ALU. . este uso compartido usualmente resulta en cuellos de botella en las comunicaciones. y registros de propósito general que están disponibles para el programador. tanto como el número de dispositivos que lo comparten. registros stack pointer que manejan pilas de información para procesos. carry o zero). teniendo estos dispositivos que compartir el bus (conocido como un bus multipoint). La mayoría de las computadoras tiene sets de registros y cada set se usa de una manera específica. 4. solo un dispositivo (sea un registro.2 The Bus El CPU se comunica con otros componentes a través de un bus. la arquitectura Pentium tiene un conjunto de registros de datos y un conjunto de registros de direcciones. La unidad de control usa un registro program counter para encontrar la próxima instrucción a ser ejecutada y un registro de status para llevar la cuenta de los overflows. The ALU La unidad aritmético lógica lleva a cabo las operaciones lógicas como comparaciones y aritméticas como suma y multiplicación. las decodifica y se asegura de que los datos están en el lugar correcto en el momento correcto. Frecuentemente los dispositivos están divididos en las categorías master y slave. Sin embargo.loops de los programas. Extrae instrucciones de la memoria. donde el dispositivo master es el que inicia las acciones y el slave es el que responde a los requerimientos del master. En un momento dado. conectando dos componentes espefícos. sirve a las interrupciones y enciende la circuitería correcta en la ALU para la ejecución de la operación deseada. Algunas arquitecturas tienen conjuntos muy largos de registros que pueden usarse en formas bastante innovadoras para acelerar la ejecución de instrucciones. Un bus puede ser point-to-point. La velocidad del bus está relacionada con su longitud. Las operaciones que se realizan en la ALU usualmente afectan a los bits en el registro de status (los bits se setean para indicar si ha ocurrido un overflow por ejemplo). carries. Por ejemplo. o un common pathway que conecta un número de dispositivos. The Control Unit La unidad de control es el “policía” o “agente de tráfico” de la CPU. requeridas durante la ejecución del programa.1. registros de status que mantienen el status o modo de operación (como condiciones overflow. borrows y el igual. Un bus es un conjunto de cables que actúan como caminos de datos compartidos para conectar múltiples subsistemas dentro del sistema. La ALU sabe qué operación realizar porque está controlada por las señales de la unidad de control. Consiste en múltiples lineas que permiten el movimiento paralelo de bits.

.

Los buses procesador-memoria (Processor-memory buses ) son buses cortos. Las power lines proveen la energía eléctrica necesaria. Cada tipo de transferencia sucede dentro de un ciclo del bus. transferir data de memoria a un registro (una lectura en memoria). estos se han dividido en distintos tipos. interrupciones y las señales de sincronización del clock. transferir data de un registro a la memoria (una escritura en memoria).3) está construido en el chasis de la máquina y conecta al procesador. Las líneas de control indican qué dispositivo tiene permiso para usar elbus y con qué propósito (leer o escribir desde memoria. por ejemplo) de los datos que tienen que ser leidos o escritos. Muchas computadoras tienen una jerarquía de buses. Típicamente las transacciones del bus incluyen enviar direcciones (para leer o escribir). el tiempo entre dos ticks del reloj del bus. Estos buses con compatibles con muchas arquitecturas. Usualmente las lineas del bus que son dedicadas para mover los datos se llaman el data bus.Debido a que se comparte. Las líneas de direcciones indican la ubicación (en memoria. el protocolo del bus (reglas de uso) es muy importante. los dispositivos I/O y la memoria (para que todos compartan un bus). de alta velocidad que están ubicados muy cerca del sistema de memoria de la máquina para maximizar el ancho de banda (transferencia de los datos) y tienen usualmente un diseño muy específico. Debido a los diferentes tipos de información y diferentes tipos de dispositivos que usan los buses. por lo que no es poco común tener dos buses (por ejemplo uno procesador-memoria . Un backplane bus (Figure 4. Estas lineas de datos contienen la información actual que debe ser transferida de una locación hacia otra. o de un dispositivo I/O por ejemplo). También transfieren “acuse de recibo” de los pedidos del bus. Los buses de I/O son tipicamente más largos que el anterior y permiten muchos tipos de dispositivos con anchos de banda variables.

Para leer datos de memoria. las lineas de control coordinan las operaciones y complejo protocolo de handshaking debe utilizarse para reforzar la sincronización.y uno de I/O) o más en el mismo sistema.000 o 7.52ns. el tiempo del ciclo del bus no debe ser más corto que la longitud del tiempo que le toma a la información atravesar el bus. Además. por lo tanto. por ejemplo. El tiempo del ciclo del reloj es recíproco al ritmo del clock del bus. señales de especificaciones y protocolos exactos de uso. Estos son buses de muy alta velocidad y pueden utilizarse para conectar sólo un número limitado de dispositivos similares. y buses externos (llamados a veces buses de expansión) que conectan los dispositivos externos. La longitud del bus. Los buses de expansión pueden ser más lentos pero permiten una conectividad mucho más genérica. buses de datos que conectan los periféricos directamente al CPU. implicando que el bus debe mantenerse lo más corto posible para que la sincronización del reloj no se vuelva muy grande (the clock drift cannot get overly large). cualquier distorsión del clock puede causar problemas. entonces la longitud del ciclo del bus es de 1/133. La mayoría de las computadoras también tiene buses locales. periféricos slots de expansión y puertos de I/O al resto de la computadora. Como el clock controla las transacciones. Todos los dispositivos son sincronizados por el ritmo al que corre el reloj. Por ejemplo. llamado bus de sistema que conecta la CPU. Las computadoras personales tienen su propia terminología en lo que se refiere a buses. Tienen un bus interno. Los sistemas de alto rendimiento usualmente utilizan los tres tipos de buses. la memoria y todos los otros componentes internos. impone restricciones tanto al ritmo del clock del bus como el tiempo del ciclo del bus.000. tiempo. el protocolo requeriría pasos similares a los siguientes:: . pero tienen estándares muy específicos para conectores. Los buses sincrónicos tiene un reloj y las cosas solo pasan en los ticks del clock (una secuencia de enventos es controlada por el reloj). si el ritmo del reloj es 133MHz. Los buses son esencialmente pequeños manojos de cables. Con los buses asincrónicos.

2. Centralized parallel arbitration: Cada dispositivo tiene una linea de control “request” y un árbitro centralizado selecciona a quién le corresponde el bus. 3. 2. porque solo un dispositivo por vez puede usar el bus. 4. El reloj también sincroniza todos los componentes en el sistema. pero malo porque el procesador se encuentra ahora envuelta en toda transacción que utilice el bus. son dispositivos que tienen permitido iniciar transferencias o información (control del bus) mientras que los slaves son activados por un master y responden a los pedidos de leer y escribir datos (por lo que solo los masters pueden reservar el bus). Si el bus detecta colisiones (pedidos mútliples simultaneos). trabajando con requerimientos de tiempo muy específicos. Los esquemas de arbitraje del bus deben proveer prioridades a ciertos dispositivos master y al mismo tiempo asegurarse de que los dispositivos de menor prioridad también tengan la posibilidad de transferir. Distributed arbitration using collision detection: A cada dispoitivo se le permite requerir el bus. se requiere un arbitraje. ReqREAD: Esta línea de control del bus se activa y los datos de la dirección de memoria se ubican en las lineas apropiadas del bus al mismo tiempo. un dispositivo debe reservarlo.1. Para usar el bus. Usar un protocolo en lugar del reloj para coordinar las transaciones significa que los buses asíncronos se llevan mejor con tecnologías que pueden soportar una variedad de dispositivos. 3. Como se mencionó anteriormente. Con cada tick del reloj se marca el ritmo de todo lo que pasa en el sistema. ReadyDATA: Esta línea de control se sube cuando el sistema de memoria pone los datos solicitados en las líneas de datos del bus. los mismos dispositivos determinan quien tiene la prioridad más alta y debería utilizarlo. El CPU utiliza este . como un metrónomo o el conductor de una orqueta. Distributed arbitration using self-selection: Este esquema es similar al centralizado pero en lugar de una autoridad central que elige quién utiliza el bus. Daisy chain arbitration: Este equema usa una linea de control “perimitir el bus” (“grant bus”) que se pasa de los dispositivos de mayor prioridad a los de menor prioridad (No se asegura la imparcialidad y es probable que a los dispositivos de menor prioridad nunca se les permita utilizar el bus. Este tipo de arbitraje puede resultar en cuellos de botella.1. el dispositivo debe hacer otro pedido (Ethernet usa este tipo de arbitraje). 4. el procesador es el único dispositivo que puede convertirse en master del bus..3 Clocks Toda computadora contiene un reloj interno que regula cuan rápido pueden ser ejecutadas las instrucciones. ACK: Este línea de control se utiliza para indicar que ReqREAD o ReadyDATA han sido reconocidas.. En sistemas con más de un dispositivo master. (are not starved out) Los esquemas de arbitraje del bus se dividen en cuatro categorias: 1. Ambos siguen un protocolo de comunicacione para utilizar el bus. Este esquema es simple pero no es justo. Esto es bueno para evitar el caos. los master del bus. En un sistema muy simple.

desde cada salida de un conjunto de registros a las entradas de los registros. y acceder a la memoria toma más tiempo que acceder a los registros. Por ejemplo. Dos máquinas con la misma velocidad de reloj no necesariamente ejecutan instrucciones al mismo número de ciclos. La mayoria de las instrucciones de las máquinas requieren entre uno y dos ciclos de reloj. Cuando hay un tick del reloj y se carga un dato en los registros. el desempeño de las instrucciones se mide frecuentemente en ciclos de reloj – el tiempo entre los ticks del mismo – en lugar de en segundos. Los registros deben esperar al tick del reloj antes de poder cargar nuevos datos. La CPU requiere un número fijo de ticks del reloj para ejecutar cada instrucción. Esto resultaria en un estado inconsistente en nuestra máquina. impredecible de otra forma. Si una máquina tiene un tiempo de ciclo de 2ns es una máquina de 500MHz. que cambia de 0 a 1 a 0. la multiplicación requiere más tiempo que la suma. Generalmente cuando nos refericmos al CLOCK. El tiempo del reloj (o período) es el recíproco de la frecuencia (1/f). Si el ciclo es muy corto. Por lo tanto. La mayoría de las máquinas son sincrónicas: Hay una señal master de reloj. una instrucción que requeriría 2 ciclos de reloj ahora podría requerir tres o cuatro (o más dependiendo de donde ubicamos a los registros adicionales). El ciclo del reloj debe ser lo suficientemente largo como para permitir que estos cambios alcancen el siguiente conjunto de registros. hemos incrementado el número de cilclos de reloj. pero algunas pueden tomar 35 o más. Pero los registros no pueden cambiar sus valores hasta el tick del reloj por lo que. Podríamos acortar la distancia entre los registros para acortar el retardo de la propgafación agregando registros entre los registros de salida y sus correspondientes registros de entrada. Parece razonable asumir que si aceleramos la velocidad del reloj la máquina correría más rapido. en efecto. Sin embargo algunos . La frecuencia del reloj (a veces llamada ritmo o velocidad) es medida en MHz. nos referimos al reloj del sistema. lo cual es algo que definitivamente debemos evitar. las salidas de los registros pueden cambiar. En general. o el reloj maestro que regula la CPU y otro componentes.reloj para regular su progreso. etc. Estos valores cambiados deben propagarse a través de los circuitos de la máquina hasta que alcancen la entrad del siguiente conjunto de registros donde son almacenados. un MHz equivale a un millon de ciclos por segundo. podríamos terminar con algunos valores no alcanzando los registros. La siguiente formula relaciona los segundos a los ciclos: Es importante notar que la arquitectura de la máquina tiene un gran efecto en su desempeño. chequeando la velocidad de las puertas lógicas digitales. Sin embargo hay límites de cuan cortos podemos hacer los ciclos del reloj. Por lo tanto el tiempo mínimo del ciclo del clock debe ser por lo menos tan grande como el máximo retardo de propagación del circuito. en intervalos regulares. las operaciones en punto flotante requieren más ciclos que las de enteros.

indicando el tiempo máximo requerido para que los componentes efectuen sus funciones. lo cual implica que puede ser utilizado solo en CPUs que pueden ejecutar estas instrucciones específicas. impresoras. mouse. Aunque muchos componentes son candidatos potenciales. lo que resulta en hacer overlock de varios componentes que se comunican por ese bus. scanners. pero usa espacio de memoria en el sistema. Esto es ventajoso desde la perspectiva de la velocidad. Los clocks de los buses son usualmente más lentos que los de la CPU causando problemas de cuello de botella. Dispositivos de salida como monitores. Sin embargo. 4. Estos dispositivos no están directamente conectados a la CPU. lectores de tarjeta. la CPU tiene instrucciones especializadas que realizan las entradas y salidas. Cuando conectamos todos los componentes de forma serial donde un componente debe terminar su tarea antes de que otro pueda funcionar correctamente. pero también puede dañar los componentes que utilizan ese bus haciendo que su desempeño sea poco confiable. La CPU se comunica con estos dispositivos externos a través de registros de I/O. . Los componentes del sistema han definido límites de desempeño. Esta interfaz convierte las señales del sistema de bus en y hacia formatos que son aceptables por el dispositivo dado. uno debe ser cuidadoso de no crear fallas de sistema o. En I/O mapeado a memoria(memory-mapped I/O). requiere instrucciones especiales de I/O.4 The Input/Output Subsystem Los disposivos de entrada/salida I/O nos permiten comunicarnos con el sistema de la computadora. peor aún.buses también tienen su propio CLOCK. Dispositivos de entrada como teclados. Aunque esto no utiliza espacio de memoria. Este intercambio de datos se realiza de dos maneras. Aunque esto puede aumentar el desempeño del sistema. sistemas de reconocimiento de voz y pantallas táctiles nos permiten ingresar data en la computadora. los registros en la interfaz aparecen en el mapa de memoria de la computadora y no hay diferencia real entre acceder a la memoria y acceder a un dispositivo I/O. Esto puede generar mejoras considerables en el desempeño. mucha gente fuerza los límites de algunos componentes del sistema para mejorar el desempeño del mismo. Con instruction-based I/O. sobrecalentar la CPU. En su lugar hay una interfaz que maneja la transferencia de datos. La idea ba´sica es correr el CPU a velocidades de clock o bus por encima de los límites especificados por el fabrincante. Los fabricantes garantizan que sus componentes correran dentro de estos límites en las circunstancias más extremas. También se puede hacer overlock en el bus del sistema.1. Overclocking es un método que la mayoría de la gente utiliza para lograr esta meta. es importante tener en cuenta estos límites de desempeño para poder sincronizar los componentes correctamente. plotters y parlantes nos permiten obtener información de ella. Las interrupciones juegan un papel muy importante en el I/O porque son una forma eficiente de notificar a la CPU que una entrada o salida está disponible para el uso. I/O es la transferencia de datos entre la memoria primaria y varios perfiféricos I/O. el componente más popular para realizar overlocking es el CPU.

Por ejemplo 4Mx16 significa que la memoria tiene 4M de longitud (tiene 4M = 22 X 220 = 222 palabras) y tiene 16 bits de ancho (cada palabra es de 16 bits). Si la arquitectura es direccionable a byte y la palabra del set de instrucciones es más grandes se debe tener en cuenta el problema del “alineamiento”.4. En consecuencia. necesitará N bits para direccional unívocamente cada byte. lo que quiere decir que cada byte tiene una dirección única. Como las direcciones son numeros binarios sin signo. el byte con la dirección más baja determina la dirección de toda la palabra. donde la dirección solicitada no tiene que empezar en un límite natural. Algunas arquitecturas permiten accesos desalineados. La memoria se componen de chips de RAM y es referida usualmente con la notación LxW (length X Width). si una computadora tiene 2N unidades direccionables de memoria. cuando una palabra utiliza múltiples bytes. Algunas máquinas pueden tener un tamaño de palabra mayor pero aún así utilizar arquitectura direccionable a byte. implementada por un registro. La memoria principal es usualmente más grande que un chip de RAM. si queremos leer una palabra de 32 bits en una máquina direccionable a byte debemos asegurarnos de que: (1) la palabra esté almacenada en los límites de alineación naturales y (2) el accesos empieza en ese límite. Pero cada par de chips (cada fila) requiere solo 11 líneas de dirección (cada par tiene solo 211 palabras). Cada fila direcciona palabras de 2K pero requiere de 2 chips para manejar el ancho completo. Una computadora también puede ser direccionable a palabra. estos chips están combinados en un único módulo para otorgar el tamaño de memoria deseado. Cada registro (más conocido como ubicación de memoria) tiene una única dirección. Una vez que el chip correcto ha sido localizado los 11 bits restantes se . Una dirección casi siempre se representa por un entero sin signo. Cada fila. las direcciones de memoria usualmente empiezan en cero. Una dirección de memoria generalmente se almacena en una máquina de una sola palabra (¿?) Las palabras son la unidad básica de tamaño que se utiliza en varias instrucciones. Esto se logra en el caso de palabras de 32 bits.5 Memory Organization and Addressing Podemos ver a la memoria como una matriz de bits. El ancho representa el tamaño de la palabra. En esta situación se requiere un decodificador para decodificar los 4 bits más a la izquierda de la dirección para determinar cual par de chips contiene la dirección deseada. tiene una longitud típicamente equivalente al tamaño de palabra de la máquina. En general. incluso en una máquina direccionable a byte.1. Por ejemplo. Normalmente la memoria es direccionable a byte. requiriendo que la dirección sea un múltiplo de 4. necesitamos contar de 0 a 212 – 1 en binario. Por ejemplo podemos leer o escribir una palabra a memoria. lo que significa que necesitamos esta cantidad de direcciones. Para direccionar esta memoria (asumiendo direccionamiento a palabra) necesitamos poder identificar univocamente 212 items diferentes. Por ejemplo para construir una memoria de 32Kx16 con chips de 2Kx8 conectamos 16 filas y dos columnas de chips. En estos casos. Las direcciones para esta memoria tienen que ser de 15 bits (hay 32K = 25 X 210 palabras que acceder).

1. Un solo módulo de memoria compartida provoca acceso secuencial (sequentialization of acces). 4. una lectura o escritura usando un módulo puede empezar antes que una lectura o escritura usando otro módulo haya terminado (se pueden superponer). High-order interleaving. los bits de más bajo orden de la dirección se utilizan para seleccionar el banco. Con el low-order interleaving. en high-order interleaving. distrubuye las direcciones para que cada módulo contenga direcciones consecutivas: La memoria de Low-order interleaved ubica palabras consecutivas de memoria en diferentes módulos: Con los buses apropiados usando low-order interleaving. Decirle a la CPU que ha terminado . que divide la memoria en varios módulos o bancos de memoria puede usarse para aliviar esto.ingresan en otro decodificador para encontrar la dirección exacta dentro de ese par de chips. la organización más intuitiva. Una interrupción puede ser activada por una variedad de razones incluyendo: • pedidos de I/O • Errores aritméticos (como división por cero) • underflow u overflow • Mal funcionamiento de hardware • Breakpoints definidos por el usuario (como al debuggear un programa) • Fallas de página • Instrucciones inválidas (que usualmente resultan de problemas de punteros) • Miscelanea Las acciones que se realizan para cada uno de estos tipos de interrupción (el manejo de interrupciones) son muy diferentes. se utilizan los bits de más alto nivel.6 Interrupts Las interrupciones son eventos que alteran (o interrumpen) el flujo normal de la ejecución en el sistema. La intercalación de memoria (Memory interleaving).

which holds the address of the next instruction to be executed in the program. • PC: The program counter. • MAR: The memory address register. which holds data from the input device. • IR: The instruction register. which holds either the data just read from memory or the data ready to be written to memory. puede ser enmascarable (ser desactivada o ignorada) o no (una interrupción de alta prioridad no puede enmascararse y debe ser reconocida). • AC: The accumulator. Most computers today have multiple general purpose registers. • MBR: The memory buffer register. which holds the next instruction to be executed. Una interrupción puede ser iniciada por el usuario o el sistema. This is a general purpose register and holds data that the CPU needs to process. which holds data values. puede ser sincrónica (ocurrir en el mismo lugar cada vez que un programa se ejecuta) o asincrónica (ocurrir inesperadamente) y puede resultar en el programa siendo terminado o continuando la ejecución una vez que se maneja la interrupción. • InREG: The input register. which holds data for the output device.un pedido de I/O es muy diferente a terminar un programa por una división por cero. . • OutREG: The output register. puede ocurrir durante o entre las instrucciones. Pero todas estas acciones se manejan por interrupciones porque requieren un cambio en el flujo normal de la ejecución del programa. which holds the memory address of the data being referenced.

2.3 The Instruction Set Architecture El instruction set architecture (ISA) de una máquina especifica las instrucciones que esa máquina puede llevar a cabo y el formato de cada instrucción. Los 12 bits restantes forman una dirección. lo cual permite un tamaño máximo de memoria . El ISA es esencialmente la interfaz entre el software y el hardware. Algunas ISAs incluyen cientos de instrucciones. Las instrucciones en Marie consisten de un código de operación de 4 bits que especifica la instrucción a ser ejecutada (16 posibles instrucciones).4.

3 INSTRUCTION PROCESSING Todas las computadoras siguen un ciclo de máquina básico.de 212–1. paso 4 excecute): 1. 4.IR[11-0]. Copia el contenido del PC al MAR: MAR <.M[MAR]. 4.PC+1 (como MARIE es direccionable a palabra el PC se incrementa en uno por lo que la dirección de la próxima palabra esta en el PC.M[MAR]. incremente el PC en un (ahora el PC apunta a la siguiente instrucción del programa): IR <. De ser necesario. . El CPU hace el fetch de una instrucción (la transfiere de memoria principal al registro de instrucción). La mayoría de las ISAs consisten en instrucciones para procesar datos. Los pasos en este ciclo.PC 2. paso 3 decode. decodifica IR[15-12]. y luego ejecuta la instrucción MBR <. ubicando esta instrucción en el IR. mover datos y controlar la secuencia de ejecución de un programa. PC<. que se llevan a cabo en ciclos específicos del reloj se listan más abajo (pasos 1 y 2 fetch. el ciclo: fetchdecode.excecute. Cuando un programa se carga inicialmente. utiliza la dirección en MAR para ir a memoria a obtener el dato ubicándolo en el MBR (y posiblemente en el AC). la decodifica (determina el código de operación y hace el fetch de cualquier dato necesario para llevar a cabo la misma). la dirección de la primera instrucción se ubica en el PC. Va a memoria principal y hace el fetch de la instrucción que se encuentra en MAR. Una gran parte de este ciclo se pasa en copiar datos de una locación a otra. habría que aumentar el PC en 2 para que apuntara a la dirección de la próxima instrucción) 3.1 The Fetch-Decode-Execute Cycle El ciclo fetch-decode-execute representa los pasos que sigue una computadora para correr un programa. Copia los 12 bits más a la derecha del IR en MAR y decodifica los 4 bits más a la izquierda para determinar el código de operación: MAR <. 4.3. Si MARIE fuera direccionable a Byte. y la ejecuta (realiza la operación indicada por la instrucción).

las computadoras pueden ejecutar millones de estos ciclos en un parpadeo. El registro input mantiene datos que están siendo transferidos desde un dispositivo de entrada a la computadora. El registro de salida mantiene información lista para enviarse a un dispositivo de salida. El tiempo usado por estos dos registros es muy .2 Interrupts and I/O MARIE tiene dos registros para ubicar entradas y salidas. largas instrucciones y memorias muy grandes. 4.3.Incluso con sets de instrucciones muy grandes.

la computadora debe ser capaz de leer cada carácter que se ubica en el registro input. La CPU continua con otros trabajos hasta que el dispositivo este listo. Por ejemplo. la interrupción se procesa. Si no hay ninguna interrupción el procesamiento continua normal. tras lo cual el ciclo de ejecución de la máquina continúa. Si es así. . Debemos evitar ambas situaciones. Si ingresa otro carácter en ese registro antes de que la computadora pueda procesar el actual. En ese punto. Este proceso requiere lo siguiente: • Una señal (interrupción) desde el dispositivo I/O a la CPU indicando que la entrada o salida está completa • Algunos medios para permitir a la CPU desviarse de su ciclo usual de fetchdecode-execute para reconocer esta interrupción. Como el procesador es muy rápido y la entrada del teclado muy lenta. MARIE maneja estos problemas usando interrupciones. Cuando la CPU ejecuta una instrucción de entrada o salida el dispositivo apropiado de I/O es notificado.importante. es muy probable que el procesador lea el mismo caracter en el registro de input muchas veces. El metodo en que la mayoría de las computadoras procesan una interrupción es chequear si hay alguna interrupción pendiente al comienzo de cada ciclo. El CPU procesa entonces la interrupción luego de lo cual continúa con el ciclo normal de fetchdecode-execute. entonces está perdido. si estámos ingresando un input desde el teclado y tipeamos muy rápido. el dispositivo envía una señal de interrupción al CPU.

si no sigue normalmente procesando las instrucciones del programa que se encuentra actualmente en ejecución. La CPU chequea este bit al comienzo de cada ciclo de máquina. 4. stack overflow o violaciones de proteccion) e interrupciones de software generadas al ejecutar una instrucción en el programa (como una que requiere que un programa cambie de correr en un nivel. cuando la CPU cambia a la rutina de atención de la interrupción. el manejo de la interrupción es el mismo. y luego empieza el ciclo de fecth-decode-excecute del programa original. la CPU procesa la interrupción. la CPU restablece el mismo exacto entorno en que el programa original estaba corriendo. a otro nivel.5. Cuando se termina la rutina de atención de la interrupción. internas generadas por alguna condición de excepción en el programa (como división por cero. y las condiciones de estado que existen para el programa original. Las interrupciones de I/O no son el único tipo de interrupción que puede ocurrir cuando un programa se está ejecutando. debe guardar el contenido de el PC. 4.1 What Do Assemblers Do? El trabajo de un programa ensamblador es convertir lenguaje ensamblador (usando códigos nemotécnicos) a lenguaje de máquina (el cual consiste enteramente en . El ciclo normal de fetch-decode-execute se corre en las instrucciones de la rutina de atención de la interrupción hasta que se haya completado.Túpucamente los dispositivos de I/O envían la interrupción utilizando un registro especial. Luego de que la CPU reconoce un pedido de interrupción. it is difficult for human beings to understand and program in sequences of zeros and ones. El CPU pasa de correr el programa a correr un procedimiento especial para manejar la interrupción. como nivel usuario. Un bit especial es seteado para indicar que ha ocurrido una interrupción. Luego la CPU vuelve al programa que estaba corriendo antes de que ocurriera la interrupción. el contenido de todos los registros en el CPU. como nivel kernel).5 A DISCUSSION ON ASSEMBLERS In the program shown in Table 4. so it seems a natural solution to devise a program that does this simple conversion for us. Cuando está setead. la dirección de la rutina de interrupción es determinada (usualmente por hardware) y la rutina es ejecutada. Hay interrupciones externas generadas por eventos externos (como I/O o fallas de energía). Por lo tanto. Sin importar el tipo de interrupción que ha sido invocada. But why bother with this conversion? Why not just write in machine code? Although it is very efficient for computers to see these instructions as binary numbers.3 it is a simple matter to convert from the assembly language instruction Load 104. to the machine language instruction 1104 (in hex). We prefer words and symbols over long numbers. el registro de status o flan. for example. cuando una entrada ingresa desde el teclado se setea este bit. This program is called an assembler. Por ejemplo. Cuando la CPU encuentra seteado el bit de interrupción ejecuta una rutina de interrupción que está determinada por el tipo de interrupción que ocurrió. La CPU debe volver al punto exacto en el que estaba corriendo el programa original.

Sin embargo. Las etiquetas son buenas para los programadores. Debe hacer dos pasos por el programa para realizar la traducción. el ensamblador construye un set de correspondencias llamado tabla de símbolos. Pero luego de haber construido la tabla de símbolos. Código objeto: Conjunto de instrucciones y datos escritos en un lenguaje que entiende el ordenador directamente: binario o código máquina. el cual es realmente una representación simbólica de los números binarios. hacen que el ensamblador tenga más trabajo. Esto significa que el ensamblador lee el programa dos veces. En MARIE por ejemplo se requiere que las etiquetas estén seguidas de una coma. Cuando el campo de dirección de una instrucción es una etiqueta en lugar de una dirección física. Los ensambladores toman el lenguaje ensamblador del programador. es un fragmento del programa final y es específico de la plataforma de ejecución. el ensamblador tiene que traducirla en una dirección física real de memoria principal. Por ejemplo. Los ensambladores típicamente espeficican reglas de formato para sus instrucciones incluyendo las etiquetas. Luego un enlazador (linker) se encarga de juntar todos los archivos de código fuente para obtener el programa ejecutable. o el código de máquina equivalente. y puede distribuirse en varios archivos que corresponden a cada código fuente compilado.valores binarios o cadenas de ceros y unos). Tambien podemos sustituir etiquetas para identificar o nombrar direcciones de memoria en particular. La mayoría de los lenguajes ensambladores permiten etiquetas. de la máquina). Puede ser en lenguaje máquina o bytecode. el código objeto. Sustituyendo los simples nombres alfanumericos por los códigos de operación hace que programar sea mucho más fácil. Como el ensamblador atraviesa el código de principio a fin. En la primera pasada. de comienzo a fin cada vez. haciendo la tarea de escribir programas ensambladores más simple. no sabe donde está ubicada la porción de datos de la instrucción si solo está dada por una etiqueta. El ensamblador lee el archivo fuente (programa de ensablador) y produce el archivo objeto (object file. Provienen de la traducción de cierto código fuente. haciendo innecesario saber la dirección de memoria exacta de los operandos para las instrucciones. una etiqueta puede estar limitada a tres caracteres y puede ser requerido que sea el primer campo en la instrucción. no puede traducir toda la instrucción en lenguaje de máquina en un paso. y lo convierte en instrucciones binarias. el código objeto es el resultado de la compilación del código fuente. Por ejemplo. podemos utilizar etiquetas para indicar direcciones de memoria. puede hacer una segunda pasada y “completar los espacios” .

Luego de la primer pasada. Tipicamente algún tipo de directiva de ensamblador (una instrucción para el ensamblador que no debe traducir a lenguaje de máquina) es dada para especificar qué base debe usar para interpretar el valor.En la primer pasada crea la siguiente tabla de símbolos. el ensamblador utiliza la tabla de símbolos para completar las direcciones y crear las correspondientes instrucciones en lenguaje de máquina. la mayoría de los lenguajes permiten que los valores de datos almacenados en memoria sean especificados como binarios. Así. . hexadecimales o decimales. en la segunda pasada sabe que X está en la dirección 104 y lo sustituye. En la segunda pasada. las instrucciones quedan incompletas de la siguiente manera. Como la mayoría de la gente no se encuentra cómoda leyendo hexadecimal. También empieza a traducir las instrucciones.

el lenguaje ensablador usualmente se convierte en el lenguaje a elegir. Los sistemas embebidos deben ser reactivos y usualmente son encontrados en ambientes de tiempo restringido.5.Otra directiva común en casi todos los lenguajes de programación es el delimitador de comentario. Estos sitemas están diseñados para desempeñar una única instrucción o un set muy específico de instrucciones. electrodomésticos (como lavarropas. el compilador maneja esta optimización por nosotros. los programadores deben evitar algunas de las restricciones que se encuentran en los lenguajes de alto nivel y manipular el código ensamblador ellos mismos. instrumentos médicos. El lenguaje ensablador podría ser necesario si el programador quiere lograr ciertas operaciones que no están disponibles en un lenguaje de alto nivel. juegos interactivos). celulares. Estos son sistemas en los cuales la computadora está integrada en un dispositivo que típicamente no es una computadora. Estas son aplicaciones perfectas para la programación en lenguaje ensamblador.2 Why Use Assembly Language? La mayoría de los programadores afirma que el 10% del código en un programa utiliza aproximadamente el 90% del tiempo de CPU. con parte reescrita en ensamblador) permite al programador sacar ventaja de los mejor de ambos mundos. Si todo el programa o respuesta de tiempo es crítica. 4. Es posible que todos los días usemos estos sistemas todos los días. en terminos de diseño de performance de respuesta y espacio crítico. 4. y los programadores usualmente encuentran dificl juzgar exactamente cómo se desempeñaran sus programas compilados. Haciendo esto. etc… son algunos ejemplos donde encontramos sistemas embebidos. Típicamente.7 A DISCUSSION ON DECODING: HARDWIRED VS. Este enfoque híbrido (la mayoría del programa escrito en lenguaje de alto nivel. Un programa de software embebido debe desempeñares en parámetros de respuesta muy específicos y esta limitada la cantidad de espacio que puede consumir. los programadores pueden hacer el programa más eficiente en términos de tiempo (y espacio). Un ejemplo perfecto. por lo tanto. Esto es porque los compiladores tienden a ocultar información sobre el costo (en tiempo) de varias operaciones. En aplicaciones de tiempo crítico. se encuentra en los sistemas embebidos. en mayor control. El lenguaje ensamblador pone al programador más cerca de la arquitectura y. un carácter especial que le dice al ensamblador o compilador que ignore todo el texto que siga después de ese carácter. Ocasionalmente. Los compiladores suelen hacer un gran trabajo. Pequeños electrónicos (como cámaras. autos (en particular el control del motor y sistema de antibloqueo de frenos). filmadores. MICROPROGRAMMED CONTROL (PAG 179) . lavavajillas). El compilador toma un lenguaje de alto nivel (como C++) y lo convierte en lenguaje ensamblador (que luego se convierte en código de máquina). sin embargo. El software para un sistema embebido es crítico. microondas. usualmente necesitamos optimizar este 10% de código.

Para asegurar que las lineas de control se setean adecuadamente hay dos enfoces. esta unidad controla los registros. Se necesita un circuito especial que utiliza. Utilizando el contenido del IR y el estado de la ALU. La unidad de control es implementada utilizando hardware (puertas NAND. Esto se llama hardwired control . contadores. flip-flops. El primero es conectar físicamente las líneas de control a las instrucciones de la máquina. señales del bus y señales del clock. los shifters y el acceso al bus. Por ejemplo un decodificador 4-to-16 podría utilizarse para decodificar el código de operación. Las instrucciones están divididas en campos y los diferentes bits de la instrucción se combinan a través de varios componentes digitales lógicos para manejar la línea de control. Comentario: Chequear otra traducción . por ejemplo). Produce como salidas. Para ello tiene que haber señales de control que hagan assert de las lineas de los varios componentes digitales para que las cosas sucedan como son descriptas. como inputs.La unidad de control hace que la CPU ejecute una secuencia de pasos correctamente. las operaciones de la ALU. los bits del código de operación. los bits del registro de status (flags). señales de control que manejan los componentes en la computadora.

sino que los viejos deben ser reubicados y reemplazados. porque no solo tienen que fabricarse nuevos chips. Esto es prohibitivamente caro. La desventaja es que el set de instrucciones y el control lógico están directamente relacionados por los circuitos especiales que son complejos y difíciles de diseñar o modificar.La ventaja del control cableado es que es muy rápido. Si alguien diseña una computadora hardwired y después decide extender el código de instrucciones los componentes físicos en la computadora tienen que cambiarse. .

el microprograma. que convierte la instrucción en las señales de control apropiadas. El microprograma es escencialmente un intérprete. Todas las instrucciones de la máquina son entradas a un programa especial. La ventaja de este enfoque es que si se requiere modificar el set de instrucciones. Este programa convierte las instrucciones de máquina de ceros y unos en señales de control.El otro enfoque es la microporgramación. utiliza software para control. . que está almacenado en firmware(ROM. Esencialmente hay una subrutina en este programa para cada instrucción de máquina. escrito en microcódigo. PROM o EPROM) al cual se refiere usualmente como control store. no se requiere ningun cambio de hardware. simplemente se puede hacer un update del microprograma para ajustarse.

T2. La unidad de control es responsable de las señales de tiempo reales que dirigen todas las acciones y transferencia de datos. La desventaja de este enfoque es que todas las intrucciones deben pasar por un nivel adicional de interpretación. T6. porque se requieren herramientas apropiadas. puede ser implementado en el microcódigo. . haciendo más lenta la ejecución del programa. hay un costo asociado con el desarrollo real. y T8.La microprogramación es flexible. simple en diseño y se presta a sets de instrucciones muy poderosos. Además de este costo en tiempo. Es importante notar que cualquiera sea el enfoque. T5. este control podría estar en un AND con una señal de tiempo para asegurarse de que la memoria cambie solo durante intervalos específicos. Estas señales se generan en secuencia con un simple contador binario. Por ejemplo las señales de tiempo para una arquitectura podrían incluir: T1. Sabemos que los registros pueden cambiar de estado solo con el pulso del reloj. pero también están limitados a cambiar en conjunto con una señal de tiempo dado. T4. Un fetch de una instrucción podría suceder solo cuando se activa T1 mientras que el fetch de un operando podría ocurrir solo cuando se activa T4. el tiempo es crítico. Estas señales controlan cuando pueden ocurrir las acciones. Por ejemplo una memoria que incluye el control Write Enable. T7. T3. La microprogramación permite convenientes compensaciones de hardware/software: si lo que querés no está implementado en hardware (por ejemplo tu máquina no tiene declarada la multiplicación).