Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 1: Introducción a la estructura de computadores 1. Objetivos de la asignatura. 2. Niveles de descripción de un computador. 3. Estructura básica de un computador convencional. 4. Evolución histórica: tecnología y arquitectura. 5. Lenguajes de descripción hardware.
1. Objetivos de la asignatura La arquitectura de un computador está constituida por el conjunto de funcionalidades disponibles para un programador que utiliza el lenguaje máquina, básicamente, el repertorio de instrucciones y los elementos de memoria referenciados desde él, es decir, los registros generales y la memoria principal. Las funcionalidades de una arquitectura se pueden conseguir con diferentes organizaciones internas o estructuras, diferenciándose unas de otras fundamentalmente en los parámetros de rendimiento y el coste. Finalmente, la estructura de un computador se puede implementar con diferentes tecnologías, siendo nuevamente el coste y el rendimiento los elementos diferenciales. Arquitectura, estructura y tecnología constituyen, pues, tres niveles de estudio del hardware de un computador. En esta asignatura abordaremos el estudio de la organización o estructura interna de un computador. Para ello la materia la dividiremos en cuatro módulos. En el primero realizaremos una introducción general a la estructura de computadores. En el segundo estudiaremos la arquitectura del repertorio de instrucciones (ISA), arquitectura que define la interfaz hardwaresoftware de la máquina. En el tercero veremos toda la jerarquía de memoria de una máquina y su gestión. Finalmente, en el cuarto estudiaremos las unidades de entrada/salida, los periféricos y los buses de comunicación. El estudio de la unidad aritmético-lógica y la unidad de control se aborda en la asignatura Ampliación de Estructura de Computadores. Para situar con mayor precisión el objeto de estudio de esta asignatura analizaremos en el apartado siguiente los diferentes niveles de descripción que se suelen contemplar en el estudio de un computador digital. 2. Niveles de descripción de un computador La estrategia que habitualmente se utiliza para abordar el estudio de los sistemas complejos consiste en especificarlos a diferentes niveles de abstracción. Cada nivel se caracteriza por: A) Unos elementos de entrada, es decir, disponibles para el diseño en este nivel, y que proceden del nivel inmediato inferior. B) Unos elementos de salida, es decir, objetivos del diseño en este nivel, y destinados al nivel inmediato superior. C)
Una metodología de análisis y síntesis de los elementos de salida en términos de los de entrada.
Con esta estrategia, la complejidad del sistema queda dividida, acotada y organizada en las complejidades parciales de cada nivel, dentro de cuyos límites se puede aplicar una metodología propia de estudio. Al computador digital como sistema artificial complejo se le ha aplicado esta estrategia. En nuestro caso consideraremos los siguientes niveles de abstracción dentro del estudio de un
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
computador digital: APLICACIONES
ALGORITMOS
LENGUAJES DE ALTO NIVEL SOFTWARE BASICO (S.O.)
ARQUITECTURA
Estructura de Computadores
TRANFERENCI DE REGISTROS LOGICO ELECTRONICO FISICO
Cada nivel se corresponde con la visión que tiene del sistema un tipo determinado de usuario, y en cada uno podemos considerar dos procesos de estudio diferentes, el análisis y la síntesis. El análisis parte de la implementación del sistema a un cierto nivel en términos de elementos básicos del nivel inferior, y llega a determinar la función del mismo, es decir, su especificación. El sentido de la síntesis es el opuesto, parte de la especificación de un sistema y obtiene su implementación en función de los elementos básicos del nivel inferior. En la siguiente figura hemos representado gráficamente esta relación:
Análisis ESPECIFICACION
IMPLEMENTACION Síntesis
Ejemplo: a
a +b
Su m a dor
b
Sín t esis
a r r a st r e a
a b a +b a r r a st r e 0 0 1 1
0 1 0 1
0 1 1 0
0 0 0 1
E specifica ción
An á lisis
b
a +b
a r r a st r e
Im plem en t a ción
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Comentaremos en los subapartados siguientes cada uno de estos niveles. Nivel Físico En el nivel físico se manipulan como elementos de entrada las formas geométricas que se corresponden con las máscaras de difusión utilizadas en el proceso de fabricación de los circuitos integrados del computador. Determinadas disposiciones de estas formas representan dispositivos electrónicos concretos, tales como transistores, resistencias, etc., que son los elementos de salida del nivel físico. En este nivel se suele utilizar como herramienta de estudio software de manipulación gráfica con restricciones.
DD
OUT
IN VSS
F ís ic o (s ilic io ) Nivel Electrónico En este nivel los elementos de salida, es decir, los biestables y las puertas lógicas, se obtiene a partir de dispositivos electrónicos (resistencias, transistores, etc.) conectados según una determinada topología. Como metodología de estudio (análisis y síntesis) en este nivel se utilizan técnicas cuantitativas de análisis en el plano eléctrico-temporal, fundamentalmente ecuaciones algebraicas y diferenciales. VD
D IN
OUT
VS S
Circ u ito e lé c tric o
Nivel Lógico Los elementos de entrada a este nivel son los biestables y las puertas lógicas, y los de salida son módulos combinacionales y secuenciales tales como multiplexores, codificadores, sumadores, registros, contadores, etc. Este nivel de estudio dispone de sus propias técnicas de análisis y síntesis. El comportamiento de un circuito combinacional se representa con una función lógica que admite una expresión algebraica manipulable simbólicamente dentro de un formalismo matemático: el álgebra de conmutación (un álgebra de Boole). Para los circuitos secuenciales se utiliza la teoría de las máquinas de estados finitos.
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
S
Q
NQ
R
Q
S
NQ
R
Circ u ito ló g ic o Transferencia de Registros (RT) Los elementos de entrada al nivel RT son registros, módulos combinacionales y elementos de interconexión (buses y/o multiplexores). Los primeros mantienen el estado del sistema, los segundos definen las transformaciones elementales del estado, y los terceros permiten el intercambio de información entre los dos primeros. Los elementos de salida son el conjunto de transferencias elementales posibles en la ruta de datos construida con los tres tipos de elementos de entrada. Al contrario de lo que ocurría en los dos niveles anteriores, el nivel RT no dispone de una herramienta propia de análisis y síntesis, aunque sí es posible utilizar los modernos lenguajes de descripción hardware (por ejemplo VHDL) como instrumentos de expresión precisa y estándar a este nivel. bus RMIC
RMICAUX
SECUENCIADOR
RI
MAR
ROM DE CONTROL
bus
Transferencia de registros Arquitectura (lenguaje máquina) Este es el nivel que separa el hardware del software. Los elementos básicos de entrada son las transferencias y transformaciones posibles de información en la ruta de datos de un computador. Con ellos se construyen las instrucciones máquina y su método de secuenciamiento, es decir, lo que se denomina un lenguaje máquina. Lo más significativo de este nivel es que con él comienzan los niveles propiamente simbólicos, es decir, niveles cuyos componentes básicos no son objetos físicos, sino símbolos relacionados por un lenguaje, el instrumento por excelencia del conocimiento simbólico. El nivel de lenguaje máquina suele ser el primer nivel al que tiene acceso el usuario de un computador, salvo si la máquina es microprogramable, en cuyo caso dispone de un nivel intermedio que permite modificar el repertorio de instrucciones. Normalmente, el usuario no utiliza directamente el lenguaje máquina, sino una representación simbólica del mismo conocida como lenguaje ensamblador, que ofrece algunas prestaciones más que el puro lenguaje máquina, como el uso de macros y la definición simbólica de constantes y posiciones de memoria. Este nivel queda definido por 1) el repertorio de instrucciones, con sus formatos, tipos de direccionamiento, modos de secuenciamiento y representación de datos, y 2) la memoria y el conjunto de registros visibles por el programador. En la actualidad cabe distinguir dos planteamientos diferentes a la hora de definir el nivel máquina de un computador.
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
M em oria
R egistros
R epertorio d e in stru ccion es LDR Ri, Dj STR Ri, Dj ADD Ri, Rj
En primer lugar está el planteamiento CISC (Complex Instruction Set Computers) que define un repertorio de instrucciones bastante complejo y numeroso, con muchos tipos de direccionamiento y muchos modos de control, pretendiendo reducir la distancia semántica que lo separa de los lenguajes de alto nivel, y facilitar así el diseño del compilador. La microprogramación es la técnica de diseño de la unidad de control con la flexibilidad suficiente para facilitar la implementación de las máquinas CISC. Un caso extremo de proximidad al lenguaje de alto nivel lo tenemos en arquitecturas avanzadas que tienen este tipo de lenguaje como su lenguaje máquina. En segundo lugar tenemos el planteamiento RISC (Reduced Instruction Set Computer), que simplifica la complejidad y el número de instrucciones máquina, dejándolo reducido a un conjunto pequeño y rápido que cubre un porcentaje muy elevado del peso computacional de los programas. Los compiladores para este tipo de arquitecturas asumen la responsabilidad de utilizar eficientemente unas instrucciones con poco contenido semántico pero elevada velocidad de ejecución. Dos aspectos importantes del nivel máquina son también la gestión de memoria y la entrada/salida. Sin embargo, en los computadores actuales estos recursos los utiliza el programa del usuario a través del sistema operativo. Software básico (sistema operativo) El Sistema Operativo (SO) no constituye un nivel del mismo tipo que los demás, por ejemplo, el lenguaje máquina o el lenguaje de alto nivel. En realidad se trata de un gestor de determinados recursos del nivel máquina que por la frecuencia y complejidad de uso resulta más eficiente utilizarlos agrupados en una especie de máquina virtual que es el SO. En los primeros computadores las funciones del SO eran escasas, limitadas básicamente a la carga del programa y a la entrada salida. Sin embargo, las competencias de este sistema han ido aumentando con la complejidad y sofisticación de las máquinas modernas, que funcionan en entornos multiusuario y multitarea y que requieren una gestión de todos los recursos de la máquina: la CPU, la jerarquía de memoria, el tratamiento de las excepciones, los mecanismos de protección, etc. El protagonismo que el SO tiene en un computador actual hace que cuando se diseña la arquitectura de un procesador se tengan muy en cuenta las funciones de este sistema. Lenguajes de alto nivel En este nivel se utilizan lenguajes de programación con una sintaxis y una semántica más complejas que las del lenguaje ensamblador. Estos lenguajes pretenden facilitar el trabajo del programador aportando recursos expresivos más próximos a los problemas que se van a resolver. En este sentido cabe diferenciar dos grandes grupos. Un primer grupo, denominado de estilo imperativo como Pascal, Fortran, etc., que presentan una semántica operacional que refleja directamente el funcionamiento de la máquina Von Neumann, es decir, que obligan al programador a expresar la secuencia de órdenes cuya ejecución resuelve el problema en cuestión. El segundo grupo lo formarían los lenguajes de estilo declarativo, como Prolog, Miranda o Lisp (puro), que disponen de un modelo computacional diferente (aunque equivalente) al de la máquina Von Neumann. En este caso el programador tan solo tiene que declarar las relaciones lógicas o funcionales de los elementos que intervienen en la especificación del problema a resolver.
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Este nivel requiere un proceso de traducción al nivel máquina que es realizado por un programa denominado compilador. Se trata de un programa que toma como dato de entrada un programa fuente escrito en un lenguaje de alto nivel, y produce como salida un programa objeto escrito en lenguaje máquina con una semántica equivalente (igual significado).
Nivel L.A.N. IF A ope B THEN <sentencias1> ELSE <sentencias2> L1 L2
Nivel L.M. CMP A, B Bope L1 <sentencias2> BRA L2 <sentencias1> ......
Algoritmos En el nivel algorítmico se expresa la resolución de un problema mediante un conjunto de reglas aplicadas de forma sistemática y ordenada, es decir, mediante un algoritmo. Los procedimientos que define un algoritmo son independientes de cualquier lenguaje de programación y de cualquier máquina particular. Aplicaciones Las aplicaciones se corresponden con dominios de actividad que pueden automatizarse con el uso de un computador digital. Del análisis del dominio se extraen unas especificaciones funcionales que son expresadas mediante algoritmos. Codificados estos algoritmos en un lenguaje de programación y previa compilación, se ejecutan en la máquina.
• Inconvenientes de la división entre niveles El establecimiento de niveles de abstracción en el estudio de un computador hace posible acotar su complejidad al utilizar metodologías de análisis y síntesis propias en cada nivel, permitiendo que dentro de un nivel el usuario pueda abstraerse de lo que ocurre en los demás niveles. Este planteamiento que facilita sin duda el estudio del computador presenta sin embargo algunas dificultades cuando se contempla el problema de la optimización. En efecto, a la hora de implementar una especificación no sólo deben cumplirse todos los requerimientos funcionales de la misma, además se deben optimizar ciertas funciones de calidad que generalmente tienen que ver con la velocidad (maximización) y el costo (minimización). En efecto, existen ocasiones en las que contemplar tan solo los niveles frontera de un nivel en el que se plantea un problema de diseño puede dar lugar a la imposibilidad de optimizar la implementación. A título de ejemplo citaremos dos casos en los que se presenta esta situación. El primero entre los niveles eléctrico y lógico, y el segundo entre los niveles lenguajes de alto nivel y arquitectura (repertorio de instrucciones) 1) Niveles eléctrico <--> lógico Si nos planteamos el diseño de un multiplexor con conmutadores bidireccionales (tecnología NMOS estática) respetando los niveles de diseño, obtendríamos en primer lugar el esquema lógico (con puertas) del multiplexor, y después expresaríamos cada puerta lógica en términos de los conmutadores bidireccionales.
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
X3 X2
X3 X2
MUX
Z
X1 X1
X0 X0
1
1
El diseño resultante es más costoso (mayor número de conmutadores) que el que podemos obtener si planteamos el diseño directamente con conmutadores:
X3
S1
S0
S1
S0
S1
S0
S1
S0
1
X2
X1
X0
2) Niveles lenguaje de alto nivel <--> arquitectura En este caso un compilador, para optimizar el código máquina que genera (mayor velocidad),
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
tiene en cuenta no sólo la arquitectura (repertorio de instrucciones) sino la forma en que se ejecutan estas instrucciones (estructura) en la ruta de datos de la máquina. Este hecho puede dar lugar a que el orden de las instrucciones máquina generadas no sea el orden lógico que utilizaría un programador de lenguaje máquina que ignorase los detalles estructurales de la arquitectura. Esta situación viene producida fundamentalmente por la segmentación y paralelización de las instrucciones dentro de la máquina y se estudiará con detalle en las asignaturas de Ampliación de Estructura de Computadores y Arquitectura e Ingeniería de Computadores. 3. Estructura básica de un computador convencional La estructura básica de un computador actual sigue siendo la original de von Neumann, una máquina secuencial que ejecuta datos escalares y que hemos representado en la siguiente figura: MEMORIA
P ROCES AD OR CON TROL EN TRAD A
S ALID A U AL
REG.
La memoria almacena las instrucciones del programa, los datos iniciales, los resultados parciales y los finales. Se accede de forma directa (RAM) a cualquier posición para realizar operaciones de lectura o escritura. El procesador es la unidad encargada de leer y ejecutar las instrucciones. Para ello dispone de una ruta de datos constituida por un conjunto de registros (REG.), una unidad aritmético-lógica (UAL), y unos buses de comunicación; y una unidad de control, que es la encargada de generar las señales que gobiernan todos los dispositivos. La entrada y salida constituyen la unidad para la transferencia de información con el mundo exterior. Funcionalmente la máquina tiene las siguientes características: 1) Organización lineal de la memoria 2) Palabra de longitud fija. 3) Espacio único de direcciones. 4) Memoria única para datos e instrucciones sin diferenciar entre ambos. 5) Ejecución secuencial de las instrucciones salvo las de ruptura de secuencia A esta organización básica de von Neumann se han ido incorporando algunas aportaciones significativas entre las que destacaremos las siguientes: a) Sistema de interrupciones, que permite la interrupción de un programa en ejecución producida por una señal externa a la máquina. El sistema de interrupciones permite una mejor sincronización de la Entrad/Salida con el exterior y la posibilidad de compartir la CPU por más de un programa
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Programa principal I1 I2 . . .Ii Ii+1 .
señal de interrupción línea de interrupción
.
.In Rutina de tratamiento i1 i2 . . im
b) Sistema de memoria cache, que permite disminuir el tiempo de acceso a la memoria principal(Mp) ubicando una memoria de menor tamaño y mayor velocidad (memoria cache, Mc) entre la CPU y Mp. El sistema explota la localidad de referencia de los programas haciendo que Mc contenga en cada momento los bloques de Mp más referenciados, y evitando así que la CPU tenga que acceder a Mp: CPU palbras Memoria cache (Mc) bloques Memmoria principal (Mp)
c) Sistema de memoria virtual, que permite la ejecución de programas cuyo tamaño supere el de la Mp. Para ello el sistema mantiene en Mp, de forma transparente para el programador, tan sólo el conjunto de páginas activas (con mayor probabilidad de ser referenciadas) del programa en ejecución. Las restantes páginas que completan el programa residen en la memoria secundaria, hasta que son referenciadas, en cuyo caso el sistema las activa llevándolas a Mp:
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Memoria principal (Mp)
páginas
Memoria secundaria (Ms)
4. Evolución histórica: tecnología, estructura y arquitectura La velocidad de procesamiento de información de un computador está determinada básicamente por tres elementos: arquitectura, organización (o estructura) y tecnología. Podemos analizar la influencia de estos elementos en la velocidad de procesamiento de información de un computador teniendo en cuenta que el tiempo T de ejecución de un programa se puede expresar como el producto de tres factores: el número de instrucciones del programa (N), el número medio de ciclos por instrucción (CPI), y el tiempo de ciclo (Tc), como hemos representado en la siguiente figura:
Tc
P r ogr a m a 1 ciclo
I1
3 ciclos
I2
2 ciclos
I3
N
CP I (n º de ciclos m edio/in st r u cción )
in st r u ccion es .
t iem po
T
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
T = N * CPI * Tc
Arquitectura del computador Compilador
Organización del computador Tecnología Arquitectura del computador Organización del computador
T N CPI Tc
= = = =
tiempo de ejecución del programa número de instrucciones del programa número medio de ciclos por instrucción tiempo de ciclo
Es decir, mientras la arquitectura influye a través del número medio de ciclos por instrucción y del número total de instrucciones, la organización lo hace a través de éste último y el tiempo de ciclo, mientras que la tecnología lo hace casi exclusivamente a través del tiempo de ciclo (o su inversa, la frecuencia de reloj del procesador). El tiempo de ciclo viene determinado por los tres niveles tecnológicos: físico, electrónico, lógico y trasferencia de registros. La tecnología ha experimentado una transformación continua durante las últimas décadas. Desde la aparición del primer computador comercial, la industria informática ha pasado por cuatro generaciones de computadores, diferenciadas básicamente por la tecnología de los componentes básicos. Los relés y las válvulas de vacío de 1940 a 1950, los diodos y transistores discretos de 1950 a 1960, los circuitos integrados de pequeña y media escala de integración (SSI/MSI) de 1960 a 1970, y los circuitos integrados de alta y muy alta escala de integración (LSI y VLSI) desde 1970 en adelante. La disminución del tiempo de conmutación de los componentes electrónicos ha repercutido directamente en el aumento de velocidad de los computadores. También el aumento de la capacidad de integración y de encapsulado han repercutido en la misma dirección. Los cambios tecnológicos alteran constantemente las relaciones de compromiso tecnología/organización/arquitectura, obligando a la reconsideración de viejas ideas ante un nuevo avance tecnológico. Aumento de rendimiento a través de la organización y arquitectura A lo largo de las últimas cuatro décadas la organización y arquitectura de computadores ha experimentado un desarrollo gradual, no traumático, que ha ido decantando aquellas características responsables de las mejoras de rendimiento. Paralelismo y Segmentación
Las organizaciones y arquitecturas paralelas consiguen que en ciertos instantes de tiempo el computador procese simultáneamente más de una operación básica. La simultaneidad temporal se consigue fundamentalmente con dos técnicas: el paralelismo y la segmentación. La primera ejecuta simultáneamente varias operaciones independientes replicando el número de operadores hardware. La segunda descompone el operador y la operación correspondiente en etapas secuenciales y autónomas, de manera que simultáneamente se puedan ejecutar etapas diferentes de varias operaciones. Ambas técnicas se consideran como dos formas del paralelismo: el paralelismo espacial o replicación la primera, y el paralelismo temporal la segunda. La idea básica de la segmentación estaba ya latente en la propuesta de von Neumann para construir el primer computador de programa almacenado. Al hablar sobre las técnicas de entrada/salida, sugería la conveniencia de disponer un buffer que permitiese el solapamiento
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
de la ejecución del programa con las operaciones de E/S, es decir, una forma primaria de procesamiento segmentado. Procesadores Segmentados
Se trata de arquitecturas monoprocesador que operan con una organización interna en la que se segmenta la ejecución de las instrucciones a fin de iniciar una (y finalizar otra) cada ciclo de operación. Sin embargo este objetivo límite difícilmente llega a conseguirse debido a los riesgos estructurales, las dependencias de datos, las bifurcaciones y las excepciones. Para reducir al máximo el efecto de tales ineficiencias se utilizan técnicas software como la reordenación estática de instrucciones, el renombramiento de registros, y los saltos retardados; y técnicas hardware como el adelantamiento (forwarding), la reordenación dinámica de instrucciones y la predicción dinámica de saltos. Bú squ eda
Decodifica ción
Un ida d Bu
Un ida d De
E jecu ción
E scr it u r a
Un ida d Ej
Un ida d Es
Regist r os
In st r u cción 1
Bu 1
In st r u cción 2
De1
E j1
E s1
Bu 2
De2
E j2
E s2
Bu 3
De3
E j3
E s3
Bu 4
De4
E j4
In st r u cción 3 In st r u cción 4
E s4 ciclos
1
2
3
4
5
6
7
8
Procesadores Superescalares Un procesador superescalar de grado m emite m instrucciones por ciclo, debiendo ser también m el paralelismo a nivel de instrucción para explotarlo completamente. En estos procesadores los recursos para la decodificación y ejecución de instrucciones se incrementan hasta el punto de disponer de m cauces segmentados operando concurrentemente, si bien en algunas etapas los cauces pueden compartir algunas unidades funcionales. En general, los conflictos por dependencias de datos, de control y estructurales de los procesadores escalares segmentados siguen existiendo en los superescalares con mayor complejidad. Las máquinas superescalares proporcionan compatibilidad a nivel del código objeto con las máquinas escalares, detectando el paralelismo de las instrucciones en tiempo de ejecución. Normalmente, se dividen las instrucciones máquina en categorías, y como mucho una instrucción de cada categoría pueden emitirse simultáneamente.
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Un ida d de Bú squ eda
Un ida d de E m isión de In st r u ccion es
Un ida d de ejecu ción 1
vía 1
Un ida d de ejecu ción 2
vía 2
Un ida d de ejecu ción 3
vía 3
Procesadores VLIW En un procesador VLIW (Very Long Instruction Word) una única instrucción especifica más de una operación concurrente, reduciéndose el número de instrucciones por programa en comparación con el caso escalar. Las organizaciones VLIW extendieron y formalizaron el concepto de microcodificación horizontal que se venia utilizando años atrás para el diseño de procesadores de propósito especial dedicados a tareas intensivas en cálculo, tales como el procesamiento de señales digitales. Utilizando técnicas avanzadas de compilación se puede extraer el paralelismo de grano fino de un amplio rango de aplicaciones científicas y de propósito general. En estos procesadores los conflictos por dependencias de datos y estructurales se resuelven antes de la ejecución, y son explícitamente controlados por las instrucciones. El hardware adicional se dedica a caminos de datos paralelos y más unidades funcionales, en lugar de a lógica de control y sincronización. In st r u cción la r ga
DE C
Un ida d de ejecu ción 1
DE C
Un ida d de ejecu ción
DE C
Un ida d de ejecu ción 3
Regist r os
Procesadores Vectoriales Los procesadores vectoriales disponen de operaciones que trabajan sobre vectores de números. Por ejemplo, una operación vectorial puede sumar dos vectores de 64 elementos en punto flotante dando como resultado otro vector de 64 elementos. La instrucción vectorial es equivalente a un bucle completo en el que se calcula un elemento del resultado en cada iteración, se actualiza el índice y se bifurca al comienzo. Una simple instrucción vectorial especifica, pues, una gran cantidad de trabajo, por lo que se reduce la anchura de banda necesaria para su lectura en comparación con la de las instrucciones escalares equivalentes. Además, el acceso a los datos tiene un patrón conocido. Desde el punto de vista arquitectónico son procesadores segmentados con instrucciones máquina vectoriales. Al no existir dependencias entre operaciones de una instrucción vectorial, se explota eficientemente la segmentación en las unidades aritméticas. Pero para conseguir el
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
rendimiento máximo de estas arquitecturas hay que alimentar a las unidades funcionales segmentadas con nuevos datos en cada ciclo de reloj, lo que requiere un gran ancho de banda con la memoria principal.
Mem or ia
Regist r os
Un ida d a r it m ét ica segm en t a da
Regist r os
Un ida d a r it m ét ica segm en t a da
Regist r os
Un ida d a r it m ét ica segm en t a da
Multiprocesadores de Memoria Compartida Se trata de arquitecturas compuestas por un conjunto de procesadores que acceden a una única memoria común a través de una red de interconexión. Utilizan memorias cache locales para las que hay que resolver el problema de su coherencia con respecto a la memoria principal y entre sí. Las soluciones que se adoptan tienen un mayor o menor soporte hardware y dependen mucho de la red de interconexión. Otro problema que plantean estas arquitecturas es el de la sincronización de los diferentes procesadores cuando participan de una tarea común. Para ello es necesario disponer del soporte hardware en forma de instrucciones máquina del tipo TEST&SET, TEST&AND, etc. que permiten implementar secciones críticas y otros mecanismos de sincronización a nivel del sistema operativo. P r ocesa dor P1
P r ocesa dor P2
P r ocesa dor Pn
Red de in t er con exión (bu s, r ed m u lt iet a pa , cr ossba r )
Mem or ia com ú n com pa r t ida
Multicomputadores Son multiprocesadores de memoria distribuida donde cada procesador tiene un espacio privado de direcciones. Se comunican y sincronizan mediante paso de mensajes a través de una red de interconexión. Las topologías de red más utilizadas son la malla y el hipercubo.
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mem or ia M1
Mem or ia Mn
P r ocesa dor P1
P r ocesa dor Pn
Red de in t er con exión est á t ica
5. Lenguajes de descripción hardware. Los lenguajes de descripción hardware son lenguajes de alto nivel con una sintaxis similar a los de programación (C, ADA, Pascal, Modula, etc.) y una semántica que permite el modelado y simulación de los dispositivos hardware a diferentes niveles de abstracción. Los primeros lenguajes de este tipo sólo pretendían servir de vehículo de comunicación del diseño. Se trataba de formalismos de especificación de los dispositivos hardware desarrollados por instituciones universitarias o por industrias electrónicas que alcanzaron escasa difusión. Pero los actuales lenguajes han adquirido un alto grado de estandarización y han adoptado los nuevos conceptos de la ingeniería software, permitiendo la verificación de la especificación del diseño mediante simulación. Se utilizan como vehículo de entrada a muchas herramientas de diseño automático. Revisaremos brevemente algunos de estos lenguajes 5.1. Lenguajes precursores CDL (Computer Design Language) fue desarrollado por Yaohan Chu a comienzo de los años 60 bajo el principio de separación de la componente lógica y electrónica de un computador digital. CDL refleja directamente el hardware y sus operaciones, es decir, existe una correspondencia uno-a-uno entre los objetos y operaciones hardware (registros, RAMs, relojes, suma, cuenta, etc.) y las construcciones del lenguaje. La primera versión del simulador CDL para IBM 7090 estuvo disponible en 1968, y la versión tercera para Univac pocos años más tarde. Se utilizó en universidades y en la industria del radar y aeronáutica. DDL (Digital systems Design Language) se desarrolló a mediados de los 60 en la Universidad de Wisconsin con varios objetivos: precisión y concisión para facilitar la especificación de los diseños, potencia suficiente para modelar sistemas complejos, independencia respecto a cualquier tecnología o procedimiento de diseño, capacidad de especificación a diferentes niveles de abstracción y, finalmente, una sintaxis y una semántica que permitieran la documentación jerárquica del diseño. AHPL (A Hardware Programming Language) fue propuesto por F.J. Hill y G.R. Peterson unos meses más tarde que el CDL y DDL, y apareció publicado por primera vez en 1973 en la edición original de Digital Systems: Hardware Organization and Design. Los autores concibieron AHPL como un lenguaje de síntesis: todo dispositivo síncrono que pudiese ser implementado en hardware debía ser expresable en AHPL de manera tal que se pudiese traducir a una realización física siguiendo un conjunto simple de reglas. En opinión de uno de sus autores, F.J. Hill, que participó como miembro del grupo de trabajo que formuló las especificaciones originales para VHDL, la existencia de AHPL favoreció la incorporación de mecanismos para permitir el proceso de síntesis en VHDL.
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
ISPS
(Instruction Set Processor Specifications) con este lenguaje se dió un paso importante hacia la formalización del proceso de diseño a niveles de comportamiento. Además de la simulación y la síntesis, ISPS se utilizó en la generación de software, la verificación de programas y la evaluación de arquitecturas. ISPS favoreció los aspectos de comportamiento sobre los estructurales pero sin eliminarlos completamente.
TI-HDL (Texas Instruments-HDL) es un lenguaje de descripción jerárquica del diseño, estructurado en bloques y basado en texto, que se ha utilizado principalmente en el diseño de circuitos integrados. Procede de antiguos lenguajes usados allá por 1968, concretamente el TIBSD (TI Boolean System Description), desarrollado como lenguaje de entrada de datos para un sistema CAD de circuitos impresos, y Fusim (Functional Simulator), utilizado para describir modelos de alto nivel de microprocesadores y para generar prototipos de patrones de tests. 5.2. Lenguajes actuales Verilog es un lenguaje de descripción hardware diseñado por la compañía Cadence Design Systems Inc., que se ha venido utilizando como lenguaje del simulador digital Cadence. El uso de Verilog está promovido por la Open Verilog International (OVI), que publicó en octubre del 91 la primera versión del Hardware Description Language Reference Manual. En Verilog la unidad de diseño fundamental es el módulo, que describe un componente hardware con su interfaz y contenido. Desde un punto de vista funcional, un módulo Verilog contiene la información de una entidad y su correspondiente arquitectura VHDL. Verilog no proporciona compilación independiente de módulos: todos los módulos relacionados con el mismo diseño y simulación deben estar en el mismo archivo. UDL/I (Unified Design Language for Integrated circuits) es un lenguaje de descripción hardware que se viene desarrollando desde 1989 por la Japan Electronic Industry Development Association, dependiente de importantes compañías japonesas tales como NTT. Una de las características de UDL/I es que pretende ser específico para modelar circuitos integrados. La única unidad de diseño existente en UDL/I es la descripción de diseño, que comprende varias subentidades denominadas descripciones de módulos. Una descripción de diseño contiene el modelo de un circuito integrado que consta de varias subunidades o módulos, cada uno de los cuales está especificado por una descripción de módulo. VHDL (VHSIC Hardware Description Language) es un lenguaje impulsado por el Departamento de Defensa de los Estados Unidos dentro del programa VHSIC (Very High Speed Integrated Circuits) y estandarizado por IEEE Computer Society. Con VHDL se puede estudiar un sistema digital a diferentes niveles de abstracción dentro de un único lenguaje de programación, acelerando considerablemente las diferentes fases diseño y proporcionando un mejor conocimiento del mismo cuando se aborda la fase de implementación física. VHDL es un lenguaje con una semántica orientada a la simulación. Por ello, su principal dominio de aplicación es el modelado de dispositivos hardware para comprobar su corrección funcional. Sin embargo, como ilustra la siguiente figura sus áreas de aplicación son cada vez más numerosas, y hoy día se utiliza en la síntesis automática, la diagnosis de fallos, la verificación formal, el modelado de rendimiento y la documentación
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
S ín te s i i1
su m a
ca r r y
i2
Mo d e la d o Re n d im ie n t
D o c u m e n ta c i Cir cu it o semisu ma do Compon en t es: pu er ta AND pu er ta OR pu er ta XOR ............................ ............................
VHD L EN TITY cir cu ito IS P ORT(i1,i2 : IN bit ; su m , ca r r y : OU T); E N D cir cu it o; ARCH ITE CTU RE est r u ct u r a OF cir cu it o BE GIN P ROCE SS .................. E ND END
Ve rific a c ió F o rm a
D ia g n o s is d e i1
su m a
i2
¿cor r ect o
S im u la c ió
ca r r y
si CLK X Z
La síntesis automática tiene como objetivo la generación de dispositivos digitales a partir de una especificación inicial expresada en un lenguaje de descripción hardware. VHDL, al ser un lenguaje con una semántica poco formal, en el que se pueden mezclar diferentes estilos de descripción, no es el más apropiado para utilizar como entrada en las herramientas de síntesis. Sin embargo, dado su status de estándar IEEE y su amplia aceptación en la industria electrónica, resulta muy conveniente no romper el ciclo de diseño saliendo de VHDL en la fase de síntesis. Por ello, lo que se realiza habitualmente en este terreno es definir subconjuntos sintetizables de VHDL. En este sentido cabe distinguir dos grandes subconjuntos. Uno que engloba las construcciones secuenciales de VHDL, utilizado para la síntesis de alto nivel, y otro que parte de unas construcciones concurrentes de VHDL que permiten descripciones de dispositivos a nivel de transferencia de registros (RTL), utilizado para la síntesis de bajo nivel.
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La diagnosis de fallos en circuitos digitales se puede plantear a partir de las descripciones VHDL de los mismos. En efecto, en lugar de identificar la parte de circuito que falla, podemos localizar la parte de descripción VHDL cuya implementación hardware tiene un fallo físico y está causando el fallo de comportamiento observado. En principio esta diagnosis es similar a la que se realiza a nivel de puertas, pero en este caso el nivel de descripción hardware puede ser más alto y consecuentemente el modelo de fallos será diferente. La verificación formal de un diseño consiste en probar que para todos los estados iniciales aceptables y para todas las entradas posibles, la implementación del diseño cumple su especificación. Las otras dos alternativas para verificar un diseño, la síntesis automática y la simulación funcional, pueden resultar incompletas. En efecto, los diseños producidos por síntesis automática son correctos por construcción si los componentes primitivos están completamente verificados y si las transformaciones realizadas en el proceso de síntesis son así mismo correctas. Sin embargo, probar la corrección formal de un método de síntesis implica probar la corrección formal del método en sí y del software que lo implementa, tarea que puede resultar impracticable. Por otra parte, la verificación funcional por simulación exhaustiva también es impracticable a partir de una complejidad media en el diseño. La verificación formal requiere un modelo matemático para representar las propiedades bajo estudio y un cálculo para realizar computación simbólica sobre el modelo. La lógica es la rama de las matemáticas más ampliamente utilizada en la verificación formal, incluyendo la lógica de predicados de primer orden, la lógica de orden superior y la lógica temporal. Al no existir una semántica formal para VHDL los sistemas de verificación formal, al igual que los sistemas de síntesis, se limitan a subconjuntos del lenguaje. Los modelos de rendimiento constituyen el nivel más alto de abstracción de los sistemas electrónicos. Estos modelos se utilizan principalmente para estudiar la capacidad global de procesamiento de información de un sistema en las primeras etapas del proceso de diseño. El objetivo es identificar las principales unidades funcionales y definir su forma de actuación en la transformación de los datos de entrada en datos de salida. A este nivel de conceptualización el diseñador ve una unidad funcional como algo que realiza una cierta tarea en un cierto tiempo, sin detalles específicos sobre la forma de realizar la tarea. En realidad, puede que estos detalles no se conozcan aún en esta fase del diseño. Debido a esta ocultación de detalles sobre los valores de los datos y sus transformaciones específicas se dice que los datos son no interpretados, y para resaltar este hecho a los modelos de rendimiento se les denomina a veces modelos no interpretados. VHDL, al disponer de recursos expresivos con alto nivel de abstracción, facilita la confección de modelos de rendimiento basados en redes de Petri extendidas y colas estocásticas. Finalmente, la documentación es una de las tareas más importantes en todo proceso de diseño, y muy particularmente cuando el sistema tiene el grado de complejidad de los circuitos actuales. En estos casos se hace indispensable disponer de lenguajes con una elevada capacidad de abstracción y ampliamente aceptados por los diseñadores, como ocurre en la actualidad con VHDL. Como muestra la siguiente figura, VHDL dispone de recursos expresivos para cubrir totalmente la descripción y el modelado de dispositivos digitales en los niveles circuito lógico, transferencia de registros y chip. Los niveles de sistema y circuito eléctrico sólo se cubren parcialmente. Pero lo más interesante del lenguaje en este aspecto es que permite mezclar en una misma descripción diferentes niveles. Esto, unido al modelo de concurrencia que permite la construcción de modelos estructurales en los que los componentes básicos pueden a su vez ser descritos con modelos estructurales, hace posible el establecimiento de una descomposición estructural de la jerarquía de diseño.
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
S OF TWAR E
AR QU ITECTU RA VHD L
TRAN S F EREN CIA D E REGIS TROS
LÓGICO ELECTRICO F ÍS ICO Á
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 2: Formato de las instrucciones y modos de direccionamiento 1. Formato de las instrucciones 2. Propiedades generales del direccionamiento 3. Modos de direccionamiento. 4. Soporte de los modos de direccionamiento a los lenguajes de alto nivel
Las instrucciones máquina son las acciones elementales que puede ejecutar un computador. Una acción compleja deberá codificarse como una secuencia de instrucciones máquina en lo que se denomina un programa. La arquitectura de un procesador entendida como el conjunto de recursos operativos disponibles por un programador a nivel de lenguaje máquina queda definida por el repertorio de instrucciones (ISA: Instruction Set Architecture). En general, una instrucción codifica una operación básica que el computador realiza sobre unos datos ubicados en la memoria o en los registros de la máquina y a los que accede utilizando un modo de direccionamiento. Por consiguiente, la arquitectura ISA de un procesador viene determinada por los siguientes factores: a) Tipos de datos y formatos que pueden manejar las instrucciones: naturales, enteros, reales, caracteres, etc. b) Modos de direccionamiento de los datos ubicados en la memoria: inmediato, directo, indirecto, etc. Estos dos factores son determinantes para la implementación eficiente de las estructuras complejas de datos de un lenguaje de alto nivel. c) Conjunto básico de operaciones que se pueden realizar sobre los datos: suma, resta, etc. Propiedad de ortogonalidad Diremos que un repertorio es ortogonal cuando las instrucciones puedan combinar los elemento de los tres factores anteriores sin ninguna restricción. La ortogonalidad completa no se da en ningún repertorio de máquina real.
tipo de direccionamiento .
indirecto -directo
--
inmediato --
(MUL, real, indirecto) ADD
|
|
XOR
SUB
|
|
MUL
|
operaciones
entero -natural -real --
tipo de datos
1. Formato de las instrucciones Las informaciones relativas a los cuatro factores anteriores se codifican en cada una de las instrucciones siguiendo un formato preestablecido. El formato determinará la longitud en bits de las
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
instrucciones y los campos que codifican el valor de los factores citados. En general una instrucción se compone de los siguientes campos: • Código de operación (CO) • Operandos fuente (OP1, OP2,...) • Operando destino o Resultado (OPd)
• Instrucción siguiente (IS) CO
OP1
OP2
..........
OPd
IS
El CO determina la operación que se realiza sobre OP1,OP2,... El resultado se deja en OPd. Lo normal es que el número de operandos fuente de un repertorio no pase de 2. La dirección de la instrucción siguiente IS queda implícita en todas las instrucciones (se trata de la instrucción siguiente del programa) salvo en las instrucciones de ruptura condicional o incondicional de secuencia.
1.1 Diseño del repertorio de instrucciones. Los repertorios de instrucciones podemos clasificarlos atendiendo a los siguientes criterios: A) Número de operandos explícitos por instrucción a) 3 operandos explícitos
CO
ejemplo:
OP1 (fuente 1)
OP2 (fuente 2)
OP3 (destino)
AÅB+C
ADD B,C,A
• Máxima flexibilidad • Ocupa mucha memoria si los operandos no están en registros b) 2 operndos explícitos CO
OP1 (fuente 1)
ejemplo:
ADD B, C
OP2 (fuente
BÅB+C
• Reduce el tamaño de la instrucción • Se pierde uno de los operandos c) 1 operando explícito CO
OP1 (fuente
ejemplo:
ADD B
Acumulador Å <Acumulador> + B
• Supone que fuente 1 y destino es un registro predeterminado (acumulador) • Se pierde un operando fuente d) 0 operandos explícitos CO
ejemplo:
ADD
cima de pila Å <cima de pila> + <cima de pila - 1>
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• Se trata de computadores que trabajan sobre una pila Ejemplo: 3 operandos ADD C, D, C SUB A, B, A MUL A, C, E
ADD SUB MUL MOV
E = (A – B)*(C + D) 2 operandos 1 operando LOAD A C, D SUB B A, B STORE A A, C LOAD C C, E ADD D MUL A STORE E
0 operandos (PUSH) LOAD A (PUSH) LOAD B SUB (PUSH) LOAD D (PUSH) LOAD C ADD MUL (PULL) STORE E
B) Forma de almacenar operandos en la CPU a) Arquitectura de pila (HP 3000/70) b) Arquitectura de acumulador (Motorola 6809) c) Arquitectura de registros de propósito general (IBM 360) Ejemplo: código máquina en cada una de las tres alternativas correspondiente a la sentencia de asignación C := A + B C=A+B Pila
Acumulador
Conjunto de registros
PUSH A
LOAD
A
LOAD R1, A
PUSH B
ADD
B
ADD
ADD
STORE C
POP
R1, B
STORE C, R1
C
Las arquitecturas de registros de propósito general se clasifican a su vez atendiendo al número máximo de operandos (2 ó 3) que pueden tener las instrucciones de la ALU y cuantos de ellos se pueden ubicar en memoria: (operandos - en memoria) (
3
-
0
) Arquitectura registro-registro (también llamada de carga-almacenamiento). Utilizan tres operandos totales y cero en memoria. Formato de longitud fija y codificación simple de las instrucciones que pueden ejecutarse en un número similar de ciclos. Facilitan un modelo simple de generación de código apara el compilador. SPARC, MIPS, PowerPC
(
2
-
1
) Arquitectura registro-memoria. Utilizan dos operandos totales con uno ubicado en la memoria. Intel 80X86, Motorola 68000
(
3
-
3
) Arquitectura memoria-memoria. Utilizan tres operandos totales con la posibilidad de ser ubicados los tres en memoria. VAX
Códigos de operación de longitud fija y variable n
Una máquina con un formato de instrucción que dedica n bits al CO permitirá 2 instrucciones diferentes, cada una de las cuales puede tener diferente número de operandos (0, 1, 2, 3, etc.). Los bits del campo
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
OPERANDOS se pueden utilizar para extender el CO de aquellas instrucciones con menor número de operandos. Ejemplo: Partimos de una máquina con instrucciones de longitud fija de 24 bits y consideraremos los siguientes supuestos: 1) La máquina dispone de 16 registros generales 4 4 16 CO
R
OP
Ö En este caso se pueden codificar 16 instrucciones de 2 operandos: uno en registro y el otro en memoria 2) Si queremos extender el CO se puede utilizar una de las 16 combinaciones del CO (quedarían 15 con 2 operandos), por ejemplo CO = 1111, dando la posibilidad de codificar 16 instrucciones de 1 operando en memoria. Si queremos seguir extendiendo el CO podemos utilizar CO = 1111 1111 (quedarían 15 con 1 operando) para definir instrucciones sin operandos (216 = 65.536) En la siguiente tabla se resume el proceso descrito. R 0000 R 0001 . . . . . . R 1110 1111 0000 1111 0001 . . . 1111 1110 1111 1111 1111 1111
1111 1111
OP OP . . . . .
15 instrucciones de 2 operandos (CO de 4 bits) 15 instrucciones de 1 operando
OP 0000 0000 0000 0000 0000 0000 0000 0001 . . . 1111 1111 1111 1111
(CO de 8 bits) 216 = 65.536 instrucciones de 0 operandos (CO de 24 bits)
Otra alternativa: dedicar 2 bits para indicar si la instrucción tiene 0, 1 o 2 operandos: 2 L
2 CO
4
16
R
OP
En este caso podemos codificar los siguientes grupos de instrucciones: L = 00 Î CO de 2 bits Î 4 instrucciones de 2 operandos L = 01 Î CO de 6 bits Î 64 instrucciones de 1 operando L = 10 Î CO de 22 bits Î 4.194.304 instrucciones de 0 operandos Optimización del CO variable en función de la frecuencia de las instrucciones. Una posibilidad a la hora de codificar las operaciones de un repertorio de instrucciones es utilizar algún criterio de óptimo. En este sentido tenemos dos alternativas: a) Frecuencia de aparición en el programa Î optimización de memoria b) Frecuencia de ejecución en el programa Î optimización del tráfico CPU-Memoria La alternativa b) es la más interesante en la actualidad, pues prima la velocidad de ejecución sobre
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
la memoria .necesaria para almacenar el programa. Para optimizar el CO se puede utilizar la codificación de Huffman que veremos con el siguiente Ejemplo: Supongamos las siguientes frecuencias de ejecución de 7 tipos diferentes de instrucciones: Tipo de instrucciones
Frecuencia de ejecución
0.53 ADD 0.25 SUB 0.12 MUL 0.03 DIV 0.03 STA 0.02 LDA 0.02 JMP Con CO de longitud fija se necesitarían 3 bits. Para obtener el código de Huffman procedemos de la siguiente manera: 1) Se escriben en una columna las instrucciones y a su derecha su frecuencia de ejecución. Cada elemento de la columna será un nodos terminal del árbol de decodificación. 2) Se unen las dos frecuencias menores de la columna anterior con sendos arcos, obteniéndose un nuevo nodo cuyo valor será la suma de los nodos de procedencia. 3) Se repite el paso 2) hasta llegar a la raíz del árbol que tendrá valor 1 4) Comenzando en la raíz, asignamos 0 (1) al arco superior y 1 (0) al inferior hasta llegar a los nodos terminales 5) Se obtiene el código de cada instrucción recorriendo el árbol de la raíz a la instrucción y concatenando los valores de los arcos del camino Para nuestro ejemplo tendremos lo siguiente: ADD
0.53
SU B
0.25
MU L
0.12
DIV
0.03
0
0
1 0.47
0 0
0.22 0.06
STA
0.03
1
LDA
0.02
0
J MP
0.02
1
0 0.10
1
1 0.04
1
Tipo de instrucciones
Frecuencia de ejecución
Código de Huffman
ADD SUB MUL DIV STA LDA JMP
0.53 0.25 0.12 0.03 0.03 0.02 0.02
0 10 110 11100 11101 11110 11111
Longitud media del código resultante:
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
l m = ∑ f i × l i = 0.53 × 1 + 0.25 × 2 + 0.12 × 3 + 0.003 × 5 + 0.003 × 5 + 0.02 × 5 + 0.02 × 5 = i
1.89 _ bits < 3 _ bits
2. Propiedades generales del direccionamiento. Resolución Es la menor cantidad de información direccionada por la arquitectura. El mínimo absoluto es un bit, aunque esta alternativa la utilizan pocos procesadores, por ejemplo, el iAPX432 de Intel (1981) Requiere un gran número de bits para expresar las direcciones de una cierta cantidad de información y mucho tiempo para alinearlos correctamente. Lo más frecuente en los procesadores actuales es utilizar resoluciones de 1 o 2 bytes. La resolución puede ser diferente para instrucciones y datos aunque lo normal es que coincida. Resolución Instrucciones Datos
MC68020 16 8
VAX-11 8 8
IBM/370 16 8
B1700 1 1
B6700 48 48
iAPX432 1 8
Orden de los bytes en memoria El concepto de endian lo introdujo Cohen para expresar la forma como se ordenan los bytes de un escalar de varios bytes. • Modo big-endian: almacena el byte más significativo del escalar en la dirección más baja de memoria • Modo little-endian: almacena el byte más significativo del escalar en la dirección más alta de memoria. Ejemplo: el hexadecimal 12 34 56 78 almacenado en la dirección de memoria 184 tendrá la siguiente organización en cada uno de los modos: big-endian 184 12 185 34 186 56 187 78
little-endian 184 78 185 56 186 34 187 12
Alineación Un objeto de datos de n bytes ubicado en la dirección de memoria D se dice que está alineado si D mod n = 0 Objeto de datos direccionado (tamaño) byte media palabra (2 bytes) palabra (4 bytes) doble palabra (8 bytes)
Alineaciones correctas 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 0, 2, 4, 6, 8, 10 0, 4, 8, 12 0, 8, 16
• Determinadas máquinas sólo permiten accesos alineados • La falta de alineación implica complicaciones hardware • Los programas con accesos alineados se ejecutan más rápidamente • Para alinear datos se utiliza una red de alineación. En el caso de la figura para acceder a una palabra no alineada serán necesarios 2 accesos para obtener la parte alta y baja
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
32 bits
32 bits 32 bits 32 bits
a la CPU
Espacios de direcciones En un mismo procesador pueden diferenciarse hasta 3 espacios de direcciones diferentes: • Espacio de direcciones de registros • Espacio de direcciones de memoria • Espacio de direcciones de entrada/salida Los espacios de direcciones de memoria y entrada/salida de algunos procesadores están unificados (un solo espacio), ocupando los puertos de E/S direcciones de ese espacio único. En estos procesadores (ejemplo, 68000) no existen instrucciones específicas de E/S, para esta función se utilizan las de referencia a memoria (carga y almacenamiento) con las direcciones asignadas a los puertos.
3. Modos de direccionamiento. Los modos de direccionamiento determinan la forma como el operando (OPER) presente en las instrucciones especifican la dirección efectiva (DE) del dato operando (DO) sobre el que se realiza la operación indicada por CO. Inmediato. CO
OPER
DO = OPER • El dato operando se ubica en la propia instrucción ==> no requiere accesos a memoria. • Se suele utilizar para datos constantes del programa • El tamaño está limitado por el número de bits de OPER Implícito CO
• El dato operando se supone ubicado en algún lugar específico de la máquina, por ejemplo, una pila Directo (memoria o registros) OPER = Dirección de memoria o de un registro DE = OPER DO = <OPER> Memoria o Registros CO OPER
DO
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• La especificación de un registro requiere menor número de bits que la de una posición de memoria • El acceso a los registros es más rápido que a Memoria • El direccionamiento directo a memoria se conoce como absoluto • A veces se limita el número de bits de OPER limitando el acceso a sólo una parte de la memoria que suele ser la correspondiente a las direcciones más bajas (página cero) Indirecto (memoria) OPER = Dirección de memoria DE = <OPER> DO = <<OPER>> Memoria CO
OPER DE
DO
• Permite el tratamiento de una dirección de memoria como un dato • Permite el paso por referencia de parámetros a subrutinas • Permite referenciar un espacio mayor de direcciones CO
2n-p direcciones
dirección
p bits
n-p bits
CO
dirección
p bits
2n-p direcciones
n-p bits 2n direcciones
dirección n-bits
Indirecto (registro) OPER = Dirección de un registro DE = <OPER> DO = <<OPER>> Registros CO
Memoria
OPER DE
DO
Modos con desplazamiento. Calculan la dirección efectiva (DE) sumando al contenido de un registro el operando declarado
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
en la instrucción (OPER) que se interpreta como un desplazamiento respecto al contenido del registro. La distinta naturaleza del registro hace que se diferencien tres modos con desplazamiento. Todos explotan la proximidad de los datos o instrucciones referenciadas para utilizar menor número de bits en el campo OPER. Direccionamiento base más desplazamiento DE = <Registro base> + OPER; OPER = desplazamiento • Se utiliza para la reubicación de datos y programas en memoria Memoria CO
OPER
+
DO
Registro Base
Ejemplo: A = B + C Programa LOAD RB,1; RD1 LOAD RB, 2; RD2 ADD RD1; RD2 STORE RD1; RB,0
(RD1 <-- <RB>+1) (RD2 <-- <RB>+2) (RD1 <-- <RD1> + <RD2>) (A<RB>+0 <-- <RD1>)
<RB> + 1 = B <RB> + 2 = C <RB> + 0 = A
Memoria RB
A
Registros de datos
B
RD1
C
RD2
Este programa podremos reubicarlo en memoria y siempre llevará a la dirección apuntada por el registro base RB la suma de los contenidos de las dos direcciones siguientes.
Direccionamiento relativo DE = <Contador de programa> + OPER; OPER = desplazamiento • Se utiliza en las instrucciones de salto para conseguir la reubicación de estas instrucciones • El desplazamiento en estas instrucciones tiene signo (c2) lo que significa que el salto relativo se puede dar hacia posiciones anteriores o siguientes a la ocupada por la instrucción. Memoria CO
OPER
+
DO
Contador de Programa
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Direccionamiento indexado DE = <Registro índice> + OPER; OPER = desplazamiento • Se utiliza para recorrer estructuras lineales como los arrays • Par facilitar su uso se suele complementar con el pre o post incremento o decremento del registro índice Memoria CO
OPER
+
DO
Registro Indice
Resumen de los tipos de direccionamiento Direccionamiento
instrucción
Indirecto (registro)
registro
Indirecto (memoria)
dirección
Indexado
registro
registro
memoria
dirección
operando
dirección
desplazamiento
+
operando
dirección
base
registro
dirección
+
operando
desplazamiento Relativo
registro dirección
+
operando
dirección
Modos compuestos Veremos los modos compuestos analizando el repertorio de algunos procesadores. Modos de direccionamiento del MC 68.X CO
OPER
• Inmediato DO = OPER
- enteros: 8, 16 y 32 bits - reales: 32 bits (simple precisión), 64 bits (doble precisión) y 96 bits (precisión extendida) • Directo - Memoria o absoluto DE = OPER, DO = <DE>, con OPER de 16 y 32 bits
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
- Registro Ri = OPER, DO = <Ri>, con Ri cualquier registro
• Indirecto registro - puro DE = <Ri>, con Ri cualquier registro Memoria CO
OPER
Ri DO DE
- Indirecto registro con postincremento DE = <Ri>; Ri Å <Ri> + Inc, CO
con Inc = 1, 2 ó 4 bytes Memoria
OPER
Ri
+ Inc
DO DE
- Indirecto registro con predecremento Ri Å <Ri> - Dec, DE = <Ri>, CO
con Dec = 1, 2 ó 4 bytes Memoria
OPER
Ri
- Dec
DO DE
- Indirecto con desplazamiento (= base + desplazamiento) DE = <Ri> + Despla Memoria CO
Despla
+
DO DE
Ri
11
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
- Indirecto registro indexado (= base + desplazamiento indexado) DE = <Ri> + <Rj>xEscala + Despla, con Escala = 1, 2, 4, 8 bytes
Memoria
Escala
CO
Despla
x
+
DO DE
Rj
Ri
โ ข Indirecto memoria - Postindexado (= base + desplazamiento indirecto indexado + desplazamiento) DE = <<Ri> + despla1> + <Rj>xEscala + Despla2
CO
Despla1
Despla2 Memoria
+
DIR
DE
Ri
DO Rj
x
+ Escala
- Preindexado (base + desplazamiento indexado indirecto + desplazamiento) DE = <<Ri> + Despla1 + <Rj>xEscala> + Despla2
12
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
CO
Despla1
Despla2
+ Memoria Ri
DIR
+
+ DE
Rj
DO
x
Escala
โ ข Relativo - Bรกsico DE = <CP> + Despla Memoria CO
Despla
+
DO DE
CP
- Indexado con desplazamiento DE = <CP> + <Rj>xEscala + Despla Escala
x
Memoria CO
Despla
+
DO DE
Rj
CP
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
- Indirecto memoria postindexado DE = <<CP> + Despla1> + <Rj>xEscala + Despla2 CO
Despla1
Despla2 Memoria
+
DIR
DE
CP
DO Rj
x
+ Escala
- Indirecto memoria preindexado DE = <<CP> + Despla1 + <Rj>xEscala> + despla2 CO
Despla1
Despla2
+ Memoria CP
+
Rj
DIR
+ DE
DO
x
Escala
Modos de direccionamiento del MIPS R-2000 • Inmediato • Registro LA = R • Relativo DE = <PC> + Despla
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• Indirecto registro con desplazamiento (= base + desplazamiento) DE = <Ri> + Despla
Modos de direccionamiento del Pentium II
CO
A
Registros de uso general Registro base Registro índice B
0, 8 ó 32 bits
I
A
Escala (1,2,4,8)
X
Memoria
+ Registro de segmento SR
DE LA +
segmento
(6 registros SR) Paginación
• Inmediato DO = A (1,2,4 bytes) • Registro LA = R, DO = <R> (LA = dirección lineal) • Desplazamiento LA = <SR> + A • Base LA = <SR> + <B> • Base + desplazamiento LA = <SR> + <B> + A • Indexado LA = <SR> + <I>xEscala + A • Base + desplazamiento indexado LA = <SR> + <B> + <I> + A • Base + desplazamiento indexado escalado LA = <SR> + <B> + <I>xEscala + A • Relativo LA = <PC> + A
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
4. Soporte de los modos de direccionamiento a los lenguajes de alto nivel Visibilidad en C Un programa escrito en C no es más que una colección de subprogramas (funciones) en idéntico nivel, dentro del programa principal (Main). Estas funciones pueden llamarse entre sí, incluso de forma recursiva. Las variables locales definidas en una función son visibles sólo dentro de la función. En cambio las variables globales se definen fuera de la funciones (en la función Main) y pueden ser referenciadas desde cualquiera de ellas. Las variables locales de una función se asignan dinámicamente Estudiaremos ahora los modos de direccionamiento más adecuados para satisfacer los requerimientos de los lenguajes de alto nivel. Estos modos reducirán al mínimo el número de instrucciones requeridas para acceder a los elementos de las diferentes estructuras de datos (array, record, etc.) que soportan estos lenguajes, es decir, para calcular sus direcciones efectivas. Estos lenguajes presentan una estructura de bloques e incorporan el concepto de visibilidad de las variables del programa, es decir, las reglas de acceso a las variables de cada uno de los bloques. , es decir, cada vez que se activa la función. La asignación tiene lugar dentro de un registro de activación (RA) que se ubica en la pila asociada al programa. Dada la naturaleza recursiva de las llamadas, pueden existir en la pila más de un RA para la misma función (tantos como llamadas). Supongamos el siguiente perfil de progrma C: Main( ) { . . . ... = ... fe(...) ... . . . } fa (...) { . . .
fb (...) { . . . ... = ... fb(...) ... . . . ... = ... fc(...) ... . . . }
fc (...) { . . . ... = ... fc(...) ... . . . ... = ... fb(...) .. . . . }
} La estructura de este programa sería la siguiente:
fd (...) { . . . } fe (...) { . . . ... = ... fc(...) ... . . . }
main
fa
fb
fc
fd
fe
Supongamos que tiene lugar la siguiente secuencia de llamadas: main Æ fe Æ fc Æ fc Æ fb Æ fb Æ fc En la pila del programa se ubican los registros de activación correspondientes a cada una de estas llamadas, tal como se muestra en la siguiente figura, donde se ha sombreado las variables que pueden ser accedidas desde la tercera activación de la función fc: las globales y las locales a esta tercera llamada. Para realizar el acceso se dispone de sendos registros que apuntan a cada uno de estos RA, el Puntero al Registro de Activación Global (PRAG) y el Puntero al Registro de Activación Local (PRAL)
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
RA main
RA fe
PRAG Puntero al Registro de Activación Global
RA fc (1ª llamada) RA fc (2ª llamada)
Registros de Activación visibles desde la última llamada a fc
RA fb (1ª llamada) RA fb (2ª llamada) RA fc (3ª llamada)
PRAL Crecimiento de la PILA
Puntero al Registro de Activación Local
Visibilidad en Pascal En los lenguajes de tipo Pascal un bloque puede ser un procedure o una function, y el concepto de visibilidad adquiere una estructura anidada. Los bloques de un programa de este tipo presentan una estructura jerárquica y la visibilidad de variables desde la llamada a un bloque se extiende a todos los bloques (últimas llamadas) en el camino hasta la raíz (main) main
Ba
Bc
Bb
Bd
Be
Bf
Bh
Bi
Bg
program main(..) procedure a begin procedure c begin ... end procedure d begin ... end end procedure b begin procedure e begin ... function h (..) end procedure f begin ... function i (..) end procedure g begin ... end end end
Secuencia de llamada: main Æ Ba Æ Bb Æ Bb Æ Bf Æ Be Æ Bh Æ Bh
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
RA main
RA Ba
PRAG
RA Bb (1ª llamada) RA Bb (2ª llamada)
Registros de Activación visibles desde la última llamada al bloque Bh
RA Bf RA Be
Display del RA Bh
RA Bh (1ª llamada)
RA Bh (2ª llamada)
PRAL
El display de un RA contiene un puntero a cada RAi visible desde RA
Acceso a variables escalares locales o globales (contenido)
RA main
Despla PRA G
Variable g lobal
RA (procedimiento en ejecución)
Despla PRA L
Variable local
Variables locales:
DE = <PRAL> + despla Î direccionamiento base + desplazamiento
Variables globales:
DE = <PRAG> + despla Î direccionamiento base + desplazamiento
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Acceso a variables escalares no locales (contenido) main
Ba
Bb
Bl
Bc
Bd
Secuencia de llamada: main Æ Ba Æ Ba Æ Bb Æ Bc Æ Bd
RA main
RA Ba
PRAG
(1ª llamada)
RA Ba
Despla 2
(2ª llamada)
RA Bb RA Bc
Ubicación del dato accedido
Despla 1 RA Bd
display
PRAL
DE = <<PRAL> + Despla1> + Despla 2 Î direccionamiento base + desplazamiento indirecto + desplazamiento
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Acceso a variables escalares locales (dirección)
Var. referenciada
RA proc. Ejec.
Despla Puntero local
PRAL
DE = <<PRAL> + Despla> Î direccionamiento base + desplazamiento indirecto
Acceso a variables escalares no locales (dirección) Var. referenciada
RA proc. refer.
Despla 2
Referencia a var.
Inicio RA referenc.
Despla 1 display
RA proc. Ejec.
PRAL
DE = <<<PRAL> + Despla1> + Despla 2> Î direccionamiento base + desplazamiento indirecto + desplazamiento indirecto
20
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Acceso a variables de tipo array locales (contenido)
RA proc. Ejec. 1º elemento
Factor_escala (=1,2,4,8) Despla Indexación
array
X
RX
n-simo elemento
PRAL
DE = <PRAL> + Despla + <RX>factor_escala Î direccionamiento base + desplazamiento indexado
Acceso a variables de tipo array no locales (contenido) RA proc. referen. 1º elemento
Factor_escala (=1,2,4,8) Despla 2 Indexación
array
X
RX
n-simo elemento
Despla 1
Inicio RA referenc.
display
RA proc. Ejec.
PRAL
DE = <<PRAL> + Despla 1> + Despla 2 + <RX>factor_escala Î direccionamiento base + desplazamiento indirecto + desplazamiento indexado
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Acceso a variables de tipo array locales (dirección) Factor_escala (=1,2,4,8)
1º elemento
Indexación
array
X
RX
n-simo elemento
RA proc. Ejec.
Despla Puntero local
PRAL
DE = <<PRAL> + Despla > + <RX>factor_escala Î direccionamiento base + desplazamiento indirecto indexado
Acceso a variables de tipo record locales (contenido) RA proc. ejec. 1º campo
Despla 1 Despla 2
record n-simo campo
PRAL
DE = <PRAL> + Despla 1 + Despla 2 Î direccionamiento base + desplazamiento Despla 1 = dirección e inicio del record (conocido en tiempo de compilación) Despla 2 = posición en record del campo accedido (conocido en tiempo de compilación)
22
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
Acceso a variables de tipo record anidados locales (contenido)
RA proc. ejec. 1ยบ campo de RR(x) 1ยบ campo de R (y)
record RR
Despla 1 Despla 2 Despla 3
2ยบ campo de R (z)
PRAL
RR: record x: real R: record y: boolean z: integer . . . end R . . . end RR
acceso al campo z de R
DE = <PRAL> + Despla 1 + Despla 2 + Despla 23ร direccionamiento base + desplazamiento Despla 1 = direcciรณn e inicio RR Despla 2 = posiciรณn en RR del campo R Despla 3 = posiciรณn en R del campo accedido z
(conocido en tiempo de compilaciรณn) (conocido en tiempo de compilaciรณn) (conocido en tiempo de compilaciรณn)
Acceso a variables de tipo record locales (direcciรณn)
Despla 2 campo accedido
record
RA proc. ejec.
Despla 1
puntero local
PRAL
DE = <<PRAL> + Despla 1> + Despla 2 ร direccionamiento base + desplazamiento indirecto + desplazamiento
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Apéndice (motivación del direccionamiento indirecto) Consideremos un computador con una memoria de 4K palabras de 12 bits, un registro acumulador y dos bits de condición (Z y N)
000
11 0
11 0
M E M OR IA
ACUMULADOR (AC)
R egistro d e estad o 1 0
NZ FFF
Todas las instrucciones tienen longitud fija de 12 bits y están compuestas por un código de operación (CO) situado en los 4 bits más significativos (del 8 al 11) y una dirección/operando situada en los 8 bits menos significativos (del 0 al 7). Los 8 bits de la dirección/operando tienen el significado de dirección en las instrucciones de salto y referencia a memoria, y significado de dato en las instrucciones de operando inmediato. 11
8 7
CO
0
DIR ECCION /OPE RAN DO
La máquina dispone de once instrucciones, tres de carga y almacenamiento (LDA, STA, LDAI), tres aritmetico-lógicas (SUM, SUMI, NOR), cuatro de salto condicional (JZ, JNZ, JN, JNN) y una instrucción de parada (HALT). En la siguiente tabla se muestran el código simbólico, el tipo de direccionamiento, el código binario (CO) y la semántica de cada una de las instrucciones. El símbolo <-- significa transferencia de la información a su derecha hacia el elemento a su izquierda; MEMORIA(DIRECCION) expresa el contenido de la posición de MEMORIA apuntada por DIRECCION; los paréntesis angulares expresan contenido y el símbolo & concatenación. Nombre Simbólico LDA STA SUM LDAI SUMI NOR JZ JNZ JN JNN HALT
DIR/OPE DIR DIR DIR OPE OPE DIR DIR DIR DIR DIR -
COP 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 0000
Semántica AC <-- MEMORIA(DIR) MEMORIA(DIR) <-- <AC> AC <-- <AC> + MEMORIA(DIR) AC <-- 0000&OPERANDO AC <-- <AC> + 0000&OPERANDO AC <-- <AC> NOR MEMORIA(DIR) PC <-- DIR SI <Z> = 1 PC <-- DIRE SI <Z> = 0 PC <-- DIR SI <N> = 1 PC <-- DIR SI <N> = 0 parada de la máquina
24
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Programa Inicializa 10 posiciones de memoria (de la 20 a la 29) con un contenido igual a su dirección. Dirección Simbólico Binario comentario 0 LDA 4 0001 00000100 AC <-- (STA -----) 1 SUMI 1 0101 00000001 AC <-- (STA -----) + 1 2 STA 4 0010 00000100 MEMORIA(4) <-- (STA ------ + 1) 3 LDA 14 0001 00001110 AC <-- índice 4 STA ---0010 00010011 MEMORIA(índice) <-- índice 5 SUMI 1 0101 00000001 AC <-- índice + 1 6 STA índice 0010 00001110 índice <-- índice + 1 7 LDA 30 0001 00001101 AC <-- límite 8 NOR 30 0110 00001101 AC <-- complemento1(límite) 9 SUMI 1 0101 00000001 AC <-- complemento2(límite) 10 SUM índice 0011 00001110 AC <-- índice - límite 11 JNZ 0 1000 00000000 Vuelve a dirección 0 si resultado ≠ 0 12 HALT 0000 00000000 Parada 13 30 000000011110 límite 14 20 000000010100 índice Para referenciar posiciones de memoria consecutivas (indexación) hemos utilizado un artificio poco recomendable en programación: modificar instrucciones en tiempo de ejecución, concretamente, sumando un 1 a la instrucción STA índice (inicialmente en binario 001000010011) de la posición 4. De esa forma, cada vez que se recorra el cuerpo del ciclo que constituye el programa, la instrucción STA índice referenciará la posición de memoria siguiente a la que referenció en el recorrido anterior. El ciclo finalizará cuando el índice iguale el límite. Para detectarlo se realiza la resta índice -limite (complementando a dos límite, es decir, complementando a 1 y sumando 1, y sumando el resultado a índice) y se bifurca sobre Z. Esto lo podemos solucionar introduciendo el direccionamiento indirecto (ind) para la instrucción de almacenamiento STA (ind) y modificando las instrucciones 0,1,2 y 4 del programa de la forma siguiente: 0 1 2
LDA 14 SUMI 1 STA 14
4
STA (ind) 14
25
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 3: Formato de los datos y clases de instrucciones 1. Tipos de datos y formatos de representación. 2. Instrucciones que operan sobre datos. 3. Instrucciones de control del flujo de ejecución. 4. Soporte de las instrucciones de control a las construcciones de alto nivel
1. Tipos de datos y formatos de representación. Números naturales Representación binaria
N ≡ ( x n−1 , x n− 2 ,..., x1 , x 0 ) n−1
V(N) = ∑ 2 . xi i
i= 0
• • •
rango de representación = [0, 2n - 1] resolución = 1 dificultades: el resultado de la suma puede necesitar n+1 bit no es posible en general la resta: habría que comprobar que el minuendo es mayor que el sustraendo para el producto se necesitan 2n bits Representación BCD(Decimal Codificado en Binario)
Codifica en binario puro con 4 bits cada uno de los dígitos decimales Ejemplo 2 5 5 ---> BCD = 0010 0101 0101 en cambio en binario sería: 2 5 5 ---> binario = 1111 1111 Existen 2 formatos de representación:
BCD desempaquetado
1111 0010 zona
1111 0101
dígito
0010
zona
dígito
1111 0101 zona
dígito
BCD empaquetado 0101
0101
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Números enteros Signo y magnitud
N ≡ ( x n−1 , x n− 2 ,..., x1 , x 0 ) n−2
V ( N ) = ∑ 2 i xi
si Xn-1 = 0
i =0
n−2
V ( N ) = − ∑ 2 i xi
si Xn-1 = 1
i =0
como
1 - 2•Xn-1 = 1 si Xn-1 = 0 1 - 2•Xn-1 = -1 si Xn-1 = 1 n−2
V ( N ) = (1 − 2 xn−1 ) ∑ 2i xi i =0
• • •
rango de representación = [-(2n-1 - 1), 2n-1 - 1] resolución = 1 dificultades doble representación del cero no es posible en general la resta: habría que comprobar que el minuendo es mayor que el sustraendo Complemento a dos
• •
Los números positivos se representan igual que en signo y magnitud Los números negativos se representan como 2n - magnitud del número Ejemplo: (para n= 8 bits) X = - 50 se representa por 1 0000 0000 = 28 - 0011 0010 = 50 (magnitud de -50) 0 1100 1110 = - 50 en c2
•
El valor del número X se puede expresar en general como: n− 2
V ( N ) = − xn−1 • 2 n−1 + ∑ 2i xi i =0
Se puede obtener el valor decimal de un número en c2 sumando los pesos de las posiciones con 1:
-128
64
32
16
8
4
1 -128
0
0
0
1 +8
0
2 0
1 0 = -120
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
0 bien pesando sólo las posiciones con cero (cuando el número es negativo) y sumando 1: 64 + 32 + 16
+
4
+
2
+ 1 + 1 = 120
Podemos calcular el c2 de un número binario complementando bit a bit (c1) y sumado 1: 0 1 0 0 0 0 0 1 = 65 c1 = 1 0 1 1 1 1 1 0 + 1 1 0 1 1 1 1 1 1 = -65 • • •
rango de representación = [-2n-1 , 2n-1 - 1] resolución = 1 ventaja: la resta se convierte en suma del c2 del sustraendo
Complemento a uno • • •
Los números positivos se representan igual que en signo y magnitud Los números negativos se representan como 2n - magnitud del número - 1 El valor del número X se puede expresar en general como: n −2
V ( N ) = − xn−1 • (2 n−1 + 1) + ∑ 2i xi i =0
• • •
rango de representación = [- 2n-1 - 1, 2n-1 - 1] resolución = 1 dificultades doble representación del cero la resta es más compleja que en c2
•
Para hallar el c1 de un número binario se complementa bit a bit el número.
Tabla de representación de los tres sistemas para n = 4 bits Número decimal Signo y magnitud Complemento a 1 Complemento a 2 0111 0111 0111 +7 0110 0110 0110 +6 0101 0101 0101 +5 0100 0100 0100 +4 0011 0011 0011 +3 0010 0010 0010 +2 0001 0001 0001 +1 0000 0000 0000 0 -0 1000 1111 No existe 1111 1110 1001 -1 1110 1101 1010 -2 1101 1100 1011 -3 1100 1011 1100 -4 1011 1010 1101 -5 1010 1001 1110 -6 1001 1000 1111 -7 -8 no existe No existe 1000
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Números reales Utilizando una notación exponencial, un número real R queda determinado por dos valores, un exponente (e) y una mantisa (m) tal que el valor de R venga dado por la expresión: e
V(R) = B • m Donde B es una base conocida. Por ejemplo, utilizando base 10 tenemos: 976.000.000.000.000 0,0000000000000976
= =
9,76 •10 14 9,76 •10 -14
Los números quedarían definidos por: 976.000.000.000.000 0,0000000000000976
Æ Æ
mantisa m = 9,76; mantisa m = 9,76;
exponente exponente
e = 14 e = -14.
La representación en coma flotante utiliza esta definición y establece un formato para la mantisa y para el exponente. Exponente Utiliza una representación sesgada o codificación en exceso con un sesgo = 2k-1-1; siendo k el número de bits reservados para el campo del exponente. Es decir, en lugar de representar directamente e, utilizamos su codificación E exceso 127, siendo E = e + 127. Para k = 8 bits se codifica el exponente (con signo) con valores que van de –127 a +128 utilizando el código exceso 28-1-1 = 127. Los correspondientes valores codificados van en decimal de 0 (todos los bits a 0) a 255 (todos los bits a 1). La tabla siguiente muestra el rango de valores del exponente y su codificación en exceso 127:
E (binario) 0000 0000 0000 0001 0000 0010 . . . 0111 1110 0111 1111 1000 0000 . . . 1111 1111
E (decimal) 0 1 2 . . . 126 127 128 . . . 255
e = E-127 -127 -126 -125 . . . -1 +0 +1 . . . +128
Una propiedad importante de la codificación sesgada es que se mantiene el orden natural de los vectores binarios en relación con su magnitud: el más grande es el 1111 1111 y el más pequeño 0000 0000, cosa que no ocurre en la representación en signo y magnitud, c1 o c2. Esta propiedad es importante a la hora de comparar números en coma flotante.
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mantisa La mantisa m se representa en coma fija normalizada (signo y magnitud), es decir, haciendo que el primer dígito decimal valga 1, y ajustando convenientemente el exponente: mantisa m Æ mantisa normalizada M = ± 0,1bbb...b con b ∈ { 0, 1 } Como el primer bit de la mantisa es siempre 1 no necesita almacenarse en el campo M, por lo que se pueden representar mantisas con 24 bits con valores en decimal que van de: 0,5 correspondiente a la mantisa 0,100000000000000000000000 a 1 ( en realidad 1- 2 -24 ) correspondiente a la mantisa 0,111111111111111111111111
Base Se suele utilizar la base 2. (la arquitectura IBM S/390 utiliza base 16) Teniendo en cuenta lo anterior, un número real R vendría representado por:
V(R) = (-1)s • 2 E - 127 • M con el siguiente formato para una longitud de palabra de 32 bits (1 para el signo de la mantisa, 8 para el exponente, 23 para la magnitud de la mantisa): 31
30
23 22
s
E
signo
Exponente
0
M Mantisa
Por ejemplo: 0111 1111 = 127 + 1 0100 1001 0011
0,11010001 x 2 10100 -0,11010001 x 2 10100 0,11010001 x 2-10100 -0,11010001 x 2-10100
= = = =
0 1 0 1
10010011 10010011 01101011 01101011
10100010000000000000000 10100010000000000000000 10100010000000000000000 10100010000000000000000
corresponden a las expresiones decimales: 0,8164062 x 2 20 - 0,8164062 x 2 20 0,8164062 x 2 -20 - 0,8164062 x 2 -20
= = = =
856063,95 - 856063,95 0,000000778585 - 0,000000778585
Los rangos de números que pueden representarse en coma flotante con 32 bits y el formato descrito aparecen en la siguiente gráfica:
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
desbordamiento a cero negativo desbordamiento negativo
desbordamiento a cero positivo
números negativos representables
números positivos representables
desbordamiento positivo
recta real -24
- (1 - 2 ) x 2
128
- 0,5 x 2
-127
0
0,5 x 2
-127
-24
(1 - 2 ) x 2
128
En esta gráfica se aprecia la existencia de 5 regiones excluidas de dichos rangos: • • • •
región de desbordamiento negativo región de desbordamiento a cero negativo región de desbordamiento a cero positivo región de desbordamiento positivo
Problemas de la representación en coma flotante: • •
La anterior representación no contempla un valor para el cero. Sin embargo, en la practica se destina una configuración de bits especial, como veremos en el estándar del IEEE. Aparecen dos tipos de desbordamientos, el desbordamiento propiamente dicho que ocurre cuando una 215 operación aritmética da lugar a un número cuyo exponente es mayor que 128 (ejemplo 2 ), y el desbordamiento a cero que ocurre cuando una magnitud fraccionaria es demasiado pequeña (ejemplo 2-215)
•
Los números representados no están espaciados regularmente a lo largo de la recta real. Están más próximos cerca del origen y más separados a medida que nos alejamos de él.
•
Tenemos que elegir el compromiso entre rango de representación y precisión de la misma repartiendo convenientemente los bits entre mantisa y exponente. Si aumentamos los bits del exponente aumentamos el rango pero disminuimos la densidad de números representados en dicho rango, ya que la cantidad total de valores representables lo determina el número total de bits (32).
Hay que notar que con la representación en coma flotante no se representan más valores individuales. Con 32 32 bits sólo podemos representar 2 valores diferentes. La coma flotante distribuye estos valores entre dos intervalos, uno positivo y otro negativo. Estándar IEEE 754 Desarrollado para facilitar la portabilidad entre diferentes procesadores de programas numéricos La base implícita es 2 y utiliza dos formatos, uno simple de 32 bits y otro doble de 64 bits, además define dos formas ampliadas de estos formatos (dependientes de la implementación).
formato simple 31
30
23 22
s
E
signo
Exponente
0
f Mantisa
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
formato doble 63
62
52 51
s signo
0
E
f
Exponente
Mantisa
En el formato simple, los valores de exponente de 1 a 254 representan números en coma flotante normalizados distintos de cero, con exponente sesgado en un rango de -127 a +127 y mantisa con un 1 implícito a la izquierda del punto decimal, lo que significan 24 bits efectivos. Ejemplo: RIEEE = 1 10000001 01000000000000000000000 ↓ ↓ ↓ - e = 129 - 127 = 2 f = 0.01(2 = 0.25(10 => 1.f = 1.25(10 => R(10 = -1.25 • 2 2 = - 5 En este estándar no todos los patrones de bits se interpretan como valores numéricos, algunas se utilizan para representar valores especiales: 1)
Un exponente cero con una fracción cero representa al +0 ó -0, dependiendo del bit de signo.
2) Un exponente todo unos con una parte fraccionaria cero representa al +∞ o al -∞, dependiendo del bit de signo. 3)
Un exponente de todo unos con una fracción distinta de cero se conoce como NaN (Not a Number) y se emplea para indicar varias condiciones de excepción.
4) Un exponente cero con una parte fraccionaria distinta de cero representa un número denormalizado. En este caso el bit a la izquierda de la coma es cero y el exponente original -126. En la siguiente tabla resumimos la interpretación de los números en coma flotante y simple precisión:
signo 0 1 0 1 0 1 0 ó1 0 ó1 0 1
positivo normalizado ≠0 negativo normalizado ≠0 cero positivo cero negativo más infinito menos infinito NaN silencioso NaN indicador positivo denormalizado negativo denormalizado
precisión simple (32 bits) exponente 0<E<255 0<E<255 0 0 255(todos 1s) 255(todos 1s 255(todos 1s 255(todos 1s 0 0
fracción f f 0 0 0 0 ≠0 ≠0 f≠0 f≠0
valor 2 E - 127(1,f) -2 E - 127(1,f) 0 -0 ∞ -∞ NaN NaN 2 E - 126(0,f) -2 E - 126(0,f)
Infinito n n n n n
+ + x
(+ (+ (((+
∞) ∞) ∞) ∞) ∞)
= = = = =
+ + +
∞ ∞ ∞ ∞ ∞
n (+ (((+
÷ (+∞) ∞)+ (+ ∞)+ (∞)- (+ ∞)- (-
= +0 ∞) = ∞) = ∞) = ∞) =
+ +
∞ ∞ ∞ ∞
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
NaN indicadores y silenciosos Un NaN es un valor simbólico codificado en formato de coma flotante. Existen dos tipos: indicadores y silenciosos. Un NaN indicador señala una condición de operación no válida siempre que aparece como operando. Permiten representar valores de variables no inicializadas y tratamientos aritméticos no contemplados en el estándar. Los NaN silenciosos se propagan en la mayoría de las operaciones sin producir excepciones. La siguiente tabla indica operaciones que producen un NaN silencioso: Operación
Suma o resta
Multiplicación División Resto Raíz cuadrada
(+ ((+ (-
∞)+ ∞)+ ∞)∞)-
((+ (+ (-
∞) ∞) ∞) ∞)
0 x ∞ 0/0 ∞/∞ x RE 0 ∞ RE y x con x < 0
Números denormalizados Se incluyen para reducir las situaciones de desbordamiento hacia cero de exponentes. Cuando el exponente del resultado es demasiado pequeño se denormaliza desplazando a la derecha la parte fraccionaria e incrementando el exponente hasta que el exponente esté dentro de un rango representable. Caracteres ASCII (American Standard Code for Information Interchange) Utiliza un patrón de 7 bits con el que se pueden representar hasta 128 caracteres diferentes, suficientes para codificar los caracteres del alfabeto incluyendo signos especiales y algunas acciones de control. El patrón 011XXXX representa los dígitos decimales del 0 al 9 con los correspondientes valores binarios para XXXX.. Así, 011 0000 representa al 0; 011 0001 representa al 1; etc. EBCDIC(Extended Binary-Coded-Decimal Interchange Code) Se trata de un código de 8 bits utilizado por IBM. En este caso los dígitos decimales del 0 al 9 vienen codificados por los patrones del 1111 0000 al 1111 1001. Como se puede observar en ambos casos la representación es compatible con la BCD empaquetada de 4 bits. Además, el valor binario (sin signo) de ambos códigos mantiene el orden de los símbolos correspondientes a los dígitos decimales y caracteres, lo que facilita la ordenación de información simbólica en los programas. Compresión de datos La representación de datos comprimidos ha ido adquiriendo cada vez más importancia debido a la utilización de mayores cantidades de información, sobre todo en las aplicaciones multimedia. Comprimiendo datos se optimiza tanto la memoria utilizada para su almacenamiento como el tiempo de transmisión por las redes. Uno de los métodos de compresión más conocido es el llamado de Lempel-Ziv (LZ), que aprovecha de forma bastante simple las repeticiones de ciertos patrones de bits que aparecen en una cadena. Se aplica a cualquier tipo de información representada por una cadena de bits y se realiza en los siguientes pasos:
1) Se descompone la cadena de modo que no se repita el mismo patrón de bits. Para ello:
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
a) se coloca un separador después del primer dígito b) el siguiente separador se coloca de modo que el fragmento entre separadores sea el más corto posible que no haya aparecido previamente. El proceso continúa hasta fragmentar toda la cadena. Ejemplo: la cadena de bits 101100101001101001000 se fragmentaría de la forma siguiente: 1-0-11-00-10-100-110-1001-000 2) Se enumeran los fragmentos. 1 2 3 4 5 6 7 8 9 1-0-11-00-10-100-110-1001-000 Cada fragmento es siempre la concatenación de un fragmento prefijo aparecido con anterioridad, y de un bit adicional, 0 ó 1. Por ejemplo, el fragmento número 3, 11, es el número 1 seguido de un 1; el número 6, 100, es el 5 seguido de un 0; y así sucesivamente. 3) Se sustituye cada fragmento por el par (número de prefijo, bit adicional). El 0 indicará el prefijo vacío. En nuestro ejemplo: (0,1)-(0,0)-(1,1)-(2,0)-(1,0)-(5,0)-(3,0)-(6,1)-(4,0) 4) Se codifican en binario los números de los prefijos. En nuestro ejemplo, como aparecen siete prefijos, se necesitan tres bits para codificarlos: (000,1)-(000,0)-(001,1)-(010,0)-(001,0)-(101,0)-(011,0)-(110,1)-(100,0) 5) Se quitan los paréntesis y los separadores y obtenemos la cadena de bits comprimida: 000100000011010000101010011011011000 La descompresión se realiza siguiendo el proceso inverso y conociendo el número de bits de la codificación del prefijo, tres en nuestro ejemplo. Sabemos entonces que cada fragmento está codificado por cuatro bits, tres para el prefijo y uno para el bit adicional: 000100000011010000101010011011011000 1) 0001-0000-0011-0100-0010-1010-0110-1101-1000 2) (000,1)-(000,0)-(001,1)-(010,0)-(001,0)-(101,0)-(011,0)-(110,1)-(100,0) 3) (0,1)-(0,0)-(1,1)-(2,0)-(1,0)-(5,0)-(3,0)-(6,1)-(4,0) 1 2 3 4 ....... 4) 1-0-11-00 ....... En el ejemplo anterior la cadena resultante es más larga que la original, en contra del propósito del método. La causa es la poca eficiencia del método para cadenas muy cortas. Cuando se aplica a una cadena muy larga, los fragmentos crecen en longitud más rápidamente que las subcadenas de bits necesarias para su codificación. Por ejemplo, supongamos que una cadena de 100.000 bits se ha dividido en 1.000 fragmentos con un tamaño medio de 100 bits (los primeros serán probablemente más cortos y los últimos más largos). Para codificar el prefijo solo se necesitan 10 bits (210 = 1024). Por tanto cada fragmento estará codificado por 11 bits (los 10 del prefijo más el bit adicional), mientras que su longitud original era de 100 bits. Es decir, el método lograría comprimir el fichero de datos a un 10% de su tamaño original.
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
100.000 bit s 100 bit s
1.000 fr a gm en t os 1.000 fragmentos => 20 bits para su codificación +1 bit adicional 21 bits/fragmento x 1.000 fragmentos = 21.000 bits luego 100.000 bits se comprimen a 21.000 bits => al 20% de su tamaño
Está claro que cuanto más largos sean los fragmentos, más eficaz será el método. Esto ocurre si la cadena tiene muchas repeticiones. El caso extremo es una cadena con todo ceros. En este caso la fragmentación es muy simple: 0-00-000-0000-00000-000000-0000000-... Ejemplo1: cadena de 28 ceros, se comprime en una de igual tamaño 0000000000000000000000000000 1 2 3 4 5 6 7 0-00-000-0000-00000-000000-0000000 (0,0)-(1,0)-(2,0)-(3,0)-(4,0)-(5,0)-(6,0) 000,0-001,0-010,0-011,0-100,0-101,0-110,0 0000001001000110100010101100 Ejemplo2: cadena de 36 ceros, se comprime en una de 32 bits 000000000000000000000000000000000000 1 2 3 4 5 6 7 8 0-00-000-0000-00000-000000-0000000-00000000 (0,0)-(1,0)-(2,0)-(3,0)-(4,0)-(5,0)-(6,0)-(7,0) 000,0-001,0-010,0-011,0-100,0-101,0-110,0-111,0 00000010010001101000101011001110 Ejemplo3: cadena de 55 ceros, se comprime en una de 50 0000000000000000000000000000000000000000000000000000000 1 2 3 4 5 6 7 8 9 10 0-00-000-0000-00000-000000-0000000-00000000-000000000-0000000000 (0,0)-(1,0)-(2,0)-(3,0)-(4,0)-(5,0)-(6,0)-(7,0)-(8,0)-(9,0) 0000,0-0001,0-0010,0-0011,0-0100,0-0101,0-0110,0-0111,0-1000,0-1001,0 00000000100010000110010000101001100011101000010010 Una cadena con n ceros se dividiría en un número de fragmentos m -1 tal que: n = 1+2+3+...+(m-1) = m(m+1)/2
(progresión aritmética)
lo que implica que aproximadamente m ≈ 2n . Para 1MB, que son 8.388.608 bits, tendríamos 4.096 fragmentos y necesitaríamos sólo 12 bits para describir el prefijo. Por tanto, necesitaríamos 13 bits para describir cada fragmento o 53.248 bits para
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
describir el fichero entero. El fichero habría quedado reducido a 6,65 KB, es decir, al 0,63 % de su tamaño original. El caso opuesto es una cadena de bits cuya fragmentación contenga todas las subcadenas posibles. Por ejemplo, hay 128 subcadenas de 8 bits. Si la fragmentación resultara en una concatenación de todas ellas, se necesitarían 8 bits para describir el prefijo y 9 para describir el fragmento, mientras que la longitud original de los fragmentos es de 8 bits. El método resultaría perfectamente inútil en este caso. El método LZ es más eficaz cuanto más regular sea la cadena, es decir, cuantas más repeticiones contenga. Esta característica está de acuerdo con el teorema de Shannon, que afirma que cuanto más regular y menos aleatoria sea una cadena (menor sea su entropía), mayor será su grado de compresión. Shannon demostró que para una cadena de n bit aleatorios y completamente independientes unos de otros la entropía vale: H = -n[p log2 p + (1 - p) log2 (1 - p)] donde p es la probabilidad de que cada bit sea un 1. Como el programa WinZip de Windows utilizan alguna variante de este método, se puede comprobar empíricamente la fórmula de Shannon creando ficheros de cadenas de bits aleatorios con diferentes probabilidades p = 0,01; 0,1; 0,2, etc. y comprimiendo los ficheros con WinZip. Después se podrá observar que los tamaños comprimidos están en la misma relación que los previstos en la fórmula de Shannon. Ejemplo4: cadena de 55 ceros seguida de un 1, se comprime en una de 55 bits 00000000000000000000000000000000000000000000000000000001 1 2 3 4 5 6 7 8 9 10 11 0-00-000-0000-00000-000000-0000000-00000000-000000000-0000000000-1 (0,0)-(1,0)-(2,0)-(3,0)-(4,0)-(5,0)-(6,0)-(7,0)-(8,0)-(9,0)-(0,1) 0000,0-0001,0-0010,0-0011,0-0100,0-0101,0-0110,0-0111,0-1000,0-1001,0-0000,1 0000000010001000011001000010100110001110100001001000001 Ejemplo5: cadena de 42 bits con máxima variación, se comprime en una de 64 0100011011000001010011100101110111 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0-1-00-01-10-11-000-001-010-011-100-101-110-111 (0,0)-(0,1)-(1,0)- (1,1-(2,0)-(2,1)-(3,0)-(3,1)-(4,0)-(4,1)-(5,0)-(5,1)-(6,0)-(6,1) 000,0-000,1-001,0-001,1-010,0-010,1-011,0-011,1-100,0-100,1-101,0-101,1-110,0-110,1 00000001001000110100010101100111100010011010101111001101
Tipos de datos en el 68000 Utiliza la alternativa big-endian para ordenar los bytes de las palabras (2 bytes) y dobles palabras (4 bytes), es decir, el byte menos significativo se almacena en la dirección más baja. Dispone de los siguientes tipos: Entero con signo en c2: de 1 byte, 2 bytes y 4 bytes. Entero sin signo: de 1 byte, 2 bytes y 4 bytes. BCD empaquetado (2 dígitos d 4 bits en un byte) Carece de datos en formato de coma flotante Tipos de datos en el Pentium II Puede trabajar con tipos de datos de 8 (byte), 16 (palabra), 32 (palabra doble) y 64 (palabra cuádruple) bits de longitud. Los tipos mayores de 1 byte no es necesario que estén alineados en memoria, el procesador se encarga de ello si no lo están. Utiliza la alternativa little-endian para ordenar los bytes de las palabras, dobles palabras y cuádruples palabras, es decir, el byte menos significativo se almacena en la dirección más baja. Admite una gran variedad de tipos:
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
General: byte, palabra, doble palabra y cuádruple palabra con contenido binario arbitrario. Entero: valor binario con signo en c2 de una palabra, una doble palabra, o una cuádruple palabra. Ordinal: entero sin signo de un byte, una palabra o una doble palabra. BCD desempaquetado: un dígito BCD en cada byte BCD empaquetado: dos dígitos BCD en un byte. Campo de bits: secuencia contigua de bits independientes no alineada de hasta 232 - 1 bits. Cadena de bytes: Secuencia contigua de bytes, palabras, o dobles palabras de hasta 232 - 1 bytes. Coma flotante: • IEEE 754 de simple precisión (32 bits) • IEEE 754 de doble precisión (64 bits) • IEEE 754 de precisión ampliada(78 bits)
2. Instrucciones que operan sobre datos. En este apartado revisaremos las instrucciones máquina que operan sobre datos. En el siguiente veremos las que controlan el flujo de ejecución. Podemos clasificar las instrucciones que operan sobre datos en los siguientes grupos: Movimiento o transferencia de datos Desplazamiento y rotación Lógicas y manipulación de bits Transformación de datos Entrada/salida Manipulación de direcciones En otro apartado estudiaremos las nuevas instrucciones paralelas que operan simultáneamente sobre un conjunto de datos del mismo tipo, conocidas como SIMD (Single Instructions Multiple Data) e introducidas por primera vez en el Pentium para acelerar las operaciones enteras de las aplicaciones multimedia (MMX), y ampliadas en el Pentium III a las operaciones paralelas de coma flotante (SSE: Streaming SIMD Extension), muy frecuentes en las aplicaciones visuales. 2.1 Instrucciones de movimiento o transferencia de datos
Se trata del tipo más básico de instrucción máquina. Transfieren el contenido de información entre elementos de almacenamiento: registros (REG), memoria (MEM) y PILA. Dependiendo de la fuente y destino de la transferencia estas instrucciones suelen recibir nombres diferentes que resumimos en la siguiente tabla: REG --> REG: transferencia REG -->MEM: almacenamiento (store) REG --> PILA: inserción (push)
MEM --> REG: carga (load) MEM --> MEM: movimiento(move) MEM --> PILA: inserción (push)
PILA --> REG: extracción (pop) PILA --> MEM: extracción (pop)
Una instrucción de este tipo deberá especificar los siguientes elementos: • Tipo de transferencia. Para especificar el tipo existen dos alternativas: - Una instrucción genérica, con un único CO, siendo el operando el que especifica el tipo de movimiento. Ejemplo MOVE
- Una instrucción diferente para cada tipo de movimiento. Ejemplos TR, STO, LD, PUSH, POP • Direcciones de la fuente y destino de la transferencia. Son los operandos de la instrucción con sus correspondientes tipos de direccionamiento • Tipo y tamaño del dato transferido: byte, media palabra, una palabra, doble palabra, etc. Ejemplo MC 68.X MOVE
tipo OPs
DESTINO
b W LW
FUENTE
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• Número de datos a mover: - Movimiento simple. Como el ejemplo anterior - Movimiento múltiple
Ejemplo: MC 68.X MOVEM
Dir
Tamaño Reg.
Dir Memoria
16 o 32 bits
Máscara de la lista de registros
Memoria
Registros
Reg --> Mem Mem --> Reg
Ejemplo VAX-11 MOVEC
Long. Fuente
Dirección Fuente
Relleno
Long. Destino
Dirección Destino
Memoria
Memoria
Relleno
Long. Fuente = Long. Destino => transferencia total Long. Fuente > Long. Destino => transferencia parcial: finaliza cuando se agota el destino Long. Fuente < Long. Destino => transferencia total: se completa con el carácter de relleno 2.2 Instrucciones de desplazamiento y rotación
Una instrucción de este tipo deberá especificar los siguientes elementos: • Tipo de operación: desplazamiento aritmético, lógico, rotación (especificado en CO) • Cuenta: número de posiciones (normalmente 1 bit, especificado en CO) • Dirección: izquierda, derecha (especificado en CO o en el signo de Cuenta) • Tipo de dato: normalmente su longitud
Desplazamientos aritméticos
S
desplazamiento aritmético derecha
S
0
desplazamiento aritmético izquierda
Desplazamientos lógicos
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
0
0 desplazamiento lógico derecha
desplazamiento lógico izquierda
Rotaciones
rotación derecha
rotación izquierda
2.3 Instrucciones lógicas y de manipulación de bits
Son instrucciones para la manipulación de bits individuales dentro de una unidad direccionable (byte, palabra, etc.) a través de operaciones booleanas. Las instrucciones lógicas operan bit a bit sobre los vectores de bits de sus operandos, las más frecuentes en los repertorios son las siguientes: • NOT (complementación) • AND (conjunción lógica) • OR (disyunción lógica) • XOR (disyunción exclusiva) • Equivalencia Con la AND podemos realizar funciones de máscara cuando queramos seleccionar un conjunto determinado de bits, y con la XOR podemos complementar bit a bit un segmento de bits. En el siguiente ejemplo hemos creado una máscara sobre los 4 bits menos significativos de R1 haciendo la AND con R2, y hemos complementado los 6 bits centrales de R1 haciendo la XOR con R3: <R1> = 1010 0101 <R2> = 0000 1111 <R3> = 0111 1110 <R1> AND <R2> = 0000 0101 <R1> XOR <R3> = 1101 1011 Las instrucciones de manipulación de bits permiten poner a 0 ó a 1 determinados bits del operando, en especial algunos bits del registro de estado. 2.4 Instrucciones aritméticas
Casi todos los repertorios disponen de las operaciones aritméticas básicas de suma resta multiplicación y división sobre enteros con signo (coma fija). Con frecuencia disponen también de operaciones sobre reales (coma flotante) y decimales (BCD).
Suma Resta Multiplicación División Cambio de signo Valor absoluto Incremento Decremento Comparación
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
2.5 Instrucciones de transformación de datos
Traducción: traducen valores de una zona de memoria utilizando una tabla de correspondencia.
Conversión: operan sobre el formato de los datos para cambiar la representación.
Por ejemplo cambio de BCD a binario o cambio de formato EBCDIC a formato ASCII como realiza la instrucción Translate (TR) del S/370. 2.6 Instrucciones de entrada/salida
Estas instrucciones coinciden con las de referencia a memoria de carga y almacenamiento (LOAD y STORE) para aquellos procesadores que disponen de un único espacio de direcciones compartido para Memoria y E/S. Los procesadores con espacio de E/S independiente disponen de instrucciones específicas tales como:
Inicio de la operación: START I/O
Prueba del estado: TEST I/O
Bifurcación sobre el estado: BNR (Branch Not Ready)
Entrada: IN que carga en el procesador un dato de un dispositivo periférico
Salida: OUT que lo envía a un dispositivo periférico.
2.7 Instrucciones de manipulación de direcciones
Estas instrucciones calculan la dirección efectiva de un operando para manipularla como un dato cargándola en un registro o una pila. Como ejemplos tenemos las instrucciones LEA y PEA del 68000: LEA.L opf, An: dirección fuente --> An lleva dirección efectiva del operando fuente opf al registro de direcciones An PEA.L opf: dirección fuente --> Pila lleva dirección efectiva del operando fuente opf a la Pila de la máquina a través del registro SP con predecremento: dirección --> -(SP)
2.8 Instrucciones que operan sobre datos del Pentium II
MOV PUSH PUSHA MOVSX MOVS LODS
Movimiento o transferencia de datos Transferencia entre registros, o entre registro y memoria Inserción del operando en la pila Inserción de todos los registros en la pila Transfiere un byte a una palabra, o una palabra a una doble palabra con extensión del signo Mueven un byte, palabra o doble palabra de una cadena indexada Carga un byte, palabra o doble palabra de una cadena
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
SHL SHR SAL SAR ROL ROR
Desplazamiento y rotación Desplazamiento lógico a la izquierda Desplazamiento lógico a la derecha Desplazamiento aritmético a la izquierda Desplazamiento aritmético a la derecha Rotación izquierda Rotación derecha
SETcc
Lógicas y manipulación de bits Conjunción lógica de los operandos BitTes&Set utilizada para primitivas de sincronismo en multiproceso Identifica el primer bit a 1 de una palabra o doble palabra y almacena su número de posición en un registro Pone un byte a cero o a uno dependiendo de algún bit del registro de estado
XLAT
Transformación de datos Traduce con la ayuda de una tabla
IN OUT
Entrada/Salida Entrada de dato desde un dispositivo de E/S Salida de dato hacia un dispositivo de E/S
LEA
Manipulación de direcciones Carga el desplazamiento del operando fuente (no su valor) en el destino
AND BTS BSF
2.9 Instrucciones que operan sobre datos del 68000
(Ver bibliografía de Laboratorio de Estructura de Computadores) 2.10 Instrucciones paralelas SIMD (Single Instruction Multiple Data)
Se trata de instrucciones muy optmizadas para realizar operaciones multimedia. Fueron introducidas en el 96 en la microarquitectura P6 de la familia IA-32 como tecnología MMX del Pentium. Estas instrucciones operan sobre los datos siguiendo un modo SIMD(Single Instruction Multiple Data), es decir, realizando la misma operación (single instruction) en paralelo sobre múltiples secuencias de datos, consiguiendo una mejora de velocidad sobre la alternativa secuencial del orden de 2 a 8 veces. Las ventajas de estas extensiones SIMD se habían probado con éxito en los repertorios de otros procesadores, por ejemplo, en el SPARC de Sun Microsystems con el nombre de VIS (Visual Instruction Set) y PA-RISC de Hewlett-Packard con el nombre de conjunto de instrucciones MAX-2. Los programas multimedia operan sobre señales muestreadas de vídeo o audio representadas por grandes vectores o matrices de datos escalares relativamente pequeños (8 a 16 bits) o incluso 32 bits para señales 3D Tipos de datos Los diferentes medios de una aplicación multimedia suelen utilizar el siguiente número de bits para codificar sus informaciones básicas: Gráficos y vídeos: utilizan 8 bits para cada punto (escala de grises) o componente de color. Audio: utiliza 16 bits para cada valor muestreado de la señal. Gráficos 3D: pueden utilizar hasta 32 bits por punto.
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Para poder realizar el procesamiento paralelo de estas informaciones básicas, MMX define los tres tipos de datos siguientes: 8 bytes empaquetados 1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
B
4 palabras empaquetadas 1 palabra
1 palabra
1 palabra
1 palabra
W
2 dobles palabras empaquetadas 1 doble palabra
1 doble palabra
D
1 cuádruple palabras empaquetada Q
1 cuádruple palabra
Registros MMX Existen 8 registros de propósito general MMX que se designan como mmi (i = 0,...7). Estos registros no tienen una realidad independiente dentro de la organización del procesador, se soportan sobre los 64 bits menos significativos de los registros de punto flotante de 80 bits. El campo de exponente del correspondiente registro de punto flotante (bits 64-78) y el bit de signo (bit 79) se pone a 1’s, convirtiendo el contenido en un valor NaN desde el punto de vista de los valores en punto flotante. De esta forma se reduce la posible confusión, asegurando que los valores de datos MMX no se tomen como valores en punto flotante. Las instrucciones MMX acceden sólo a los 64 bits menos significativos de los registros. Este uso dual de los registros de punto flotante no significa que se pueda mezclar en las aplicaciones ambos usos de forma indiscriminada. Dentro de una aplicación el programador deberá asegurar que el código MMX y el código en punto flotante estén encapsulados en rutinas separadas. 1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
1 byte
Repertorio de instrucciones MMX Formato CSO [<tipo de datos>] <registros MMX> CSO = Código Simbólico de Operación Tipo de datos = B, W, D ó Q
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ejemplo: instrucción de suma paralela con truncamiento de dos registros MMX con 8 bytes empaquetados PADDB mmi, mmj <mmi> + <mmj> Æ mmj 0101
0101
+
0101
+
+
0101
0101
+
+
0101
+
0101
0101
+
mmi
+
0101
0101
0101
0101
0101
0101
0101
0101
mmj
1010
1010
1010
1010
1010
1010
1010
1010
mmi
Instrucciones Aritméticas Este grupo lo forman 9 instrucciones, 3 de suma, 3 de resta y 3 de multiplicación. En ellas se distingue entre la aritmética con saturación y con truncamiento. En la aritmética binaria con truncamiento el resultado de una operación con desbordamiento queda truncado por la pérdida del bit de desbordamiento. Por el contrario, en la aritmética con saturación, cuando la suma produce un desbordamiento, o la resta un desbordamiento negativo, el resultado se fija respectivamente al mayor o menor valor representable. Ejemplo: +
1111 0000 0000 0000 0011 0000 0000 0000
rebose --> 1
0010 0000 0000 0000
resultado en aritmética con truncamiento
1111 1111 1111 1111 resultado en aritmética con saturación La aritmética con saturación se utiliza, por ejemplo, cuando se suman dos números que representan intensidad de imagen (nivel de negro., por ejemplo, o de un color base) y no se quiere que el resultado sea menos negro (menos intenso en el caso de color base) que la suma de las imágenes originales. Las instrucciones de este grupo son las siguientes:
Instrucciones Aritméticas PADD [B, P, D] mmi, mmj PADDS [B, W] mmi, mmj PADDUS [B, W] mmi, mmj PSUB [B,W, D ] mmi, mmj PSUBS [B,W] mmi, mmj PSUDUS [B, W] mmi, mmj PMULHW PMULLW mmi, mmj PMADDWD mmi, mmj
Semántica Suma paralela con truncamiento de 8 B, 4 W ó 2 D Suma con saturación Suma sin signo con saturación Resta con truncamiento Resta con saturación Resta sin signo con saturación Multiplicación paralela con signo de 4 palabras de 16 bits, con elección de los 16 bits más significativos del resultado de 32 bits Multiplicación paralela con signo de 4 palabras de 16 bits, con elección de los 16 bits menos significativos del resultado de 32 bits Multiplicación paralela con signo de 4 palabras de 16 bits, y suma de pares adyacentes del resultado de 32 bits
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Instrucciones de Comparación La tecnología MMX dispone de instrucciones paralelas de comparación que generan una máscara de bits como resultado. Estas instrucciones posibilitan la realización de cálculos dependientes de los resultados anteriores eliminando la necesidad de instrucciones de bifurcación condicional. La máscara resultado de una comparación tiene todo 1’s en los elementos correspondientes a una comparación con resultado true, y todo 0’s cuando el resultado de la comparación es false:
a3
a2
a1
a0
=
=
=
=
b3
b2
b1
b0
SI
a3 = b3 a2 ≠ b2 a1 = b1 a0 ≠ b0
ENTONCES
11...11
00...00
11...11
00...00
Las instrucciones de este grupo son las siguientes: Instrucciones de Comparación PCMPEQ [B, W, D] mmi, mmj PCMPGT [B, W, D]
Semántica Comparación paralela de igualdad, el resultado es una máscara de 1´s si True y de 0´s si False Comparación paralela de > (magnitud), el resultado es una máscara de 1´s si True y de 0´s si False
mmi, mmj
Instrucciones de Conversión La tecnología MMX utiliza dos conjuntos de instrucciones para realizar conversiones entre los tipos de datos MMX (PACK y UNPACK). Las instrucciones UNPACK toman un tipo de datos pequeño y producen uno mayor (por ejemplo, uno de 16 bits en otro de 32 bits). Las instrucciones UNPACK toman dos operandos y los entrelazan, como ocurre en el siguiente ejemplo para datos con componentes de 16 bits: mmi b3 b2
b1 b0
mmj a3 a2
b1
b0 a0
a1 a0
mmi a1
Si sólo se quiere desempaquetar elementos de 16 bits en elementos de 32 bits se ejecuta la instrucción UNPACK con un operando de todos 0’s. El resultado es 2 palabras de 32 bits con 0’s en las posiciones más significativas: mmi 0
0
0
0
mmj a3 a2
0
a1
0
a1 a0
mmi a0
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Las instrucciones de este grupo son las siguientes: Instrucciones de Conversión PACKUSWB mmi, mmj PACKSS [WB, DW] mmi, mmj PUNPCKH [BW, WD, DQ] mmi, mmj PUNPCKL [BW, WD, DQ] mmi, mmj
Semántica Empaqueta palabras en bytes con saturación sin signo Empaqueta palabras en bytes con saturación con signo, o palabras dobles en palabras Desempaqueta en paralelo los B, W o D más significativos del registro MMX. Mezcla entrelazada Desempaqueta en paralelo los B, W o D menos significativos del registro MMX. Mezcla entrelazada
Instrucciones Lógicas El repertorio MMX dispone de 4 operaciones lógicas que realizan otras tantas operaciones bit a bit de este tipo sobre los 64 bits de los operandos. Combinadas con las máscaras resultantes de las instrucciones de comparación permiten la realización de cálculos alternativos en función de resultados anteriores. Las instrucciones de este grupo son las siguientes: Instrucciones Lógicas PAND mmi, mmj PANDN mmi, mmj POR mmi, mmj PXOR mmi, mmj
Semántica AND lógico bit a bit (64 bits) AND NOT lógico bit a bit (64 bits) OR lógico bit a bit (64 bits) XOR lógico bit a bit (64 bits)
Instrucciones de Desplazamiento Este grupo lo constituyen operaciones de desplazamiento y rotación lógicos y aritméticos realizados en paralelo sobre cada uno de los elementos de datos de uno de sus operandos. El otro indica el número de bits de desplazamiento o rotación. Las instrucciones de este grupo son las siguientes: Instrucciones de Desplazamiento PSLL [W, D, Q] mmi PSRL [W, D, Q] PSRA [W, D,]
mmi mmi
Semántica Desplazamiento lógico izquierda paralelo de W, D ó Q tantas veces como se indique en el registro MMX o valor inmediato Desplazamiento lógico derecha paralelo de W, D ó Q tantas veces como se indique en el registro MMX o valor inmediato Desplazamiento aritmético derecha paralelo de W ó D tantas veces como se indique en el registro MMX o valor inmediato
Instrucciones de Transferencia La única instrucción de este grupo permite la transferencia de información entre registros MMX, la carga de registros MMX desde memoria, y el almacenamiento de los contenidos de los registros MMX en memoria: Instrucción de Transferencia MOV [D, Q] mmi, memoria
Semántica Transfiere una D ó Q a/desde el registro MMX
Ejemplo 1. Codificación MMX de un bucle iterativo for i = 0 if a[i] = Salida[i] Salida[i]
to 3 color then = c[i] else = a[i]
20
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Fase 1
mm0
A
color
mm1
Color
00...00
mm0
a3
a2
a1
a0
=
=
=
=
color
color
11...11
00...00
color 11...11
Fase 2 a3
a2
a1
mm2
a0
c3
c2
c1
AND = (NOT-AND)mm0 00...00
11...11
0
a2
00...00 0
c0
mm4
C
AND
11...11
mm0
a0
mm0
11...11
00...00
c3
11...11
00...00
mm0
c1
0
mm4
0
OR c3
a2
c1
a0
mm0
El programa MMX que implementa el proceso iterativo es el siguiente: MOVQ MOVQ MOVQ MOVQ PCMPEQW PAND PANDN POR
mm0, A mm2, mm0 mm4, C mm1, Color mm0, mm1 mm4, mm0 mm0, mm2 mm0, mm4
;carga el array A ;hace copia del array A ;carga el array C ; carga Color ;compara A con Color ;selecciona elementos de C ;selecciona elementos de A ;genera la salida
Ejemplo 2. Transposición de matrices T
⎡a3 a 2 a1 a 0 ⎤ ⎡d 3 c3 b3 a3 ⎤ ⎢b b b b ⎥ ⎢ ⎥ ⎢ 3 2 1 0 ⎥ = ⎢d 2 c 2 b2 a 2 ⎥ ⎢c3 c 2 c1c0 ⎥ ⎢d1c1b1 a1 ⎥ ⎢ ⎥ ⎢ ⎥ ⎣d 0 c0 b0 a 0 ⎦ ⎣d 3 d 2 d1 d 0 ⎦ El proceso se realiza en dos pasos y supondremos que los elementos de la matriz son palabras de 16 bits. En la fase 1 se utiliza la instrucción UNPACK para entrelazar los elementos de filas adyacentes; y en la fase 2 se desempaquetan los resultados de la primera fase utilizando esta vez instrucciones UNPACK de doble palabra (32 bits) para producir la salida deseada. El proceso se resume en la siguiente figura:
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
mm4 d3 d2
mm3 c3 c2
d1 d0
c1 c0
mm2 b3 b2
mm3
mm1 a3 a2
b1
b0 a0
a1 a0
mm1 d1
mm3 d1 c1
b1 b0
c1
d0 c0
d0 c0
mm1 b1 a1
mm1 c0 b0 a0
d0
b0 a0
d1
a1
mm3 c1 d0 c0
d1
mm5 b1 a1
b0 a0
mm5 c1 b1 a1
El programa MMX que implementa el proceso de transposición es el siguiente: MOVQ MOVQ MOVQ MOVQ PUNPCKLWD PUNPCKLWD MOVQ PUNPCKLDQ PUNPCKHDQ
mm1, fila1 mm2, fila2 mm3, fila3 mm4, fila4 mm1, mm2 mm3, mm4 mm5, mm1 mm1, mm3 mm5, mm3
;carga la primera fila de la matriz ;carga la segunda fila de la matriz ;carga la tercera fila de la matriz ;carga la cuarta fila de la matriz ;desempaqueta palabras orden inf. de filas 1 & 2, mm1=[b1,a1,b0,a0] ;desempaqueta palabras orden inf. de filas 3 & 4, mm3=[d1,c1,d0,c0] ;copia mm1 en mm5 ;desempaqueta dobles palabras orden inferior -> mm1=[d0,c0,b0,a0] ;desempaqueta dobles palabras orden superior -> mm1=[d1,c1,b1,a1]
las otras 2 filas [d3,c3,b3,a3] y [d4,c4,b4,a4] se generan de forma análoga. Ejemplo 3: Función de desvanecimiento gradual de una imagen B y aparición simultanea de otra imagen A Las dos imágenes A y B se combinan en un proceso que efectúa sobre cada par de pixels homólogos la media ponderada por un factor de desvanecimiento fade que irá variando de 0 a 1, y su complementario (1-fade), que lo hará de 1 a 0 Pixel_resultante = Pixel_A * fade + Pixel_B*(1 - fade)
El resultado es una transformación gradual de la imagen B en la imagen A a medida que fade pasa de 0 a 1. Cada pixel ocupa 1 byte y hay que desempaquetarlo previamente a un valore de 16 bits para adaptarlo al tamaño de las multiplicaciones MMX de 16 bits. Si una imagen tiene una resolución de 640 X 480 y en el cambio de imagen se emplean 255 valores posibles para fade (fade codificado con 1 byte), será necesario ejecutar el proceso 640*480*255 = 7.833.600 veces. Eso para el caso de imágenes en blanco y negro, si fuesen en color necesitaríamos esa cantidad multiplicada por 3 (tres componentes básicas del color), es decir 23.500.800. Para secuenciar las operaciones pongamos la expresión anterior de la intensidad del pixel resultante de la siguiente forma:
Pixel_resultante =
Pixel_A * fade + Pixel_B - Pixel_B*fade = (Pixel_A - Pixel_B) * fade + Pixel_B
22
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Luego hay que restar al Pixel_A el valor del Pixel_B, multiplicar el resultado por fade y sumar finalmente el valor del Pixel_B. A estas operaciones hay que añadir las previas de movimiento de datos y desempaquetamiento. En la siguiente figura aparece el esquema del proceso:
a3
Imagen_A a2 a1 a0
mm0
mm1
b3
Imagen_B b2 b1 b0
Desempaquetar mm0
a3
a2
a1
a0
b3
b2
b1
b0
mm1
Resta mm0
r3
r2
r1
r0
x
x
x
x
fade
fade
fade
fade
mm3
= r3*fade
= r2*fade
= r1*fade
= r0*fade
mm0
+
+
+
+
b3
b2
b1
b0
= = nuevo3 nuevo2
mm1
= nuevo1
= nuevo0
mm0
r3
r1
mm0
empaqueta r2
r0
El programa MMX que implementa este proceso es el siguiente: PXOR mm7, mm7 ;pone a cero mm7 MOVQ mm3, valor_fade ;carga en mm3 el valor de fade replicado 4 veces MOVD mm0, imagenA ;carga en mm0 la intensidad de 4 pixels de la imagen A MOVD mm1, imagenB ;carga en mm1 la intensidad de 4 pixels de la imagen B PUNPCKLBW mm0, mm7 ;desempaqueta a 16 bits los 4 pixels de mm0 PUNPCKLBW mm1, mm7 ;desempaqueta a 16 bits los 4 pixels de mm1 PSUBW mm0, mm1 ;resta la intensidad de la imagen B de la de A PMULHW mm0, mm3 ;multiplica el resultado anterior por el valor de fade PADDDW mm0, mm1 ;suma el resultado anterior a la imagen B PACKUSWB mm0, mm7 ;empaqueta en bytes los 4 resultados de 16 bits
3. Instrucciones de control del flujo de ejecución. El orden de procesamiento de las instrucciones viene determinado por el avance del contador de programa, que lo hace de forma secuencial con todas las instrucciones salvo con las de los siguientes grupos:
Bifurcación condicional (e incondicional) Bifurcación a subrutinas
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Este grupo de instrucciones juega un triple papel en las posibilidades expresivas y computacionales del repertorio:
Toma de decisiones en función de resultados previamente calculados. Las instrucciones de bifurcación condicional cumplen este papel en el repertorio.
Reutilización de parte del código del programa. Los procesos iterativos son el caso más elemental de reutilización de código, que se construyen con instrucciones de bifurcación condicional. El segundo caso es el de las subrutinas, con ellas se construyen los bloques (funciones y procedimientos) de los lenguajes de alto nivel.
Descomposición funcional del programa. Se trata del segundo papel que cumplen las subrutinas dentro de un programa: facilitar la modularidad del mismo, y con ello su depuración y mantenibilidad.
3.1 Instrucciones de bifurcación condicional
Los tres componentes básicos de las instrucciones de salto condicional son: el código de operación, la condición de salto y la dirección destino. CO
Condición
Dirección
Semántica: IF Condición = True THEN CP <-- Dirección ELSE CP <-- <CP> + 1 Gestión de la Condición • Generación
a) Implícita: la condición se genera como efecto lateral de la ejecución de una instrucción de manipulación de datos (ADD, SUB, LOAD, etc.) b) Explícita: existen instrucciones específicas de comparación o test que sólo afectan a las condiciones (CMP, TST, etc.) • Selección
a) Simple: afecta a un sólo bit del registro de condiciones (Z, N, C, etc.) b) Compuesta: afecta a una combinación lógica de condiciones simples (C+Z, etc.) simples nemotécnico CC (carry clear) CS (carry set) NE (not equal) EQ (equal) VC (overflow clear) VS (overflow set) PL (plus) MI (minus)
Condición ¬C C ¬Z Z ¬V V ¬N N
compuestas nemotécnico Condición HI (high) ¬C • ¬Z LS (low or same) C+ Z HS (high or same) ¬C LO (low) C GE (greater or equal) N xor ¬V LT (less than) N xor V GT (greater than) (N xor ¬V)and¬Z LE (less or equal) (N xor V)orZ
24
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• Uso
a) Con almacenamiento de la condición en un registro de estado o condición: una 1ª instrucción de gestión de datos o comparación genera la condición que se almacena en un registro de estado de la máquina, y una 2ª instrucción selecciona la condición y bifurca en caso que sea cierta (True) b) Con almacenamiento de la condición en un registro general: una 1ª instrucción de gestión de datos o comparación genera la condición que se almacena en un registro general de la máquina que debe especificarse en la misma, y una 2ª instrucción selecciona la condición y bifurca en caso que sea cierta (True) c) Sin almacenamiento de la condición: una única instrucción genera, selecciona la condición y bifurca en caso que sea cierta (BRE R1, R2, DIR : salta a DIR si <R1> = <R2>) Especificación de la dirección • direccionamiento directo (Jump) • direccionamiento relativo (Branch) • direccionamiento implícito (Skip: salta una instrucción si se cumple la condición)) 3.2 Subrutinas
Supongamos que en diferentes puntos de un programa se realiza la operación de elevar al cuadrado un número. El código simbólico (MC68000) de la operación sería el siguiente: MOVE.W MULS MOVE,W
N, D0 D0, D0 D0, N
El programador tiene dos opciones para repetir el código en los puntos donde aparezca la operación: las macros y las subrutinas. a) Una MACRO o subrutina abierta es una llamada que se realiza en aquellos puntos donde aparece la operación y que el ensamblador sustituye por el código correspondiente en un proceso denominado de expansión de macros. N1
2
MOVE .W MULS MOVE .W
N2
N1, D0 D0, D0 D0, N1
2
MOVE .W MULS MOVE .W
N2, D0 D0, D0 D0, N2
25
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
b) Una SUBRUTINA o subrutina cerrada por el contrario no repite el código en cada llamada, bifurca a un único código que una vez ejecutado devuelve control a la instrucción siguiente a la que realizó la bifurcación: N12
MOVE .W MU LS MOVE .W
N, D0 D0, D0 D0, N
N22
Cuatro problemas hay que resolver en el mecanismo de una subrutina (cerrada):
Controlar la dirección de vuelta a la instrucción siguiente a la que realizó la llamada
Organizar el paso de parámetros
Ubicar las variables locales de la subrutina
Preservar el contexto del programa
Analizaremos las diferentes alternativas de resolución de estos problemas resaltando las ventajas e inconvenientes de cada una. 3.2.1 Control de la dirección de vuelta
Para hacer que la dirección de vuelta de una subrutina sea siempre la siguiente a la de la instrucción que realiza la llamada se pueden utilizar las siguientes alternativas: 1) Utilización de un registro Se trata de una alternativa fácil de implementar y rápida en su ejecución, sin embargo, impide el anidamiento y la recursión. Prog. Principal
Subrutina Sub
dir
Salto
Sub Retorno dir
Registro Pi i l
dir
PC
Aunque en el 68000 no es necesario utilizar esta alternativa, su codificación podría ser la siguiente:
26
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
cuadrado
MOVE.W MULS MOVE.W JMP
N, D0 D0, D0 D0, N (A0)
.......
N1, N siguiente1, cuadrado
A0
siguiente1
MOVE.W LEA.L JMP ......
N2, N siguiente2, cuadrado
A0
siguiente2
MOVE.W LEA.L JMP . .
2) Utilización de una posición de memoria de la subrutina Esta alternativa exige que antes de bifurcar a la subrutina se ponga la dirección de vuelta en una posición de memoria perteneciente a la subrutina (por ejemplo, la primera). El retorno se realiza con un salto incondicional e indirecto sobre esta posición. Prog. Principal
dir
Salto Sub1
Subrutina 1
Subrutina 2
dir
dir1
Sub1
Sub2 Salto Sub2
dir1
Retorno
Retorno
Esta alternativa permite un número ilimitado de llamadas anidadas, pero no permite la recursión. En el 68000 codificaríamos esta alternativa llevando el contenido de la posición de memoria a un registro de direcciones y realizando para implementar la vuelta un salto indirecto sobre él: vuelta cuadrado
--------------------------MOVE.W N, D0 MULS D0, D0 MOVE.W D0, N LEA.L vuelta, A0 JMP (A0) .......
siguiente1, A1 A1, vuelta cuadrado
siguiente1
LEA.L MOVE.L JMP .......
siguiente2, A1 A1, vuelta cuadrado
siguiente2
LEA.L MOVE.L JMP ......
27
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
3) Utilización de una pila (stack) Inmediatamente antes de realizar la bifurcación a la subrutina se coloca la dirección de retorno en la pila. Lo último que realiza la subrutina es recuperar esta dirección de retorno y llevarla al contador de programa. Esta alternativa permite el anidamiento y la recursión porque resuelve el orden de los retornos con el orden de inserción y extracción que impone la Pila. Se vuelve a la instrucción siguiente a la última llamada porque de la pila siempre se extrae el último retorno almacenado. En el 68000 existen dos instrucciones que realizan las dos acciones descritas: JSR
D1
bifurca a D1 almacenando previamente la dirección de la instrucción siguiente en la Pila RTS lleva el último retorno introducido en la Pila al PC. Prog. Principal
Subrutina 1
Subrutina 2
Sub1 dir
Sub2
Subrutina 3 Sub3
JSR Sub1 JSR Sub2
JSR Sub3
dir1
dir2
RTS
RTS
RTS
La evolución de la Pila en las secuencias de llamadas y vueltas sería la siguiente: Pila antes de la llamada a sub1
Pila después de la llamada a sub1
Pila después de la llamada a sub2
Pila después de la llamada a sub3
Pila después de la vuelta de sub3
Pila después de la vuelta de sub2
Pila después de la vuelta de sub1
dir2
dir
dir1
dir1
dir1
dir
dir
dir
dir
La estructura del código para el 68000 sería la siguiente: cuadrado
MOVE.W MULS MOVE.W RTS
N, D0 D0, D0 D0, N
......
cuadrado
siguiente1
JSR ..... JSR .....
cuadrado
siguiente2 ......
28
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
3.2.2 Paso de parámetros
1) Utilización de un registro La utilización de registros para el paso de parámetros y devolución de resultados entre el programa principal y la subrutina es el método más rápido (pues no hay que acceder a memoria) pero resulta bastante limitado si el procesador no dispone de un buen número de registros. (Veremos más adelante que en algunos procesadores RISC existen mecanismos especiales para realizar el paso de parámetros a través de registros con solapamiento). 2) Utilización de memoria La utilización de memoria para el paso de parámetros aporta mayor capacidad pero lentifica el proceso por la necesidad de acceder a memoria. Tanto esta alternativa como la anterior impiden la recursión de las subrutinas 3) Utilización de la pila Cuando se realiza la llamada no sólo se introduce en la pila la dirección de retorno, sino que previamente se introducen también los parámetros que deben transferirse. La subrutina accede a los parámetros actuales en la pila. Prog. Principal
Subrutina Sub
Paso de parámetros (PUSH) JSR Sub dir
RTS
Liberación de parámetros
La evolución de la Pila en el proceso de llamada y vuelta de subrutina sería la siguiente: Pila antes del paso de parámetros
Pila después del paso de parámetros
Pila después de la llamada a sub
Pila después de la vuelta de sub
Pila después de la liberación del área de parámetros
dir
3.2.3
parametro n
parametro n
parametro n
parámetro 1
parámetro 1
parámetro 1
Preservación del contexto
Para que no se modifique el contexto de operación del programa principal, será necesario que la subrutina comience preservando el valor todos los registros que se modifican en su ejecución, y finalice restaurando el valor de dichos registros:
29
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Prog. Principal
Subrutina Sub
Preservación del contexto
Paso de parámetros (PUSH) JSR Sub dir
Restauración del contexto
Liberación de parámetros
RTS
En este caso la evolución de la Pila sería la siguiente: Pila antes del paso de parámetros
Pila después del paso de parámetros
Pila después de la llamada a sub
Pila después de preservar el contexto
Pila después de restaurar el contexto
Pila después de la vuelta de sub
contexto
3.2.3
dir
dir
dir
parametro n
parametro n
parametro n
parametro n
parametro n
parámetro 1
parámetro 1
parámetro 1
parámetro 1
parámetro 1
Pila después de la liberación del área de parámetros
Variables locales de la subrutina
Para que una subrutina con variables locales sea re-entrante y por tanto recursiva es necesario crear un conjunto nuevo de variables locales cada vez que se produce una nueva llamada sin haber finalizado la anterior. Para ello se puede utilizar de nuevo la Pila, que se convierte así en el soporte de la gestión dinámica de la memoria en las llamadas a subrutinas. El conjunto de información que se introduce en la pila como consecuencia de una llamada a subrutina se conoce como Registro de Activación (RA) Prog. Principal
Paso de parámetros (PUSH)
Subrutina Sub
Creación de variab. locales Preservación del contexto
JSR Sub dir
Liberación de parámetros
Restauración del contexto Destrucción de variab. locales RTS
30
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La evolución de la Pila en el proceso de llamada, ejecución con variables locales y vuelta de subrutina sería la siguiente: Pila después del paso de parámetros
Pila después de la llamada a sub
Pila después de reservar var. locales
Pila después de preservar el contexto
Pila después de restaurar el contexto
Pila después de liberar var. locales
Pila después de la vuelta de sub
contexto
parámetros
variables locales
variables locales
variables locales
dir
dir
dir
dir
dir
parámetro 1
parámetros
parámetros
parámetros
parámetros
parámetros
Finalmente, para que el RA de una subrutina pueda recuperarse cuando se vuelve de una llamada a otra subrutina, es necesario que antes de realizar la llamada se guarde en el nuevo RA (el de la subrutina llamada) la dirección del antiguo RA (el de la subrutina que realiza la llamada, o subrutina padre). De esta manera todos los RAs quedan enlazados a través de este nuevo campo: contexto
Estado de la Pila
var. locales
R.A de Sub3
Subrutina en ejecución
D. RA padre Dir. Retorno parámetros contexto
Subrutina 1
var. locales
R.A de Sub2
D. RA padre
Sub1
Subrutina 2 Sub2
Subrutina 3 Sub3
Dir. Retorno parámetros
JSR Sub2
JSR Sub3
RTS
RTS
contexto var. locales
R.A de Sub1
RTS
D. RA padre Dir. Retorno parámetros
MC 68000 En el 68000 los registros de activación se gestionan con las instrucciones LINK y UNLK, y contienen los cuatro campos siguientes: • •
parámetros reales de la llamada a la subrutina, dirección de retorno de la subrutina,
31
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• •
puntero del registro de activación del subprograma padre zona de variables locales.
El puntero al registro de activación actual se almacena en un registro de direcciones, que normalmente es el registro A6. El puntero de pila (SP) es el registro A7 y el puntero a las variables globales A5. SP
A7
PRAL
A6
PRAG
A5
Variables locales Puntero al RA padre Dirección de retorno Parámetros
Variables globales
La instrucción LINK sirve para reservar la memoria correspondiente a un registro de activación y actualizar el puntero al mismo, es decir, para asignar y enlazar el registro de activación. La instrucción UNLIK deshace el enlace y devuelve la memoria. La instrucción LINK tiene el siguiente formato: LINK An, #desplazamiento An se usará como puntero al registro de activación, y el desplazamiento es un número entero negativo, cuya magnitud es el número de bytes que ocupan las variables locales. Su semántica es la siguiente: An --> -(SP); SP --> An; SP + desplazamiento --> SP Es decir: 1. 2. 3.
Guarda el registro en la pila. Copia el contenido del puntero de pila en el registro. Suma el número negativo al puntero de pila, decrementando el puntero de pila un número de bytes igual al que ocupan las variables locales.
Teniendo en cuenta que en la pila están ya los parámetros y la dirección de retorno de la subrutina la ejecución de esta instrucción inmediatamente después de entrar en la rutina tiene el siguiente efecto: • • •
Guarda en la pila el puntero de registro de activación actual (A6), que contiene el puntero de registro de activación de la subrutina padre. Copia el puntero de pila en el puntero de registro de activación actual, que no varía durante la ejecución de la subrutina. Con esto se enlaza el registro de activación de la subrutina con el de la subrutina padre. Decrementa el puntero de pila reservando espacio para las variables locales de la subrutina.
32
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La instrucción UNLK desasigna la zona de memoria local restituyendo el puntero de registro de activación de la subrutina padre. Tiene el siguiente formato: UNLK An An es el registro de direcciones que se ha usado como puntero de registro de activación. Su semántica es la siguiente: An --> SP; (SP)+ --> An Es decir: 1. 2.
Copia el contenido del registro en el puntero de pila. Saca un palabra larga de la pila y la almacena en el registro.
La ejecución de esta instrucción antes del retorno de subrutina tiene el siguiente efecto: • Copia en el puntero de pila el contenido del puntero del registro de activación actual. Con esto se libera la zona de variables locales de la pila. • Saca de la pila el puntero de registro de activación de la subrutina padre y lo coloca como puntero de registro de activación actual. El puntero de pila queda apuntando a la dirección de retorno. Programa Principal
Sub
Subrutina LINK A6, #despla Preservación del contexto
Paso de parámetros (PUSH)
JSR Sub dir
Liberación de parámetros
Restauración del contexto
UNLK A6 RTS
Pentium El procesador Pentium II tiene instrucciones equivalentes a las del 68000 para realizar la gestión de las subrutinas: CALL, ENTER, LEAVE y RETURN equivalentes a JSR, LINK, UNLK y RTS. Programa Principal
Sub
Subrutina ENTER Preservación del contexto
Paso de parámetros (PUSH) CALL Sub dir
Liberación de parámetros
Restauración del contexto LEAVE RETURN
33
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Sin embargo, en el 8088 y 8086 la subrutina se iniciaba con la siguiente secuencia de instrucciones: PUSH EBP MOV EBP, ESP SUB ESP, espacio_para_variables_locales dode EBP es el PRAL y ESP el Puntero de pila (SP). Esta secuencia de instrucciones es más rápida que su equivalente ENTER que se introdujo con el 80286 (10 ciclos ENTER frente a 6 la secuencia anterior). La instrucción ENTER se añadió al repertorio para sustituir a todo el código anterior, aunque su velocidad de ejecución es menor que la de dicho código. 4. Soporte de las instrucciones de control a las construcciones de alto nivel 4.1 Construcciones condicionales
IF-THEN L.A.N. IF A ope B THEN <sentencias1> L
LM. CMP A, B B¬ope L <sentencias> ......
L1 L2
L.M. CMP A, B Bope L1 <sentencias2> BRA L2 <sentencias1> ......
IF-THEN-ELSE L.A.N. IF A ope B THEN <sentencias1> ELSE <sentencias2>
IF-THEN-ELSE-IF L.A.N. IF A1 ope1 B1 THEN <sentencias1> ELSE IF A2 ope2 B2 THEN <sentencias2> ...... ELSE IF An open Bn THEN <sentenciasn> ELSE <sentencias>
L1
L2 Ln-1
Ln L
L.M. CMP A1, B1 B¬ope1 L1 <sentencias1> BRA L CMP A2, B2 B¬ope2 L2 <sentencias2> BRA L ....... CMP An, Bn B¬open Ln <sentenciasn> BRA L <sentencias> ........
34
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CASE L.A.N. CASE K OF 0: <sentencias1> 1: <sentencias2> ...... n: <sentenciasn> defecto: <sentencias>
L.M. TABLA L0 L1 L2 ... Ln Ln+1
L0 L1
Ln Ln+1 FIN
MOVE K, A1 LEA TABLA(A1), A2 JMP (A2) <sentencias0> BRA FIN <sentencias1> BRA FIN .... <sentenciasn> BRA FIN <sentenciasn+1> ........
4.2 Construcciones iterativas
WHILE-DO L.A.N. WHILE A ope B BEGIN <sentencias1> END DO
INI
L
L.M. CMP A, B B¬ope L <sentencias> BRA INI <sentencias1> ......
REPEAT L.A.N. REPEAT <sentencias> UNTIL A ope B
INI
L.M. <sentencias> CMP A, B B¬ope INI ......
FOR L.A.N. FOR A = B TO C DO <sentencias>
L1
L.M. MOVE B, A CMP C, A BGT L2 <sentencias> INC A BRA ......
35
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 4: Rendimiento del procesador. 1. Medidas del rendimiento de un computador 2. Influencia en el rendimiento de las alternativas de diseño. 3. Influencia de los compiladores de lenguajes de alto nivel. 4. Procesadores RISC y CISC.
1. Medidas del rendimiento de un computador Cuando se quieren comparar diferentes procesadores es necesario establecer el criterio de medida que permita cuantificar los resultados de la comparación. En este sentido existen dos extremos que aclarar previamente: la unidad de medida y el patrón de medida. El primero se refiere a la métrica utilizada para cuantificar la comparación. Y el segundo al objetivo mismo de la comparación. El tiempo es la unidad de medida por excelencia cuando se comparan varios procesadores, aunque no siempre coincidan los puntos de vista de los diferentes observadores. Así, el usuario de un procesador puede decir que el procesador A es mejor que el procesador B cuando A ejecuta su programa en menor tiempo que B. En cambio el responsable de un centro de cálculo entenderá que A es mejor que B si es capaz de ejecutar mayor número de trabajos por unidad de tiempo. El primero estará interesado en el tiempo de respuesta (response time) del procesador mientras que el segundo lo estará en la productividad (throughput). Pero en ambos casos la clave es el tiempo: el procesador que realiza la misma cantidad de trabajo en el menor tiempo posible será el más rápido, la diferencia estriba en si medimos una tarea (tiempo de respuesta) o muchas (productividad). El patrón de medida más significativo es el conjunto de programas reales que se ejecutan en los procesadores. Sin embargo aquí surge de nuevo y con más intensidad la diversidad de puntos de vista. En efecto, el usuario de un editor de texto querrá medir el rendimiento de un procesador respecto a la eficiencia para ejecutar su programa, que posiblemente no coincida con el punto de vista del usuario de un programa de diseño gráfico. Fijar de la forma más objetiva posible los patrones o programas respecto a los cuales se mida el rendimiento de un procesador será pues una tarea polémica y siempre cuestionada por la comunidad de interesados en los resultados de la medida. 1.1 Tiempo de ejecución El tiempo que tarda un programa en ser ejecutado por un computador puede ser difícil de medir, debido a los Sistemas Operativos Multitarea y a los dispositivos de E/S, que tienen tiempos de respuesta que son independientes de la frecuencia de reloj del ordenador. Por ello es necesario diferenciar entre el tiempo que tarda una CPU en ejecutar el código de un programa, el tiempo que utiliza el S.O. para realizar sus tareas, y el tiempo necesario para acceder a los dispositivos de E/S. El tiempo de ejecución de un programa lo dividiremos en las siguientes componentes: • Tiempo de respuesta • Tiempo de CPU A su vez, el tiempo de CPU lo dividimos en: • Tiempo de CPU utilizado por el usuario. • Tiempo de CPU utilizado por el S.O.
Tiempo de respuesta Es el tiempo necesario para completar una tarea, incluyendo los accesos al disco, a la memoria, las actividades de E/S y los gastos del S.O. Es el tiempo que percibe el usuario.
Tiempo de CPU Es el tiempo que tarda en ejecutarse un programa, sin tener en cuenta el tiempo de espera debido a la E/S o el tiempo utilizado para ejecutar otros programas. Se divide en:
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tiempo de CPU utilizado por el usuario. Es el tiempo que la CPU utiliza para ejecutar el programa del usuario. No se tiene en cuenta el tiempo de espera debido a la E/S o el tiempo utilizado para ejecutar otros programas
Tiempo de CPU utilizado por el S.O. Es el tiempo que el S.O. emplea para realizar su gestión interna.
La función time de Unix produce una salida de la forma: 90.7u 12.9s 2:39 65%, donde: • Tiempo de CPU del usuario = 90.7 segundos • Tiempo de CPU utilizado por el sistema = 12.9 segundos • Tiempo de CPU= 90.7 seg.+ 12.9seg = 103.6 • Tiempo de respuesta = 2 minutos 39 segundos =159 segundos • Tiempo de CPU = 65% del tiempo de respuesta = 159 segundos*0.65 = 103.6 • Tiempo esperando operaciones de E/S y/o el tiempo ejecutando otras tareas 35% del tiempo de respuesta = 159 segundos*0.35 = 55.6 segundos El tiempo de respuesta se utiliza como medida del rendimiento del sistema (con el sistema no cargado), mientras que el rendimiento de la CPU normalmente hace referencia al tiempo de CPU del usuario sobre un sistema no cargado. El tiempo de CPU de un programa podemos expresarlo como: Tiempo_de_CPU = Número_de_ciclos_de_reloj_de_la_ CPU • Tc donde Tc = Duración_del_ciclo_de_reloj
Tiempo _ de _ CPU =
Número _ de _ ciclos _ de _ reloj _ de _ la _ CPU Fc
donde Fc = Frecuencia_de_reloj = 1/Tc Además del número de ciclos de reloj que necesita la ejecución de un programa, también se puede medir el número de instrucciones NI ejecutadas, y podremos calcular el número medio de Ciclos de reloj Por Instrucción o CPI como: CPI =
Número _ de _ ciclos _ de _ reloj _ de _ la _ CPU NI
por lo que el tiempo de CPU podemos expresarlo como: Tiempo_de_CPU = NI • CPI • Tc. o bien: Tiempo _ de _ CPU =
NI • CPI Fc
•
NI: depende del compilador y la arquitectura utilizada, y se expresa en instrucciones/programa
•
CPI: depende de la arquitectura y estructura (organización) de la máquina, y se expresa en ciclos de reloj/instrucción
•
Tc: Depende de la estructura y la tecnología de la máquina, y se expresa en segundos/ciclo de reloj
En determinadas situaciones de diseño puede ser útil calcular el número total de ciclos de reloj de la CPU como:
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
n
Número_de_ciclos_de_reloj_de_la_CPU =
∑ CPI
i
• NI i
i =1
donde NIi representa el número de veces que el grupo de instrucciones i es ejecutado en un programa, y CPIi representa el número medio de ciclos de reloj para el conjunto de instrucciones i. El tiempo de CPU se evalúa en este caso mediante una de las 2 siguientes expresiones:
⎛
n
∑ CPI ⎝
Tiempo_de_CPU = ⎜
i =1
i
⎞ • NI i ⎟ • Tc ⎠
⎛ n ⎞ ⎜⎜ ∑ CPI i • NI i ⎟⎟ ⎝ i =1 ⎠ Tiempo _ de _ CPU = Fc El número medio de ciclos por instrucción vendrá dado por: ⎞ ⎛ n ⎜⎜ ∑ CPI i • NI i ⎟⎟ NI ⎠ n ⎝ i =1 = ∑ (CPI i • i ) CPI = NI NI i =1 Esta última expresión calcula el CPI multiplicando cada CPIi individual por la fracción de ocurrencias de las instrucciones i en el programa. CPIi debe ser medido, y no calculado a partir de la tabla del manual de referencia, ya que se deben incluir los fallos de cache y otras ineficiencias del sistema de memoria.
Ejemplo Se consideran 2 alternativas para implementar el salto condicional en un procesador: CPU A: Una instrucción de comparación genera el código de condición, y una de salto bifurca en función del valor de código generado. CPU B: Una única instrucción de salto que incluye la comparación. En ambos casos la instrucción de salto consume 2 ciclos de reloj, las demás instrucciones consumen 1 ciclo. Se ignoran las pérdidas debidas al sistema de memoria. En la CPU A, el 20% de las instrucciones ejecutadas son saltos condicionales, y como en esta CPU cada salto es precedido por una comparación, otro 20% de las instrucciones ejecutadas son comparaciones. Debido a que la CPU A no incluye la comparación en el salto, su ciclo de reloj es un 25% más rápido que el de la CPU B. Bajo estas condiciones ¿Qué CPU es más rápida?
Solución Com pa r a cion es Sa lt os
CP U A 20 %
CP U B 20 %
20 % 100
Ot r a s in st r u ccion es
60 %
80
60 %
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tc_B/ Tc_A = 1.25 ==>
Tc_B = 1.25 • Tc_A
NI_B = 0.8 • NI_A Tiempo de CPU_A = NI_A • CPI_A • Tc_A Tiempo de CPU_B = NI_B • CPI_B • Tc_B Tiempo de CPU_B = (0. 8 • NI_A ) • CPI_B• ( 1.25 • Tc_ A ) Tiempo de CPU_B = (0.8 • 1.25) • NI_A * CPI_B • Tc_A. CPI_A = (NI_salto_A /NI_A) •CPI_salto + (NI_resto_A/NI_A) •CPI_resto = (20/100) •2 + (80/100)•1 = 0.2 • 2 + 0.8 • 1 = 1.2 CPI_B = (NI_salto_B /NI_B) •CPI_salto + (NI_resto_B/NI_B) •CPI_resto = (20/80) •2 + (60/80)•1 = 0.25•2 + 0.75•1 = 1.25 Luego la alternativa de diseño correspondiente a la CPU A sería más rápida. La ganancia de velocidad de la alternativa A sobre la B valdrá: Tiempo de CPU_A = 1.2 • NI_A • Tc_A. Tiempo de CPU_B = 1.25 • NI_A • Tc_A Tiempo de CPU_B 1.25 = = 1.0416 Tiempo de CPU_A 1.2
1.2 Otros parámetros de rendimiento
MIPS (Millones de Instrucciones Por Segundo) NI
MIPS =
Tiempo _de _ejecución 10 Tiempo _ de _ ejecución =
6
=
1 6
CPI * 10 * Tc
=
Fc CPI * 10 6
NI MIPS * 10 6
•
Los MIPS dependen del repertorio de instrucciones, por lo que resulta un parámetro difícil de utilizar para comparar máquinas con diferente repertorio
•
Varían entre programas ejecutados en el mismo computador
•
Pueden variar inversamente al rendimiento, como ocurre en máquinas con hardware especial para punto flotante, que emplean menor tiempo que las que no disponen de este hardware y por tanto tienen mejor rendimiento. Sin embargo presentan un menor valor de los MIPS porque ejecutan menor número de instrucciones
En definitiva, los MIPS pueden fallar al dar una medida del rendimiento, puesto que no reflejan el tiempo de ejecución. Por esta razón se han venido utilizando los MIPS relativos, que miden cuantas veces más tarda en ejecutarse un programa en la máquina a medir que en una de referencia, que por definición tiene un MIPS (VAX11/780): MIPS relativos =
Tiempo de ejecución en la máquina de referencia • MIPS refeerencia Tiempo de ejecución en la máquina a medir
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
MIPSrefeerencia = 1 (MIPS del VAX-11/780)
MFLOPS (Millones de operaciones en punto FLOtante Por Segundo)
MFLOPS = •
Número de operaciones en coma flotante de un programa Tiempo de ejecución • 10 6
Existen operaciones en coma flotante rápidas (como la suma) o lentas (como la división), por lo que puede resultar una medida poco significativa. Por ello se han utilizado los MFLOPS normalizados, que dan distinto peso a las diferentes operaciones. Por ejemplo: suma, resta, comparación y multiplicación se les da peso 1; división y raíz cuadrada peso 4; y exponenciación, trigonométricas, etc. peso 8:
Productividad (throughput) Número de tareas ejecutadas en la unidad de tiempo
1.3 Ganancia de velocidad (speedup): Ley de Amdahl Para calcular el aumento de rendimiento que puede obtenerse al mejorar alguna parte de un computador se utiliza la Ley de Amdahl: La mejora obtenida en el rendimiento global de un computador al utilizar algún modo de ejecución más rápido está limitada por la fracción de tiempo que se puede utilizar ese modo más rápido. La ganancia de velocidad global de un sistema se define por el siguiente cociente: gv global =
Tiempo _ de _ ejecución _ sin _ mejora( Tsin ) Tiempo _ de _ ejecución _ con _ mejora( Tcon )
Si llamamos fm a la fracción de tiempo que puede utilizarse el modo de ejecución más rápido, es decir, introduciendo una mejora, y gvmejora la ganancia de velocidad propia del elemento o modo mejorado, la ganancia de velocidad global del sistema vendrá dada por la siguiente expresión:
(1 - fm) * Tsin Tcon = (1 - fm) * Tsin + fm * Tsin / gvmejora Tsin
tiempo en que se puede utilizar la mejora
fm * Tsin / gvmejora fm * Tsin tiempo ahorrado en la mejora
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
gvglobal =
Tsin Tsin 1 = = Tcon ( 1 − f )* Tsin + f m * Tsin ( 1 − fm ) + f m m gvmejora gvmejora
Esta expresión recoge la forma cuantitativa de la ley de Amdahl. Si obtenemos el límite cuando la ganancia de velocidad del modo mejorado tiende a infinito, es decir, suponemos que el modo mejora infinitamente, obtenemos lo siguiente: 1 lim _ gv global = 1− fm
gv mejora → ∞ Es decir, que la ganancia de velocidad global se mantiene limitada por una expresión de la fracción fm gvglobal
1/(1-fm) gvmejora
Ejemplo Un disco magnético 10 veces más rápido que en la máquina original. El disco se utiliza sólo el 40% del tiempo de ejecución. ¿Cual es la ganancia de velocidad global?
fr=0.4 gvmejora = 10
CPU gvglobal
gvmejora = 10; fm = 0.4 ==> gvglobal = lim gvglobal =
1 (1 − 0.4)
1 (1 − 0.4) +
0.4 10
=
1 = 1.56 0.64
= 1.666 (máxima ganancia para velocidad del disco infinita)
gvmejora --> ∞
1.4 Rendimiento medio armónico Sean P1, P2, ..., Pi,...Pm un conjunto de programas que representan modos de funcionamiento de una carga de trabajo. Por ejemplo, P1, puede representar el modo de funcionamiento entero, P2 el modo real, etc. las velocidades de ejecución en instrucciones/segundo de los programas anteriores, y t1, Sean r1, r2, ..., ri,... rm t2, ... , ti,... tm los tiempos de ejecución medios por instrucción en segundos/instrucción: ti = 1/ri Se definen los siguientes parámetros: Tiempo de ejecución medio aritmético 1 m 1 m 1 Ta = ∑ t i = ∑ m i =1 m i =1 ri
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Velocidad de ejecución media armónica 1 m Rh = = m Ta 1 ∑r i =1 i Tiempo de ejecución medio ponderado m f Ta* = ∑ i con f1, f2, ... fi, ...fm los pesos de los programas P1, P2, ..., Pi,...Pm; i =1 ri
m
∑ fi = 1 i =1
Velocidad de ejecución media armónica ponderada 1 1 R*h = * = m f Ta ∑ ri i =1 i
Velocidad de ejecución media aritmética 1 m R a = ∑ ri m i =1 Velocidad de ejecución media aritmética ponderada m
R a = ∑ f i * ri i =1
Problema cuando se promedian velocidades en lugar de tiempos P1 ejecuta 10.000 instrucciones en 5 segundos => r1 = 2.000 instrucciones/segundo P2 ejecuta 10.000 instrucciones en 2 segundos => r2 = 5.000 instrucciones/segundo P1
P2
10.000 instruciones
10.000 instrucciones
5 segundos 2 segundos Velocidad de ejecución media aritmética Ra = (2.000 + 5.000)/2 = 3.500 instrucciones/segundo Si con esta velocidad media calculamos las instrucciones ejecutadas en 7 segundos = 3.500 * 7 = 24.500 instrucciones ≠ 20.000
Ta = 1/2(5/10.000 + 2/10.000) = 7/20.000 => Rh = 1/Ta =20.000/7 =2.857,14 Si con esta velocidad media armónica calculamos las instrucciones ejecutadas en 7 segundos = 2.857,14 * 7 = 20.000
Ejemplo Se ejecutan 4 programas P1, P2, P3, P4 (que representan 4 modos de ejecución de un programa general) sobre 3 computadores A, B y C. Por cada programa se ejecutan 108 instrucciones, resultando los siguientes tiempos en segundos: Tiempo de ejecución (seg) Programa P1 P2 P3 P4
A 1 10.000 500 100
Computador B 10 100 1000 800
C 20 20 50 100
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
¿Cuál es el computador más rápido? Los MIPS da cada procesador para cada programa valdrán: MIPS Programa P1 P2 P3 P4
Ta =
1 m
m
∑
ti =
i =1
1 m
m
A 100 0,1 0,2 1
Computador B 10 1 0,1 0,125
C 5 5 2 1
∑r i =1
1 i
Tiempos de ejecución medios aritméticos Ta(A) = 1/4*(1/100+1/0,1+1/0,2+1) Ta(B) = 1/4*(1/10+1+1/0,1+1/0,125) Ta(C) = 1/4*(1/5+1/5+1/2+1)
= 16,01/4 = 4,002 = 19,1/4 = 4,775 = 1,9/4 = 0,475
Velocidades de ejecución medias armónicas Rh(A) = 1/ Ta (A) = 0,25 Rh(B) = 1/ Ta (B) = 0,21 Rh(C) = 1/ Ta (C) = 2,12 Luego el mejor computador (más rápido) es C, seguido de A, y seguido de B
Velocidad de ejecución media geométrica m
R g = ∏ Ri1 / m i =1
Velocidad de ejecución media geométrica ponderada m
R g* = ∏ Ri f i i =1
Se utiliza con medidas de rendimiento normalizadas con respecto a una máquina de referencia.
1.5 Patrones de medida (Benchmarks) Para evaluar el rendimiento de un computador podemos utilizar diferentes técnicas: • Modelos analíticos (matemáticos) de la máquina • Modelos de simulación (algorítmicos) de la máquina • La máquina real Las dos primeras alternativas se utilizan cuando la máquina no está disponible. Los modelos analíticos tienen limitado su ámbito de utilización por la dificultad de expresar en forma de ecuaciones matemáticas el comportamiento detallado de la máquina y su carga de trabajo. Se utilizan en fases muy tempranas de diseño para realizar estimaciones generales del rendimiento.
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Los modelos de simulación pueden construirse con mayor precisión, recogiendo especificaciones detalladas de diseño. Sin embargo, estos modelos requieren una gran capacidad computacional cuando se incorporan todos los componentes básicos de la máquina. En la tercera alternativa es la máquina o máquinas reales las que se evalúan con el fin de disponer de algún criterio de elección. En este caso (y posiblemente en algunos modelos de simulación) será necesario disponer de un conjunto de programas representativos de la carga real de trabajo que vaya a tener la máquina, y con respecto a los cuales se realicen las medidas. Estos programas patrones se denominan benchmarks, y serán el objeto de estudio de este apartado. Podemos utilizar diferentes criterios no excluyentes a la hora de clasificar los benchmarks que se utilizan en la actualidad para evaluar los computadores. Comenzaremos con una clasificación general en función del ámbito de aplicación que representan, es decir, el tipo de recursos computacionales que mayoritariamente intervienen en la evaluación. En este sentido los clasificaremos en:
•
Enteros: aplicaciones en las que domina la aritmética entera, incluyendo procedimientos de búsqueda, operaciones lógicas, etc. Por ejemplo, SPECint2000.
•
Punto flotante: aplicaciones intensivas en cálculo numérico con reales. Por ejemplo, SPECfp2000 y LINPACK.
•
Transacciones: aplicaciones en las que dominan las transacciones on-line y off-line sobre bases de datos. Por ejemplo, TPC-C.
En segundo lugar los agruparemos por la naturaleza del programa que implementan:
•
Programas reales: Compiladores, procesadores de texto, etc. Permiten diferentes opciones de ejecución. Con ellos se obtienen las medidas más precisas
•
Núcleos (Kernels): Trozos de programas reales. Adecuados para analizar rendimientos específicos de las características de una determinada máquina: Linpack, Livermore Loops
•
Patrones conjunto (benchmarks suits) Conjunto de programas que miden los diferentes modos de funcionamiento de una máquina: SPEC y TPC.
•
Patrones reducidos (toy benchmarks): Programas reducidos (10-100 líneas de código) y de resultado conocido. Son fáciles de introducir y ejecutar en cualquier máquina (Quicksort,...)
•
Patrones sintéticos (synthetic benchmarks): Código artificial no perteneciente a ningún programa de usuario y que se utiliza para determinar perfiles de ejecución. (Whetstone, Dhrystone)
A continuación estudiaremos con algún detalle tres de los benchmarks con mayor difusión.
LINPACK Es una colección de subrutinas Fortran que analizan y resuelven ecuaciones lineales y problemas de mínimos cuadrados. Los sistemas de ecuaciones lineales que contempla utilizan diferentes formas de las matrices: generales, en banda, simétricas, triangulares etc. Se diseñó para medir el rendimiento en supercomputadores a finales de los 70 y principio de los 80 (Dongarra). Lo componen las siguientes subrutinas:
matrices generales matrices en banda matrices definidas positivas matrices en banda definidas positivas
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
matrices indefinidas simétricas matrices triangulares matrices tridiagonales descomposición de Cholesky descomposición QR actualización de las descomposiciones QR y Cholesky descomposición valores singulares
La tabla siguiente muestra los resultados de este benchmark para algunos computadores corriendo bajo un sistema operativo y utilizando un compilador concreto. La primera columna numérica presenta el resultado en Mflops/segundo, es decir, en millones de operaciones en punto flotante por segundo para una matriz de orden 100. La segunda para una matriz de orden 1000, y la tercera presenta el rendimiento de pico de la máquina. Para resolver un sistema de n ecuaciones se realizan 2/3n3 + 2n2 ( se cuentan tanto las sumas y as multiplicaciones) . Computador Cray T916 (8 proc. 2.2 ns) Cray T916 (4 proc. 2.2 ns) Cray T916 (2 proc. 2.2 ns) Cray T916 (1 proc. 2.2 ns) Cray C90 (16 proc. 4.2 ns) Cray C90 (8 proc. 4.2 ns) Cray 3-128 (4 proc. 2.11 ns) Hitachi S-3800/480(4 proc 2 ns) Hitachi S-3800/380(3 proc 2 ns) Hitachi S-3800/280(2 proc 2 Hitachi S-3800/180(1 proc 2 ns) Cray 3-128 (2 proc. 2.11 ns) Cray C90 (4 proc. 4.2 ns) Cray C90 (2 proc. 4.2 ns) Cray C90 (1 proc. 4.2 ns) NEC SX-3/44R (4 proc. 2.5 ns) NEC SX-3/42R (4 proc. 2.5 ns) NEC SX-3/41R (4 proc. 2.5 ns) NEC SX-3/34R (3 proc. 2.5 ns) NEC SX-3/32R (3 proc. 2.5 ns) NEC SX-3/31R (3 proc. 2.5 ns) NEC SX-3/24R (2 proc. 2.5 ns) NEC SX-3/22R (2 proc. 2.5 ns) NEC SX-3/21R (2 proc. 2.5 ns) NEC SX-3/14R (1 proc. 2.5 ns) NEC SX-3/12R (1 proc. 2.5 ns) Cray 3-128 (1 proc. 2.11 ns) NEC SX-3/44 (4 proc. 2.9 ns) NEC SX-3/24 (2 proc. 2.9 ns) NEC SX-3/42 (4 proc. 2.9 ns) NEC SX-3/22 (2 proc. 2.9 ns) NEC SX-3/14 (1 proc. 2.9 ns) NEC SX-3/12 (1 proc. 2.9 ns): Cray Y-MP/832 (8 proc. 6 ns) Fujitsu VP2600/10 (3.2 ns) Cray Y-MP/832 (4 proc. 6 ns) Fujitsu VPP500/1(1 proc. 10 ns) Cray Y-MP M98 (8 proc. 6 ns) Fujitsu VP2200/10 (3.2 ns) Cray 2S/4-128 (4 proc. 4.1 ns
OS/Compilador cf77 cf77 cf77 cf77 CF77 CF77 CSOS
(6.0) -Zp -Wd-68 (6.0) -Zp -Wd-68 (6.0) -Zp -Wd-68 (6.0) -Zp -Wd-68 5.0 -Zp -Wd-e68 5.0 -Zp -Wd-e68 1.0 level 129
OSF/1 MJ CSOS 1.0 CF77 5.0 CF77 5.0 CF77 5.0
FORTRAN:V03-00 level 129 -Zp -Wd-e68 -Zp -Wd-e68 -Zp -Wd-e68
N=100 Mflops/s
522 479 468 421
408 393 388 387 387
f77sx 040 R2.2 -pi*:* f77sx 040 R2.2 -pi*:* CSOS 1.0 level 129
368 368 327
f77sx 020 R1.13 -pi*:* f77sx 020 R1.13 -pi*:* CF77 4.0 -Zp -Wd-e68 FORTRAN77 EX/VP V11L10 CF77 4.0 -Zp -Wd-e68 FORTRAN77EX/VP V12L20 CF77 5.0 -Zp -Wd-e68 FORTRAN77 EX/VP V12L10 CSOS 1.0 level 129
314 313 275 249 226 206 204 203 202
N=1000 Mflops/s 10800 5711 2943 1576 10780 6175 2862 20640 16880 12190 6431 1622 3275 1703 902 15120 8950 4815 12730 6718 3638 9454 5116 2627 5199 2757 876 13420 8149 7752 4404 4511 2283 2144 4009 1159 1490 1733 1048 1406
Peak Mflops/s 14400 7200 3600 1800 15238 7619 3792 32000 24000 16000 8000 1896 3810 1905 952 25600 12800 6400 19200 9600 4800 12800 6400 3200 6400 3200 948 22000 11000 11000 5500 5500 2750 2667 5000 1333 1600 2666 1250 1951
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
SPEC: (System Performance and Evaluation Cooperative) SPEC es una sociedad sin ánimo de lucro cuya misión es establecer, mantener y distribuir un conjunto estandarizado de benchmarks que se pueden aplicar a las últimas generaciones de procesadores. Se han sucedido ya 4 generaciones de benchmarks: SPEC89, SPEC92, SPEC95 y SPEC2000. En lo que sigue nos limitaremos a la última, que es la única en vigor.
SPEC2000 SPEC CPU2000 Los diseña el OSG (Open Systema Group) de SPEC que es el encargado de los benchmarks de componentes y sistemas. En este apartado se encuentran los SPECint2000 y SPECfp2000, representativos de las aplicaciones enteras y reales (punto flotante). Dentro de SPEC existen otros dos grupos HPG (High Performance Group) y GPCG (Graphics Performance Caracterization Group). La máquina de referencia de los SPEC CPU2000 es la UltraSPARC10 con un procesador UltraSPARC IIi, a 300 MHz y 256 MB de memoria. Esto significa que todos los resultados se calculan como ratios frente a la máquina de referencia, que por definición tiene SPECint2000 = 100, y SPECfp2000 = 100.
SPECint2000 Lo integran los siguientes programas:
gzip: programa de compresión de datos que utiliza el algoritmo de Lempel-Ziv (LZ77).
vpr(versatil place and route): implementa los procesos de ubicación (placement) y conexionado (routing) de un circuito digital sobre bloques lógicos de FPGAs. Pertenece a la clase de programas de optimización combinatoria. Utiliza simulated annealing como procedimiento de optimización.
gcc: compilador de C que genera código para el procesdor Motorola 88100.
mcf: Programa de planificación temporal (scheduling) de transporte público que utiliza el código MFC del método simplex de red (versión especializada del algoritmo simplex de programación lineal).
crafty: programa de juego de ajedrez por computador con un número significativo de operaciones enteras y lógicas tales como AND, OR, XOR y desplazamientos.
parser: analizador sintáctico de inglés basado en gramáticas de enlace (link grammar) con un diccionario de mas de 60.000 palabras.
eon: trazador de rayos (ray tracer) que transmite un número de líneas 3D (rayos) sobre un modelo poligonal 3D, calcula la intersección entre las líneas y los polígonos, y genera nuevas líneas para calcular la luz incidente en los puntos de intersección. El resultado final es una imagen vista por cámara.
perlbmk: versión del lenguaje de script Perl en el que se han eliminado las características específicas del SO.
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
gap: implementa un lenguaje diseñado para computar en grupos (GAP: Groups, Algorithm and Programming).
vortex: procede de un OODBMS (sistema de gestión de bases de datos orientado a objetos) que se ha adaptado para conformarlo a las exigencias de SPEC2000.
bzip2: basado en la versión 0.1 de bzipb.
twolf: paquete de ubicación (placement) y conexionado (routing) en el proceso de diseño de circuitos integrados basados en celdas standard. Utiliza el algoritmo de simulated annealing.
SPECffp2000 Lo integran los siguientes programas:
wupwise: cromodinámica cuántica
swim: modelado del agua superficial
mgrid: resolutor multi-malla: campo potencial 3D
applu: ecuaciones diferenciales parciales elípticas/parabólicas
mesa: librería gráfica 3D
galgel: dinámica de fluidos
art: reconocimiento de imágenes/redes neuronales
equake: simulación de propagación de ondas sísmicas
facerec: procesamiento de imagen: reconocimiento del rostro
ammp: química computacional
lucas: teoría de números/prueba de números primos
fma3d: simulación de choques por elementos finitos
sixtrack: diseño de aceleradores de física nuclear de alta energía
apsi: meteorología: distribución de contaminantes
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tiempo en una UltraSPARC10 con procesador UltraSPARCIIi, 300 MHz y 256 MB de memoria = 100 SPECint2000
CINT2000 Result
Copyright © 1999-2002 Standard Performance Evaluation Corporation
Intel Corporation Intel D850MD motherboard (2.0A GHz, Pentium 4 processor) SPEC license # 13
Benchmark
Tested by: Intel Corporation Reference Time
Base Runtime
Base Ratio
Test date: Nov-2001
Runtime
1400
184
762
182
767
175.vpr
1400
316
443
315
444
176.gcc
1100
128
862
128
861
181.mcf
1800
326
552
326
553
186.crafty
1000
147
681
146
686
197.parser
1800
249
723
250
721
252.eon
1300
142
917
122
1066
253.perlbmk
1800
209
860
209
860
254.gap
1100
116
944
116
945
255.vortex
1900
162
1171
159
1192
256.bzip2
1500
259
580
254
591
300.twolf
3000
596
503
594
505
CPU: CPU MHz: FPU: CPU(s) enabled: CPU(s) orderable: Parallel: Primary Cache: Secondary Cache: L3 Cache: Other Cache: Memory: Disk Subsystem: Other Hardware:
Software Avail: Oct-2001
722 SPECint2000
Vendor: Model Name:
Hardware Avail: Jan-2002
Ratio
164.gzip
SPECint_base2000
SPECint2000 = 735 SPECint_base2000 =722
735
Intel Corporation Intel D850MD motherboard (2.0A GHz, Pentium 4 processor) Pentium 4 processor (2.0A GHz, 400 MHz bus) 2000 Integrated 1 1 No 12k micro-ops I + 8KBD on chip 512KB(I+D) on chip N/A N/A 256 MB (2 128 MB PC800 RDRAM nonECC modules) IBM DTLA-307030 ATA-100 None
Operating System: Compiler:
File System: System State:
Software Windows XP Professional(Build 2600) Intel C++ Compiler 5.0.1 Build 010525Z Microsoft Visual C++ 6.0 SP5(for libraries) FAT32 Default
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CINT2000 Result Copyright © 1999-2000 Standard Performance Evaluation Corporation
Intel Corporation Intel VC820 (1.0 GHz Pentium III) SPEC license # 13
Benchmark
Tested by: Intel Corporation
Reference Time
Base Runtime
Base Ratio
SPECint2000 = 410 SPECint_base2000 =407
Test date: Mar-2000
Runtime
1400
288
486
287
488
175.vpr
1400
426
329
426
329
176.gcc
1100
297
371
295
373
181.mcf
1800
710
254
710
254
186.crafty
1000
200
499
200
499
197.parser
1800
523
344
523
344
252.eon
1300
320
406
320
406
253.perlbmk
1800
312
576
313
576
254.gap
1100
290
379
289
381
255.vortex
1900
272
697
266
714
256.bzip2
1500
413
363
398
377
300.twolf
3000
844
355
820
366
407 SPECint2000
Hardware Vendor: Model Name: CPU: CPU MHz: FPU: CPU(s) enabled: CPU(s) orderable: Parallel: Primary Cache: Secondary Cache: L3 Cache: Other Cache: Memory: Disk Subsystem: Other Hardware:
Software Avail:
Ratio
164.gzip
SPECint_base2000
Hardware Avail: Mar-2000
Intel Corporation Intel VC820 (1.0 GHz Pentium III) 1.0 GHz Pentium III processor 1.0 GHz Integrated 1 1 No 16KBI + 16KBD on-die 256KB(I+D) on-die ECC N/A N/A 256 MB PC800 RDRAM non-ECC IBM DJNA 371800 ATA-66 Diamond Multimedia Viper 770 Ultra TNT2 AGP
410
Operating System: Compiler:
File System: System State:
Software Windows 2000 (Build 2195) Intel C Compiler 4.5 for Windows 2000 Microsoft Visual C++ 6.0 C libraries, SmartHeap library FAT32 Default
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CFP2000 Result Copyright © 1999-2002 Standard Performance Evaluation Corporation Intel Corporation Intel D850EMV2 motherboard (2.0A GHz, Pentium 4 processor) SPEC license # 13
Tested by: Intel Corporation Reference Time
Benchmark
Base Runtime
Base Ratio
SPECfp2000 = SPECfp_base2000 =
Test date: May-2002
Runtime
1600
168
952
167
957
171.swim
3100
235
1317
233
1333
172.mgrid
1800
246
730
245
736
173.applu
2100
263
798
258
815
177.mesa
1400
183
767
182
769
178.galgel
2900
268
1084
265
1094
179.art
2600
489
532
484
538
183.equake
1300
144
905
137
950
187.facerec
1900
201
947
200
951
188.ammp
2200
434
507
431
511
189.lucas
2000
189
1057
189
1057
191.fma3d
2100
282
746
281
746
200.sixtrack
1100
302
365
293
376
301.apsi
2600
454
572
454
573
764 SPECfp2000
Model Name: CPU: CPU MHz: FPU: CPU(s) enabled: CPU(s) orderable: Parallel: Primary Cache: Secondary Cache: L3 Cache: Other Cache: Memory: Disk Subsystem:
Software Avail: Apr-2002
Ratio
168.wupwise
SPECfp_base2000
Hardware Avail: May-2002
773 764
773
Intel Corporation Intel D850EMV2 motherboard (2.0A GHz, Pentium 4 processor) Pentium 4 processor (2.0A GHz, 400 MHz bus) 2000 Integrated 1 1 No 12k micro-ops I + 8KBD on chip 512KB(I+D) on chip N/A N/A 256 MB (2 128 MB PC800-40 RDRAM non-ECC modules) IBM 120GXP 80 GB IC35L080AVVA07-0 ATA-100
Operating System: Compiler:
File System: System State:
Software Windows XP Professional(Build 2600) Intel C++ Compiler 6.0 Build 020321Z Intel Fortran Compiler 6.0 Build 020321Z Microsoft Visual C++ 6.0 SP5(for libraries) FAT32 Default
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La siguiente gráfica muestra la evolución de los procesadores en los últimos años caracterizados por su valor de SPECint con referencia en el VAX 11/780
TPC (Transaction Processing Performance Council) TPC es un consorcio de 47 fabricantes de software y hardware entre los que se encuentran Compaq, Digital, IBM, NCR, Sun, Informix, Intel, Microsoft y Oracle dedicado al diseño de benchmarks para la medida de rendimiento de los sistemas informáticos. Estos benchmarks analizan la mayoría de los aspectos del sistema en relación con el procesamiento de transacciones, es decir, accesos de consulta y actualización a bases de datos. Tiene el inconveniente de la cantidad de tiempo que requieren las pruebas (meses) haciendo que su coste sea elevado (millones de pesetas). Los benchmarks TPC-A , TPC-B y TPC-C ya están en desuso. TPC-D fue sustituido en abril de 1999 por TPC-H y TPC-R.
TPC-H: es un benchmark de soporte a la decisión. Consta de un conjunto preguntas (queries) específicas, orientadas a la actividad comercial.
TPC-R: es similar a TPC-H pero permite optimizaciones adicionales basadas en el conocimiento de las preguntas.
Además, TPC ha introducido un benchmark para medir las transacciones en la WEB:
TPC-W: La carga de trabajo se configura en un entorno de comercio que simula las actividades de un servidor de WEB orientado a las transacciones comerciales.
Estudiaremos con más detalle en los siguientes parágrafos los actuales TPC-R y TPC-H.
TPC-R y TPC-H Los benchmarks TPC-R y TPC-H fueron introducidos para sustituir al TPC-D como estándar industrial para aplicaciones comerciales. Los dos son muy similares ya que modelan la misma aplicación comercial (base de datos, preguntas y funciones de refresco). Se diferencian en las reglas de implementación , ya que mientras TPCH limita el uso de índices y esquemas de particiones, TPC-R no limita el uso de estas estructuras en la base de datos.
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Base de Datos La base de datos de TPC-H y TPC-R utiliza un esquema en la 3ª forma normal y responde al diagrama relaciónentidad de la siguiente figura (8 tablas): part
partsupp
supplier
customer
nation
lineitem
orders
region
TPC dispone de un generador de datos para todas las tablas de la base dependiendo del factor de escala SF. El factor de escala determina el tamaño de los datos de la base, por ejemplo, SF=100 significa que la suma de todas las tablas de la base es igual a 100 GB. Las dos tablas mayores son lineitem y orders que contienen el 83% de los datos. El tamaño de todas las tablas excepto nation y region tienen un tamaño proporcional al factor de escala.
Carga de Trabajo Las cargas de trabajo para ambos benchmarks constan de los siguientes componentes: • • •
Construcción de la base de datos Ejecución de 22 preguntas de solo-lectura en modo monousuario y multiusuario Ejecución de 2 funciones de refresco.
La construcción de la base de datos incluye todos los tiempos de respuesta para crear las tablas, cargar los datos, crear índices, definir y validar restricciones, etc. Las 22 preguntas están definidas en SQL-92 como plantillas (templates), por lo que antes de ser ejecutada sobre la base de datos se tiene que realizar la sustitución de parámetros. Se han elegido para mostrar la capacidad del sistema utilizando todos los recursos en contextos monousuario y multiusuario. Las dos funciones de refresco (RF1 y RF2) modelan la carga de nueva información (RF1) y la eliminación de información obsoleta (RF2). RF1 inserta nuevas filas en la tabla lineitem y orders, mientras que RF2 elimina el mismo número de filas de las mismas tablas.
Métrica de rendimiento La principal métrica de rendimiento de TPC es la métrica de rendimiento compuesta (QphH/QphR). Para calcular la métrica compuesta de un sistema para un factor de escala dado, hay que ejecutar un test de potencia seguido por un test de capacidad de procesamiento (throughput). Después se combinan los resultados de ambos tests para calcular la métrica compuesta.
En un test de potencia se ejecuta la función de refresco RF1, seguida por la ejecución de las 22 preguntas en modo de único usuario, y por la ejecución de la función de refresco RF2. En el test de capacidad se ejecutan las 22 preguntas (flujos de preguntas Si) en orden predefinido en múltiples sesiones concurrentes. Además en una sesión separada se ejecuta secuencialmente un par de actualizaciones (RF1, RF2) por cada flujo de preguntas.
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Test de Potencia
tiempo
Test de Capacidad (throughput) S1
Inserción
S2
Sn
RF1
RF1 RF2 Q1 Q2 Q3 . . . Q21 Q22
Flujo de preguntas
....
. . . RF1
Borrado
RF2
RF2
El número mínimo de flujos depende del factor de escala, según la tabla siguiente: Factor de Escala (SF) 1 10 100 300 1000 3000 10000
Flujos (S) 2 3 4 6 7 8 9
Los resultados de los test de potencia y capacidad se utilizan para calcular la potencia de procesamiento (Powre@Size) y la capacidad de procesamiento (Throughput@Size) La potencia de procesamiento se calcula como la media geométrica de los tiempos de respuesta correspondientes a las preguntas y funciones de refresco. La unidad es preguntas/hora. La media geométrica reduce los efectos de las preguntas con tiempos de respuesta muy cortos y muy largos. Para un factor de escala SF dado, la potencia de procesamiento se calcula como:
3600 ∗ SF
Power @ Size = 24
• • • •
i = 22
j =2
i =1
j =1
∏ QI (i,0) * ∏ RI ( j,0)
i=1,2,...22;j=1,2 QI(i,0): tiempo de respuesta en segundos de la query Qi del test de potencia (power) RI(j,0): tiempo de respuesta en segundos de la función de refresco RFj 3600: segundos (= 1 hora)
La capacidad de procesamiento se calcula como la razón del número total de preguntas ejecutadas a lo largo del intervalo de ejecución. La unidad es preguntas/hora. Para un factor de escala SF viene dada por:
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Throughput @ Size = • • • •
S ∗ 22 ∗ 3600 ∗ SF TS
Ts:tiempo de respuesta de la ejecución multi flujo S: número de flujos 3600: segundos (= 1 hora) 22: número de preguntas por flujo
La métrica de rendimiento compuesta (QphH para TPC-H y QphR para TPC-R) se calcula como:
QphH @ Size, QphR @ Size = Power @ Size ∗ Throughput @ Size TPC-H y TPC-R también definen una métrica precio/rendimiento como la división del precio total del sistema por el resultado de la métrica compuesta. 100 GB Results Rank
Company
System
QphH Price/QphH
System Availability
Database
Operating System
Oracle 9iR2 w/Real Application Cluste
HP Tru64 Unix V5.1A/IPK
1
HP AlphaServer 5,578 ES45 Model 68/1000
404 US $
07/15/02
2
IBM eServer x350 with 2,960 DB2 UDB
336 US $
06/20/02
347 US $
3
SGI 1450 Server with DB2 UDB EEE v7.2
2,733
Date Cluster Submitted 07/15/02
Y
IBM DB2 UDB Turbolinux 7 7.2 Servers
02/01/02
Y
10/31/01
IBM DB2 UDB EEE 7.2
Linux 2.4.3
05/11/01
Y
Microsoft Windows .NET Enterprise Server
07/31/02
N
4
HP Proliant 1,933 DL760 X900
89 US $
12/31/02
Microsoft SQL Server 2000 Enterprise Edition
5
ProLiant 80001,699 X700-8P
161 US $
08/01/00
Microsoft SQL 2000
Microsoft Windows 2000
07/21/00
N
Microsoft Windows 2000 Advanced Server
06/26/02
N
6
HP Proliant DL580 G2
1,695
82 US $
06/26/02
Microsoft SQL Server 2000 Enterprise Edition
7
e-@ction Enterprise Server ES5085R
1,669
169 US $
01/31/01
Microsoft SQL Server 2000
Microsoft Windows 2000
12/22/00
N
8
Netfinity 8500R
1,454
200 US $
08/01/00
Microsoft SQL Server 2000
Microsoft Windows 2000
05/23/00
N
ProLiant 80001,308 8P
174 US $
08/01/00
Microsoft SQL 2000
Microsoft Windows 2000
04/05/00
N
195 US $
08/18/00
Microsoft SQL Server 2000
Microsoft Windows 2000
08/18/00
N
9
10
NetServer LXr8500
1,291
19
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
300 GB Results Rank
Company
System
Compaq ProLiant 12,995 DL760 x90064P
1
System Availability
Database
Operating System
199 US $
06/20/02
IBM DB2 UDB 7.2
Microsoft Windows 2000 Advanced Server
04/09/02
Y
QphH Price/QphH
Date Cluster Submitted
2
NUMA-Q 2000
7,334
616 US $
08/15/00
IBM DB2 UDB 7.1
DYNIX/ptx 4.5.1
05/03/00
N
3
Compaq AlphaServer ES45 Model 68/1000
5,976
453 US $
06/01/02
Oracle 9i R2 Enterprise Edition
Compaq Tru64 Unix V5.1A/IPK
05/05/02
Y
4
NUMA-Q 2000
5,923
653 US $
09/05/00
IBM DB2 UDB 7.1
DYNIX/ptx 4.5.1
09/05/00
N
10/17/02
N
Unisys ES7000 Orion 4,774 130 Enterprise Server
5
219 US $
03/31/03
Microsoft Microsoft SQL Server Windows .NET Server 2003 2000 Datacenter Enterprise Edt. Ed. 64-bit
6
NUMA-Q 2000
4,027
652 US $
09/05/00
IBM DB2 UDB 7.1
DYNIX/ptx 4.5.1
09/05/00
N
7
AlphaServer ES40 Model 6/667
2,832
1,058 US $
02/14/01
Informix XPS 8.31 FD1
Compaq Tru64 UNIX V5.1
12/19/00
Y
8
ProLiant 8000-8P
1,506
280 US $
11/17/00
Microsoft SQL Server 2000
Microsoft Windows 2000
11/17/00
N
NetServer LXr 1,402 8500
207 US $
08/18/00
Microsoft SQL Server 2000
Microsoft Windows 2000
08/18/00
N
9
1,000 GB Results Rank
Company
System
QphH Price/QphH
System Availability
Database
Operating Date Cluster System Submitted
10/30/02
Oracle 9i Database Enterprise Edition v9.2.0.2.0
HP UX 11.i 64-bit
06/24/02
N
Microsoft Windows 2000 Advanced Server
02/06/02
Y
1
HP 9000 Superdome 25,805 Enterprise Server
2
Compaq ProLiant 22,361 DL760 X900-128P
255 US $
06/20/02
IBM DB2 UDB 7.2
3
Sun Fire[TM] 18,802 15K server
256 US $
07/17/02
Oracle 9i Database Enterprise Edition
Sun Solaris 8
01/17/02
N
4
WorldMark 18,542 5250
638 US $
07/27/01
Teradata V2R4.1
MP-RAS 3.02.00
10/09/01
Y
5
HP 9000 Superdome 13,160 Enterprise
564 US $
09/05/01
Orcacle9i.9.0.1 Enterprise Edi
HP UX 11.i 64-bit
08/06/01
N
231 US $
20
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
Server 6
IBM RS/6000 SP 12,866 550
649 US $
08/15/00
IBM DB2 UDB 7.1
IBM AIX 4.3.3
06/15/01
Y
7
HP 9000 Superdome 9,754 Enterprise Server
814 US $
02/13/01
Informix Extended Parallel Ser 8.31FD1
HP UX 11.i 64-bit
02/13/01
N
581 US $
10/31/01
IBM DB2 UDB EEE 7.2
Sun Solaris 8
06/11/01
N
Sun Fire 6800
8
4,735
3000 GB Results Rank
Company
System
QphH Price/QphH
System Availability
Database
Operating System
Oracle 9i Database Enterprise Edition v9.2.0.2.0
HP UX 11.i 64-bit
1
HP 9000 Superdome 27,094 Enterprise Server
240 US $
10/30/02
2
Sun Fire[TM] 15K Server 23,813 with Oracle9i R2
237 US $
10/30/02
3
Compaq ProLiant 21,053 DL760 X900-128P
291 US $
4
WorldMark 18,803 5250
989 US $
5
HP 9000 Superdome 17,908 Enterprise Server
6
Sun Starfire Enterprise 10,764 1,250 US $ 10000 with Oracle9i
569 US $
Oracle 9i R2 Enterprise Sun Solaris 9 Edition
Date Cluster Submitted
08/26/02
N
06/26/02
N
06/20/02
IBM DB2 UDB 7.2
Microsoft Windows 2000 Advanced Server
02/06/02
Y
07/27/01
Teradata V2R4.1
MP-RAS 3.02.00
10/09/01
Y
05/15/02
Oracle 9i Database Enterprise Edition
HP UX 11.i 64-bit
12/17/01
N
04/13/01
Y
06/19/01
Oracle9i Database Sun Solaris 8 Ent. Edition 9.0.1
100 GB Results ^ Compan y
System
QphR Price/QphR
PowerEdge 6600/1.6 GHz Xeon 4,452 41 US $ MP
System Availability
Database
Date Submitted
04/04/03
Oracle 9i R2 Enterprise Edition
10/11/02
1,000 GB Results ^ Company
System
QphR
Price/QphR
System Availability
Database
Date Submitted
WorldMark 5200
17,529
737 US $
02/15/00
NCR Teradata V2R3.0
08/23/99
WorldMark 5200
21,254
607 US $
08/31/00
NCR Teradata V2R4.0
03/06/00
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Otros benchmarks
Whetstone: Benchmark sintético representativo de la programación numérica escalar (punto flotante). Está formado por un conjunto de bucles con una alta localidad de referencia, lo que favorece a las cache pequeñas. Utiliza muchas llamadas a librería, lo que posibilita mejorar los resultados optimizando estas librerías. El resultado se expresa en whetstone/segundo, es decir, instrucciones del benchmark/segundo. Se basa en una estadística recogida por Brian Wichmann del National Physical Laboratory de Inglaterra, utilizando un compilador Algo 60 que traducía Algo a instrucciones de la máquina imaginaria Whetstone, una pequeña ciudad a las afueras de Leicester.
Dhrystone: Benchmark sintético que utiliza un juego de palabras relativas a su antecesor whetstone y es representativo de programas generales (enteros) escritos originariamente en Fortran. Reúne operaciones aritméticas de enteros, tratamiento de caracteres y punteros. Está constituido por un bucle de gran tamaño. El resultado se expresa en dhrystone/segundo, es decir, número de ejecuciones del bucle por segundo. En la actualidad está también disponible en ADA, Pascal y C.
2. Influencia en el rendimiento de las alternativas de diseño Revisaremos en este apartado las alternativas de diseño de los repertorios de instrucciones (ISA) estudiadas en los temas anteriores con el objeto de seleccionar aquellas que aportan mayor rendimiento al procesador. En muchos casos las alternativas se contemplan junto con datos reales de su presencia en el código máquina que generan los compiladores para programas reales. El resultado será la caracterización de un repertorio (ISA) que definirá las propiedades generales de los procesadores de tipo RISC. Nosotros proyectaremos estas propiedades sobre un procesador hipotético denominado DLX, que es un compendio de las principales características de los actuales procesadores RISC: MIPS, Power PC, Precision Architecture, SPARC y Alpha.
2.1 Tipo de elementos de memoria en la CPU Tres alternativas: Tipo de máquina Ventajas Pila Acumulador • Instrucciones cortas • Registros • Mayor flexibilidad para los compiladores • • Más velocidad (sin acceso a Memoria)
Inconvenientes Elevado tráfico con Memoria Instrucciones más largas
El tráfico con memoria es uno de los cuellos de botella más importantes para el funcionamiento del procesador. Se disminuye este tráfico con instrucciones que operen sobre registros, ya que el acceso es más rápido y las referencias a los registros se codifican con menor número de bits (instrucciones más cortas). Conclusión Se opta por el tipo de máquina con registros de propósito general (RPG)
2.2 Referencias a memoria en instrucciones ALU Tres alternativas: Tipo de máquina Ventajas Registro-Registro • Ninguna referencia a Memoria • Codificación fija => formato simple • Generación de código simple Registro-Memoria • Menor número de instrucciones
•
Inconvenientes Mayor número de instrucciones por programa
•
Mayor tráfico con Memoria
22
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Memoria-Memoria
• •
Muchos tipos de direccionamiento Nnúmero mínimo de instrucciones por programa
• • •
Formato más complejo Mucho acceso a memoria Formato complejo
Conclusión Dentro de las máquinas con registros de propósito general, las que operan en la instrucciones ALU de registro - registro (RR) son las que optimizan el uso de registros, quedando el acceso a memoria limitado a las instrucciones de carga y almacenamiento. Registros Genearales R0 R1
ALU
R2
Almacenamiento
R3 .
Carga
Memoria
.
.
.Rn
2.3 Orden de ubicación de los datos Dos alternativas: Selección basada en big-endian motivos de compatibilidad litle-endian Conclusión Es indiferente desde el punto de vista del rendimiento. Serán motivos de compatibilidad con otros procesadores los que determinen una elección
2.4 Alineamiento de datos Dos alternativas: acceso alineado acceso no alineado
• • •
más rápido más lento en general mayor flexibilidad
Conclusión Datos alineados, o si el procesador permite lo no alineados, será el compilador quien genere siempre datos alineados.
2.5 Direccionamientos Los modos de direccionamiento pueden reducir significativamente el número de instrucciones de un programa. Sin embargo, añaden complejidad al repertorio aumentando con ello el CPI (número medio de ciclos por instrucción). En la gráfica siguiente aparecen los resultados de medir los modos de direccionamiento que utilizan 3 programas del SPEC89 sobre la arquitectura VAX (una de las que más modos de direccionamiento dispone): Tex, Spice y gcc. Como puede observarse en la gráfica, los direccionamientos inmediato y con desplazamiento dominan con diferencia sobre los demás. No se ha incluido el direccionamiento relativo que se utiliza casi exclusivamente en las instrucciones de bifurcación.
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1%
Indirecto memoria
1%
0% Indexado
16%
6% 3%
Indirecto registro
6%
24%
TeX
11%
Spice gcc
43%
17%
Inmediato
39% 32%
Desplazamiento
55%
40%
0% Otros
0%
3% 3% 10%
20%
30%
40%
50%
60%
Frecuencia de los modos de direccionamiento
El direccionamiento registro + desplazamiento alcanza más del 75%. El tamaño de los desplazamientos no aparece en la gráfica pero varía de 12 a 16 bits en un porcentaje que va del 75% al 99%. El tamaño del campo inmediato varia de 8 a 16 bits en un porcentaje que va del 50% al 80%. Conclusiones Una máquina eficiente, que favorezca los casos frecuentes (que como hemos visto por la ley de Amdahl son los que más aportan a la ganancia de velocidad global de la máquina) debería soportar:
Direccionamientos registro + desplazamiento y el inmediato Tamaños de los desplazamientos de 12 a 16 bits Tamaño del dato inmediato de 8 a 16 bits La supresión de los modos complejos no afectan decididamente al rendimiento
2.5 Datos operando La siguiente figura muestra el porcentaje de referencias en los benchmarks anteriores a los objetos de datos mas usuales: byte, media palabra, palabra y doble palabra. Se desprende que los accesos a datos de longitud palabra o doble palabra dominan sobre los demás. Si a ello añadimos la necesidad de acceder al elemento mínimo que define la resolución del direccionamiento, así como el soporte del tipo carácter, es decir, el byte; y la existencia en la mayoría de los procesadores de operaciones hardware en punto flotante, llegamos a las siguientes Conclusiones enteros de 16 y 32 bits flotantes de 64 bits caracteres de 8 bits
24
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
0% Doble Palabra
66% 0% 89% 34%
Palabra
91%
TeX Spice
Media Palabra
0% 0% 4%
gcc
11% BYTE
0% 5% 0%
20%
40%
60%
80%
100%
Frecuencia de la referencia
2.6 Operaciones Se cumple en la práctica que las operaciones más simples son las que más se repiten en los programas, concretamente las operaciones de carga, salto condicional, comparación, almacenamiento, suma, and, resta, transferencia entre registros y saltos-retornos de subrutina se llevan el 96% de las ocurrencias, para el caso de programas enteros ejecutándose sobre la familia x86, tal como muestra la siguiente tabla: ordenación 1 2 3 4 5 6 7 8 9 10
instrucción x86 carga salto condicional comparación almacenamiento suma and resta transferencia RR salto a subrutina retorno de subrutina TOTAL
% total ejecutadas 22% 20% 16% 12% 8% 6% 5% 4% 1% 1% 96%
Conclusiones El repertorio ISA de un procesador eficiente no debera incluir muchas más operaciones que las aparecidas en la tabla anterior.
2.8 Sentencias de salto condicional En la siguiente figura tenemos el porcentaje de aparición de los tres tipos de sentencias de ruptura de secuencia. Como se puede observar las bifurcaciones condicionales ocupan el primer lugar (un 75%), por lo que resulta importante diseñar de forma eficiente el mecanismo de generación de condiciones y salto sobre el valor de las mismas.
25
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
16% 13% 10%
Llamada/retorno
Bifurcación
12% 12%
TeX Spice gcc
18%
66%
Condicional 0%
10%
20%
30%
40%
50%
60%
75% 78%
70%
80%
90%
Frecuencia de un salto de este tipo
Si analizamos la distribución de los saltos condicionales observamos (figura siguiente) que más de un 70% son saltos sobre igual o diferente, y un gran número son comparaciones con cero. Esto justifica que algunos procesadores incorporen un registro cuyo contenido es siempre igual a cero. 25%
LT/GE 0%
GT/LE
11%
TeX
3%
25%
0%
Spice 72% 75%
EQ/NE 0%
20%
40%
60%
gcc 89%
80%
100%
Frecuencia de tipos de com paraciones en saltos
La gráfica siguiente muestra la distribución del desplazamiento (número de bits) relativa al PC: 40 punto flotante
35 30 enteros
25 20 15 10 5 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bits del desplazamiento
Conclusiones Instrucciones que integren el test sobre la condición y el correspondiente salto Registro cuyo contenido es inalterable igual a cero. Desplazamiento de 8 bits
2.9 Llamadas a procedimientos (subrutinas) Aunque las instrucciones de llamada a procedimientos no son tan frecuentes como las de bifurcación condicional, su consumo de tiempo en los LAN es elevado debido a la gestión de los registros de activación (RA)
26
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
que deben de realizar. Resulta, pues, conveniente optimizar la ejecución de estas instrucciones. Del análisis de los datos se deducen los siguientes hechos:
• • •
Más del 98% de las llamadas utilizan menos de 6 parámetros Más del 92% de las llamadas utilizan menos de 6 variables locales La variación del nivel de anidamiento en la que se mueve un programa se mantiene relativamente pequeña a lo largo de una secuencia de llamadas/retorno, como se muestra en la siguiente figura: tiempo en unidades de llamada/retorno
retorno t = 33
llamada w=5
profundidad de anidamiento
Puede observarse que la variación del nivel de anidamiento se ha mantenido dentro de un valor w = 5 durante una secuencia de t = 33 llamadas/retornos de procedimientos. Conclusiones Este comportamiento de los programas en lo relativo a las llamadas a procedimientos se ha explotado en algunos procesadores (por ejemplo, SPARC) utilizando una ventana de registros para soportar los entornos, marcos o registros de activación (RA). Este mecanismo lo analizamos en el punto siguiente. Registros de propósito general: ventanas para soportar llamadas a procedimientos El procesador dispone de n registros físicos r0, r1, ...rn de los que en cada momento sólo son visibles para el programador (ventana) m de ellos: R0, R1, ..., Rm (m < n). Cuando todavía no se ha realizado ningún salto a subrutina, los registros visibles coinciden con los m primeros registros físicos. Cuando se ejecuta una instrucción de salto, los registros visibles se desplazan sobre los físicos de tal manera que se da un solapamiento entre los últimos antes del salto y los primeros después del salto. Es en los registros de solapamiento donde se realiza el paso de parámetros a la rutina y la devolución de resultados.
27
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
registros físicos de la máquina
r0
r1
ri
rn
Ventana de registros visibles
R0
Rm
R. parámetros
R. var. locales
R. temporales
R0 salto 1
Rm
R. parámetros
R. var. locales
R. temporales
R0 R. parámetros
ventana de solapamiento 1
Rm R. var. locales
R. temporales
salto 2 ventana de solapamiento 2
El conjunto de registros tiene una estructura de buffer circular, de tal manera que cuando se agota su capacidad se lleva a memoria el conjunto de registros del entorno (registro de activación) que primero se introdujo (primera llamada). El tamaño del buffer se elige de manera tal que permita soportar un nivel de anidamiento activo (en registros) de acuerdo a los datos empíricos que muestran los programas. En nuestro caso vimos que una variación de nivel igual a 5 se mantenía durante 33 llamadas/retorno, lo que significa que durante esas 33 llamadas todos los registros de activación se hubiesen soportado en un sistema con 5 ventanas . B.in A.out A.loc ventana salvada
B.loc
C.in B.out
ventana actual
A.in restauración
salvaguardia
Ejemplo En la siguiente figura se presenta el diseño de un sistema de registros con ventana de solapamiento que dispone de 32 registros físicos, r0, r1, ...r31, y una ventana de 8 registros: R0, R1, ..., R7. El solapamiento es de 2 registros.
28
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
000 001 010 011 100
JSR
RTS
+1
-1
00000 00110 01100 01010 10110
Lógica combinacional Sumador
dirección del registro visible
r0
R0
r1
R1
r2
R2
r3
R3
r4
R4
r5
R5
r6
R6
R0
r7
R7
R1
r8
R2
r9
R3
r10
R4
r11
R5
r12
R6
r13
R7
r31
3. Influencia de los compiladores de lenguajes de alto nivel Las prestaciones de los actuales computadores al ejecutar un programa dependen significativamente del compilador que se utilice. Cuando se diseña el repertorio de instrucciones se tiene en mente en todo momento la tecnología de diseño de compiladores. Las decisiones arquitectónicas afectan directamente a la complejidad de diseño de un buen compilador Un compilador consta de una serie de etapas, las cuales transforman representaciones abstractas de alto nivel, en representaciones de más bajo nivel, hasta llegar al repertorio de instrucciones. Un compilador busca en primer lugar la exactitud de la traducción (mantenimiento de la semántica del programa en la transformación), en segundo lugar la velocidad del código generado, en tercer lugar el tamaño del código, en cuarto lugar la velocidad del compilador, y en quinto lugar el soporte a la depuración. Desde el punto de vista del rendimiento que ahora nos ocupa, la velocidad del código generado es el factor a optimizar
Las optimizaciones realizadas por los compiladores modernos podemos resumirlas en las siguientes: Optimización de alto nivel: realizadas en el código fuente • Integración de procedimientos: sustituye la llamada a un procedimiento por el cuerpo de éste (expansión de macros).
Optimizaciones locales: afectan a fragmentos de código lineal (sin bifurcaciones) • Eliminación de subexpresiones comunes • Propagación de constantes
29
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Reducción del tamaño de la pila en la evaluación de expresiones reorganizando su estructura
Optimizaciones globales: afectan al programa completo, son más complejas de implementar. • Optimización de bucles • Eliminación de subexpresiones comunes de alcance global (incluyendo saltos) • Propagación de copias: sustituye todas las instancias de una variable asignada.
Optimización del uso de registros: es una de las que reporta mayor incremento de rendimiento. La estudiaremos con más detalle a continuación.
Optimizaciones dependientes de la máquina: Aprovechan el conocimiento de las arquitecturas específicas. • Multiplicación por una constante y sustitución por sumas y desplazamientos • Elección del desplazamiento más corto en los saltos
Por último conviene destacar que las dos ayudas más importantes que la arquitectura de un procesador puede prestar al diseño del compilador son:
• •
Regularidad del repertorio, es decir, ortogonalidad de sus elementos para simplificar la generación de código Proporcionar funciones primitivas, no soluciones codificadas en las instrucciones, pues estas resultan difícil de utilizar cuando el caso se aparta ligeramente del que originó su diseño.
3.1 Optimización de registros El uso optimizado de los registros de una máquina es responsabilidad del compilador cuya misión es mantener en registros ( y no en memoria) los operandos necesarios para el mayor número posible de cálculos, minimizando las operaciones de carga/almacenamiento de registros que requieren el acceso a memoria El proceso de asignación óptima de registros se realiza en dos fase: 1) Diseño del grafo de interferencias entre las variables del programa: nodos: las variables arcos: entre variables que están activas simultáneamente en el programa 2) Coloreado del grafo Se intenta colorear el grafo con n colores, siendo n el nº de registros disponibles en la máquina. A los nodos no coloreados se le asignan posiciones de memoria y se utilizan instrucciones de carga/almacenamiento. Como se sabe este es un problema NP-duro que requiere el uso de heurísticas muy elaboradas para acortar el tiempo de proceso.
Ejemplo Asignación de las 6 variables (V1,...V6) que aparecen en el segmento de programa de la siguiente figura, en la que se indica de forma gráfica sus interferencias. Se disponen de 3 registros en la máquina: R1, R2 y R3. 1) Se construye el grafo de interferencias tal como se muestra en la siguiente figura. 2) Se colorea el grafo asignando a los nodos los tres registros de manera que no se asigne el mismo registro a dos nodos conectados por un arco en el grafo. 3) Los nodos que no pueden ser asignados a registros se asignan a memoria (V7)
30
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
R1 V1
V2
V3
V4
V5
R2
V6 V1
V2
V3
V4
R3
R1
V5 R3
V6 Memoria
1. Procesadores RISC y CISC Características comparativas CISC(Complex Instruction Set Computers) • Arquitectura RM y MM • Diseñadas sin tener en cuenta la verdadera demanda de los programas • Objetivo: dar soporte arquitectónico a las funciones requeridas por los LANs • Muchas operaciones básicas y tipos de direccionamiento complejos • Instrucciones largas y complejas con formatos muy diversos ==> decodificación compleja (lenta) • Pocas instrucciones por programa ==> elevado número de ciclos por instrucción (CPI) • Muchos tipos de datos ==> interfaz con memoria compleja • Número limitado de registros de propósito general ==> mucho almacenamiento temporal en memoria • Baja ortogonalidad en las instrucciones ==> muchas excepciones para el compilador
RISC( Reduced Instruction Set Computers) • Arquitectura RR (carga/almacenamiento) • Diseñadas a partir de las mediciones practicadas en los programas a partir de los 80 • Objetivo: dar soporte eficiente a los casos frecuentes • • • • • •
Pocas operaciones básicas y tipos de direccionamiento simples Instrucciones de formato simple (tamaño filo) ==> decodificación simple (rápida) Muchas instrucciones por programa ==> reducido número de ciclos por instrucción (CPI) Sólo los tipos de datos básicos ==> interfaz con memoria sencilla Número elevado de registros ==> uso eficiente por el compilador para almacenamiento temporal Alto grado de ortogonalidad en las instrucciones ==> mucha regularidad para el compilador
Segmentación Una de la ventajas de los procesadores RISC es la facilidad que presentan sus instrucciones para ser ejecutadas de forma segmentada, es decir, solapando dos o más fases de ejecución. La tarea de cada instrucción se divide en etapas, de tal forma que en cada ciclo se ejecuta una etapa de una instrucción, simultaneándose la ejecución de etapas de diferentes instrucciones.
31
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Modelo secuencial instrucción 1
I
D
X
M
E I
instrucción 2
D
X
M
E
instrucción 3 1
2
3
4
5
6
7
8
9
10
I
D
X
M
E
11
12
13
14
15 ciclos
Modelo segmentado lineal Los primeros RISC tenían un modelo de ejecución segmentado lineal en el que todas las instrucciones pasan por las mismas etapas y en cada ciclo entra una nueva instrucción a ejecutar. instrucción 1
I
instrucción 2
D
X
M
E
I
D
X
M
E
I
D
X
M
E
I
D
X
M
E
I
D
X
M
E
7
8
9
instrucción 3 instrucción 4 instrucción 5 1
2
3
4
5
6
ciclos
Modelo infrasegmentado En cada n ciclos se lanza una nueva instrucción (Stanford MIPS). Esto está motivado fundamentalmente porque el tiempo de ciclo no permite acceder a algunos recursos hardware como la memoria, por lo que se necesitan dos (o más) ciclos para acceder a la misma. instrucción 1
I
D
instrucción 2
X
M
E
I
D
X
M
E
I
D
X
M
E
I
D
X
instrucción 3 instrucción 4 instrucción 5 1
2
3
4
5
6
7
8
9
M
E
I
D
10
11
X
M
12
13
E 14
Modelo supersegmentado Aumentan el rendimiento disminuyendo el tiempo de ciclo. Esto lo consiguen aumentando considerablemente el número de etapas del procesador (o dividiendo la etapa en subciclos). Con ello se consigue que el rendimiento máximo del procesador aumente; pero tiene un inconveniente que va a afectar considerablemente al rendimiento real: el aumento de las latencias de las instrucciones inducido por el aumento del número de conflictos entre las instrucciones que tengan algún tipo de dependencia a la hora de la ejecución (dependencias de datos, estructurales o de control), con la consiguiente pérdida de rendimiento.
32
ciclos
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
instrucción 1
I
instrucción 2
D
X
X
X
X
B
E
I
D
X
X
X
X
M
E
I
D
X
X
X
X
M
E
I
D
X
X
X
X
M
E
I
D
X
X
X
X
M
E
9
10
11
12
instrucción 3 instrucción 4 instrucción 5 1
2
3
4
5
6
7
8
ciclos
Modelo superescalar Para aumentar el rendimiento el modelo superescalar lanza a ejecutar en cada ciclo n instrucciones a la vez, siendo n el orden o grado del superescalar. Sin embargo, para que se puedan lanzar a ejecutar a la vez n instrucciones no debe haber conflictos entre ellas. Éste es un factor que va a limitar, de forma significativa, el rendimiento, y es una medida del paralelismo implícito que presentan las aplicaciones y que pueden extraer los compiladores. instrucción 1
I
D
X
M
E
instrucción 2
I
D
X
M
E
instrucción 3
I
D
X
M
E
instrucción 4
I
D
X
M
E
I
D
X
M
E
I
D
X
M
E
4
5
6
7
8
instrucción 5 instrucción 6 1
2
3
ciclos
Dependencias Son las causantes de la disminución de rendimiento en la ejecución segmentada y superescalar. Son de tres tipos:
Dependencias de datos Producidas por la referencia a un mismo dato por más de una sentencia (instrucción). Son de tres tipos: Dependencia de flujo (verdadera dependencia) RAW(Read After Write) S1 Æ S2
S1 . . . S2 Ejemplo:
X := ...
...:=...X... Load r1, a Add r2, r1, r1
33
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Antidependencia WAR (Write After Read) S1 --/Æ S2
S1 . . . S2 Ejemplo:
...:=...X...
X :=... Mul r1, r2, r3 Add r2, r4, r5
Dependencia de salida WAW (Write After Write) S1 –OÆ S2
S1 . . . S2 Ejemplo:
X :=...
X :=... Mul r1, r2, r3 Add r1, r4, r5
Grafo de dependencias S1: S2: S3: S4
Load Add Move Store
R1, A R2,R1 R1,R3 B,R1
/R1 /R2 /R1 /M(B)
Å Å Å Å
M(A)/ <R1>+<R2>/ <R3>/ <R1>/
S1
S2
S4
S3
Dependencias de control Debido a las instrucciones de salto condicional. Ejemplo:
zproc
Mul r1, r2, r3 Jz zproc Sub r4, r1, r1 . . . Load r1, x
Dependencias de recursos(estructurales) Producidas al tratar de usar recursos compartidos
34
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ejemplo: DLX • Arquitectura de 32 bits • 32 registros de uso general (GPR) de 32 bits. R0 siempre contiene 0 • Memoria direccionable por byte en modo big-endian • Instrucciones de longitud fija de 32 bits y alineadas • Un solo modo de direccionamiento: registro + desplazamiento (16) • Datos 8, 16 y 32 bits (enteros) Formatos de las instrucciones 6 tipo I (Inmediato)
Operación
5
5
rs
rd
16
Inmediato
rd Å Memoria Memoria Å rs rd Å rs Operación Inmediato
Cargas Almacenamientos Operaciones inmediatas 6 Tipo J (salto)
26
Operación
Destino
Saltos condicionales, incondicionales y a subrutina
Tipo R (registro)
6
5
5
5
11
Operación
rs1
rs2
rd
Función
Operaciones aritmético-lógicas
rd Å rs1 Función rs2
Repertorio de instrucciones Veamos algunas de las instrucciones de los diferentes grupos: INSTRUCCIONES ARITMETICO/LOGICAS Ejemplo ADD (Sumar) R1 ← R2 + R3 ADDI (Sumar inmediato) R1 ← R2 + 3 SLLI (Desplazamiento lógico izquierda) R1 ← R2 << 5 SLT (Activa menor que) IF (R2 < R3) R1 ← 1 ELSE R1 ← 0
Semántica ADD R1, R2, R3 ADDI R1, R2, #3 SLL R1, R2, #5 SLT R1, R2, R3
INSTRUCCIONES DE CONTROL DE FLUJO Semántica J (Salto) PC ← nombre JAL (Salto y enlace) R31 ← PC + 4; PC ← nombre JR (Salto registro) PC ← R3 BEQZ (Bifurcación si igual cero) IF (R4 == 0) PC ← nombre BNEZ (Bifurcación si no igual cero) IF (R4 != 0) PC ← nombre
Ejemplo J nombre JAL nombre JR R3 BEQZ R4, nombre BNEZ R4, nombre
Instrucción
Instrucción
INSTRUCCIONES DE CARGA/ALMACENAMIENTO Semántica Ejemplo LW R1, 30 (R2) R1 ←32 M[30 + R2] LW R1, 1000 (R0) R1 ←32 M[1000 + 0] LB (Cargar byte) R1 ←32 (M[40 + R3]0)24 ## M[40+R3] LB R1, 40 (R3) LBU R1, 40 (R3) LBU (Cargar byte sin signo) R1 ←32 024 ## M[40+R3] SW 500(R4), R3 SW (Almacenar palabra) M[500+R4]←32 R3 Instrucción LW (Cargar palabra)
35
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
SH (Almacenar media palabra) SB (Almacenar byte)
M[502+R2]←16 R316..31 M[41+R3]←8 R224..31
SH 502(R2), R3 SB 41(R3), R2
Síntesis de otros modos de direccionamiento y operaciones Instrucción aparente Instrucción real LW R2, <despl. de 16 bits> Dir. Directo (16 bits) LW R2, <despl. de 16 bits> (R0) LW R2, <despl. de 32 bits> Dir. Directo (32bits) LW R1, <16 bits altos del despl.> (R0) LW R2, <16 bits bajos del despl.> (R1) LW R2, <despl. de 32 bits> (R4) LW R1, <16 bits altos del despl.> (R0) Dir. Base+Desplazamiento (32 bits) ADDU R1, R1, R4 LW R2, <16 bits bajos del despl.> (R1) Carga de un registro con datos inmediatos ADDI R1, R0, #8 R1 Å 8 Transferencia entre registros ADD R1,R0,R2 R1 Å R2
Eficiencia de los procesadores RISC Comparación entre el VAX y el DLX utilizando 5 programas del SPEC92 (compress, eqntott, espresso, gcc, li) Se representan las siguientes relaciones: • relación (ratio) del número de instrucciones ejecutadas • relación (ratio) de CPIs • relación (ratio) de rendimiento medido en ciclos de reloj Discusión: el DLX ejecuta aproximadamente el doble de instrucciones que el VAX el CPI del VAX es aproximadamente 6 veces que el del DLX Conclusión: el DLX tiene aproximadamente el triple de rendimiento que el VAX
4
4 ratio de rendimiento
3,5
3,5 3
2,5
2,5
2
2
ratio de instrucciones ejecutadas
1,5
1,5
1
1 ratio CPI
0,5
0,5 fi
eqntott
espresso
doduc
tomcatv
fpppp
nasa7
0 matrix
0 spice
DLX/VAX
3
SPEC 89
36
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 5: Organización de la memoria: memoria principal. 1. Características generales de las memorias. 2. Jerarquía de las unidades de memoria de un computador. 3. Memoria principal: organización. 4. Memoria entrelazada.
1. Características generales de las memorias Las memorias se pueden clasificar atendiendo a diferentes criterios. Revisaremos en los apartados siguientes los más significativos: Método de acceso • Acceso aleatorio (RAM): acceso directo y tiempo de acceso constante e independiente de la posición. • Acceso secuencial (SAM): tiempo de acceso dependiente de la posición. • Acceso directo (DAM): acceso directo a un sector con tiempo de acceso dependiente de la posición, y acceso secuencial dentro del sector. • Asociativas CAM): acceso por contenido Soporte físico • Semiconductor • Magnéticas • Opticas • Magneto-ópticas Alterabilidad • RAM: lectura y escritura • ROM (Read 0nly Memory): Son memorias de sólo lectura. Existen diferentes variantes: ROM programadas por máscara, cuya información se escribe en el proceso de fabricación y no se puede modificar. PROM, o ROM programable una sola vez. Utilizan una matriz de diodos cuya unión se puede destruir aplicando sobre ella una sobretensión. EPROM (Erasable PROM) o RPROM (Reprogramable ROM), cuyo contenido puede borrarse mediante rayos ultravioletas para volverlas a escribir. EAROM (Electrically Alterable ROM) o EEROM (Electrically Erasable ROM), son memorias que están entre las RAM y las ROM ya que su contenido se puede volver a escribir por medios eléctricos. Se diferencian de las RAM en que no son volátiles. Memoria FLASH. Utilizan tecnología de borrado eléctrico al igual que las EEPROM, pueden borrarse enteras en unos cuantos segundos, mucho más rápido que las EPROM. Volatilidad con la fuente de energía • Volátiles: necesitan la fuente de energía para mantener la información. • No volátiles: mantienen la información sin aporte de energía. Duración de la información • Estáticas: el contenido permanece inalterable mientras están polarizadas. • Dinámicas: el contenido sólo dura un corto período de tiempo, por lo que es necesario refrescarlo (reescribirlo) periódicamente. Proceso de lectura • Lectura destructiva: necesitan reescritura después de una lectura. • Lectura no destructiva 1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ubicación en el computador • Interna (CPU): registros, cache(L1), cache(L2), memoria principal • Externa (E/S): discos, cintas, etc. Parámetros de velocidad • Tiempo de acceso • Tiempo de ciclo • Ancho de banda(frecuencia de acceso) Unidades de transferencia • Palabras • Bloques 2. Jerarquía de las unidades de memoria de un computador Las distintas memorias presentes en un computador se organizan de forma jerárquica:
aumenta capacidad
nivel superior
aumenta velocidad
Registros de la CPU Memoria cache(L1,L2)
Memoria principal Discos magnéticos
Cintas, CD-ROM, etc.
En el nivel i+1 se ubica una copia de aquellos bloques del nivel i que tienen mayor probabilidad de ser referenciados en el futuro inmediato
nivel i+1
nivel i
Este mecanismo de migración entre niveles es efectivo gracias al principio de localidad referencial que manifiestan los programas: • espacial • temporal 2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Se consigue que el mayor número de referencias generado por los programas correspondan a informaciones ubicadas en los niveles más altos de la jerarquía. 3. Memoria principal: organización. Una memoria principal se compone de un conjunto de celdas básicas dotadas de una determinada organización. Cada celda soporta un bit de información. Los bits se agrupan en unidades direccionables denominadas palabras. La longitud de palabra la determina el número de bits que la componen y constituye la resolución de la memoria (mínima cantidad de información direccionable). La longitud de palabra suele oscilar desde 8 bits (byte) hasta 64 bits. Cada celda básica es un dispositivo físico con dos estados estables (o semi-estables) con capacidad para cambiar el estado (escritura) y determinar su valor (lectura). Aunque en los primeros computadores se utilizaron los materiales magnéticos como soporte de las celdas de memoria principal (memorias de ferritas, de película delgada, etc.) en la actualidad sólo se utilizan los materiales semiconductores. Dentro de las memorias electrónicas de semiconductor podemos distinguir dos grandes grupos: las estáticas (SRAM: Static Random Access Memory) y las dinámicas (DRAM: Dynamic Random Access Memory). Las estáticas utilizan el principio de biestabilidad que se consigue con dos puertas inversoras (NAND ó NOR) realimentadas, mientras que las dinámicas aprovechan la carga o ausencia de carga de un pequeño condensador creado en un material semiconductor. Debido a la descarga natural que sufren las celdas cargadas, las memorias dinámicas necesitan un sistema de refresco que periódicamente - y antes que la carga eléctrica del condensador se haga indetectable - recargue las celdas que se encuentran en estado de carga. Desde un punto de vista conceptual y con independencia de la tecnología, consideraremos la celda básica de memoria como un bloque con tres líneas de entrada (entrada dato, selección y lectura/escritura) y una de salida (salida dato). La celda sólo opera (lectura ó escritura) cuando la selección está activa. Selección
Entrada dato
Salida dato
Lectura/Escritura
3.1 Organización interna de la memoria. Las celdas de memoria se disponen en el interior de un chip atendiendo a dos organizaciones principales: la organización por palabras, también denominada 2D, y la organización por bits, también denominada 2 ½ D o 3D. Organización 2D Es la organización más sencilla que responde al esquema mostrado en la siguiente figura:
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Matriz de celdas
dirección
2n
2n X m celdas
Selección n
Control
SC R/W
m
m datos entrada
datos salida
Las celdas forman una matriz de 2n filas y m columnas, siendo 2n el número de palabras del chip y m el número de bits de cada palabra. Cada fila es seleccionada por la decodificación de una configuración diferente de los n bits de dirección. Esta organización tiene el inconveniente que el selector (decodificador) de palabras crece exponencialmente con el tamaño de la memoria. Igual le ocurre al número de entradas (fan-in) de las puertas OR que generan la salida de datos. Ejemplo En la siguiente figura se muestra la organización 2D de un chip de memoria con 4 palabras de 4 bits: De0
De1
De2
De3 R/W
A0
A1
3 2 DEC 1 0
Ds0
Ds1
Ds2
Ds3
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Organización 3D En lugar de una única selección (decodificador) de 2n salidas en esta organización se utilizan dos decodificadores de 2n/2 operando en coincidencia. Las líneas de dirección se reparten entre los dos decodificadores. Para una configuración dada de las líneas de dirección se selecciona un único bit de la matriz. Por ello se la denomina también organización por bits.
Selección X 2n/2 n/2 Matriz de celdas
n dirección
2n/2
Selección Y
2n X m celdas
n/2
Control
SC R/W
m
m datos entrada
datos salida
Ejemplo: A2
A3
DEC 0
1
2
3
R/W
A0
A1
3 2 DEC 1 0
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
En esta organización se necesitan varias matrices de celdas básicas, tantas como bits deba tener la palabra de memoria, actuando sobre ellas en paralelo los circuitos de decodificación:
DE C X
u n a pa la br a
DE C Y
3.2 Diseño de memorias Cuando se ha de diseñar una memoria principal cuyas dimensiones (número de bits y número de palabras) exceden a las de un chip, se tienen que disponer varios chips en una placa de circuito impreso para alcanzar las dimensiones requeridas. Para mayor claridad trataremos independientemente cada una de las dimensiones. a) Ampliación del número de bits de la palabra de memoria Se trata de formar una memoria de 2n * (m * k) bits a partir de chips de 2n * m bits
SC
SC
n
n 2n * m * k bits
2n * m bits
R/W
R/W m
m•k
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El esquema general se muestra en la siguiente figura. Simplemente se disponen en paralelo k chips de 2n * m bits al que llegarían las mismas líneas de dirección y control. Cada chip aportaría m líneas de datos a la palabra de la memoria total. SC
n n
SC 1
n
SC 2
n
SC k
2n x m bit s
2n x m bit s
2n x m bit s
R/W
R/W
R/W
m
R/W
m
m
k •m
Ejemplo: Diseño de una memoria de 1K x 8 bits a partir de módulos (chips) de 1K x 2 bits; A0 A1 A9
SC
SC
SC
SC
SC
1K x 2 bit s
1K x 2 bit s
1K x 2 bit s
1K x 2 bit s
R/W
R/W
R/W
R/W
R/W D0 . . . D7
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
b) Ampliación del número de palabras de memoria Se trata de formar una memoria de 2n * m* N bits a partir de chips de 2n * m bit, es decir, aumentar el número de palabras manteniendo la misma longitud de palabra.
SC
SC
n
n+k 2n * m bits
2n * N * m bits R/W
R/W
m
m
El esquema general se muestra en la siguiente figura. La nueva memoria tendrá n + k líneas de dirección. Se disponen N=2k chips en paralelo a los que se llevan las mismas m líneas de datos, las mismas n líneas de dirección menos significativas y la misma línea de lectura/escritura (R/W). Las k líneas de dirección más significativas se decodifican para activar con cada salida del decodificador el selector de chip (SC) de cada uno de los N=2k chips.
2k-1 An +k+1,...An DEC
1 0
dir eccion es
An -1,...A0
SC n
SC 1
n
SC 2
n
SC N
2n x m bit s
2n x m bit s
2n x m bit s
R/W
R/W
R/W
m
R/W bu s de da t os
n
m
m
m
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ejemplo: Diseño de una memoria de 4K x 8 bits con módulos de 1K x 8 bits;
A10
DE C A11 SC A0 A1 A9
SC
SC
SC
SC
SC
1K x 8 bit s
1K x 8 bit s
1K x 8 bit s
1K x 8 bit s
R/W
R/W
R/W
R/W
R/W D0 . . . D7
c) Ampliación de la longitud y el número de palabras de memoria En este caso ampliaríamos en primer lugar el número de líneas de datos (longitud de palabra) y con los bloques resultantes diseñaríamos una memoria con mayor número de palabras.
SC
SC
n
n+k’ 2n * m bits
2n * N * m * k bits R/W
R/W m
m*k
3.3 Ubicación en el espacio de direcciones. Dado un espacio de direcciones dn-1, dn-2,...,d1, d0 y una memoria de capacidad 2m palabras(m ≤ n)se trata de hallar la función lógica de selección (SC) que ubique a la memoria en un segmento de direcciones consecutivas Di,...Dj, así como las señales locales de dirección de la memoria.
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
D0 D1 D2 D3 . . . Di . . . Dj . . . D2n-1
dn-1 dn-2........ d1 d0 0 0 ... 0 0 0 0 ... 0 1 0 0 ... 1 0 0 0 ... 1 1 . . . --------------------Memoria 2m palabras ---------------------
1
1 ...
1
1
Debe cumplirse que Dj – Di + 1 = 2m Bu s de dir ecciones
Dir ecciones loca les
dn -1 dn -2 . . . d1
ldm -1 ldm -2 . .
Mem or ia 2 m pa la br a s
.
ld1 ld0
d0
SC
F u n ción de selección
Si la memoria debe ocupar posiciones consecutivas, las líneas menos significativas del bus de direcciones se conectarán con las líneas de direcciones locales de la memoria: ld0 ld1
= =
d0 d1
. . .
ldm-2 = dm-2 ldm-1 = dm-1 La función de selección será una función booleana del bus de direcciones: SC = fb(dn-1, dn-2,...,d1, d0)
Ejemplo: Ubicar una memoria de 8 palabras en un espacio de 4 líneas de dirección (d3,d2,d1,d0).
10
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
Ubicaciรณn 1: a partir de la direcciรณn 5 (0101) d0 D00 D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15
d3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
d2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
d1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
d0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
00 ld2
RAM
ld1
23 = 8 palabbras
ld0
d3
SC
01
11
10
00 0
0
0
0
01 0
1
1
1
11 1
0
0
0
10 1
1
1
1
d2
d1
d3 d2 d0 d3 d2 d1 d3 d1 d0 d3 d2
Ubicaciรณn 2: a partir de la direcciรณn 4 (0100)
d0 D00 D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15
d3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
d2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
d1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
d0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
00 ld2
RAM
ld1
23 = 8 palabbras
ld0
d3
SC
01
11
10
00 0
0
0
0
01 1
1
1
1
11 0
0
0
0
10 1
1
1
1
d2
d1
d3
d2
d3
d2
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ubicación 3: a partir de la dirección 0 (0000) d0 D00 D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15
d3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
d2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
d1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
d0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
00 ld2
RAM
ld1
23 = 8 palabbras
ld0
SC
d3
01
11
10
00 1
1
1
1
01 1
1
1
1
11 0
0
0
0
10 0
0
0
0
d2
d1
d3
Ubicación 4: a partir de la dirección 8 (1000)
d0 D00 D01 D02 D03 D04 D05 D06 D07 D08 D09 D10 D11 D12 D13 D14 D15
d3 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
d2 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
d1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
d0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
00 ld2
RAM
ld1
23 = 8 palabbras
ld0
SC
d3
01
11
10
00 0
0
0
0
01 0
0
0
0
11 1
1
1
1
10 1
1
1
1
d2
d1 d3
Conclusión: la función de selección es más simple cuanto más alineado se encuentre el bloque de memoria en el espacio de direcciones. La máxima alineación la tendremos cuando se cumpla que: dirección inicial mod 2n = 0 Es decir, el resto de dividir la dirección inicial por el tamaño de bloque es igual a 0. 12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Caso de módulos con más de un selector Se simplifica la lógica global de selección, pero hay que descomponer la función en un producto. Ejemplo: ubicación 2 (anterior) función de selección: SC = d2 • d3 + d2 • d3 que en forma de producto resulta: SC = (d2 + d3) • (d2 + d3) ld2
RAM
ld1
23 = 8 pa la bbr a s
da t os
ld0 SC1
SC2
d3 d2
d3 d2
Decodificación parcial y total Cuando se generan las funciones de selección de varios bloques de memoria o puertos de E/S que han de ubicarse en el espacio de direcciones tiene que evitarse siempre que una dirección sea asignada a más de una posición de memoria o registro de E/S. En caso contrario el resultado de las operaciones de lectura/escritura puede resultar incierto. Sin embargo, no es necesario que a una posición de memoria o registro le corresponda sólo una dirección. En algunos casos, para simplificar la decodificación, y siempre que no se vaya a utilizar totalmente el espacio disponible, se puede realizar una decodificación parcial. Ejemplo: Ubicación en un espacio de direcciones de 12 líneas d11, d10,...,d1, d0 (212 = 4.086 = 4K) de un bloque de RAM de 2K y un puerto de E/S de 4 registros. d10
d1
RAM da t os
d0
2 12 = 4K pa la bbr a s SC
d0
pu er t o E /S 22 = 4 pa la bbr a s
da t os
000
RAM (2K)
SC
7F F 800 pu er t o E /S (2K)
d11
FFF
La RAM la hemos decodificado completamente, en cambio el puerto de E/S presenta una decodificación parcial, ya que hemos utilizado 2K del espacio disponible para ubicar tan sólo 4 palabras. Esto significa que los 4 registros presentan múltiples direcciones cada uno (exactamente 512): 13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
R0 R1 R2 R3
800 801 8o2 803
804 805 806 807
808 809 80A 80B
80C 80D 80D 80F
... ... ... ...
Decodificación en placa o en bus Decodificación en placa A0
RAM da t os
A0
A12
2 13 = 8K pa la bbr a s SC
A13 A14 A15
A15
Decodificación en bus (back plane)
A0
A0
RAM da t os
A12
2 13 = 8K pa la bbr a s SC
A12 A13 DE C A14 A15
Disposición de los módulos de memoria
SIMM (Single In-line Memory Module). Un SIMM típico consta de varios chips de DRAM instalados en una pequeña placa de circuito impreso (PCB) que se fija verticalmente a través de un conector a la placa del sistema. Los SIMMs disponen de varios formatos y número de contactos. Una de las ventajas de la memoria SIMM es la posibilidad de instalar gran cantidad de memoria en un área 14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
reducida. Algunos SIMMs de 72 contactos contienen 20 ó más chips de DRAM; 4 de estos SIMMs contienen, pues, 80 ó más chips de DRAM. Ocupan un área de 58 cm2 , mientras que si los chips se instalaran horizontalmente en la placa del sistema ocuparían 135 cm2.
DIMM (Dual In-line Memory Module). Los módulos de memoria DIMM, al igual que los SIMMs, se instalan verticalmente en los conectores de expansión. La diferencia principal estriba en que en los SIMMs los contactos de cada fila se unen con los contactos correspondientes de la fila opuesta para formar un solo contacto eléctrico; mientras que en los DIMMs los contactos opuestos permanecen eléctricamente aislados para formar dos contactos independientes.
3.4 Detección y corrección de errores. Códigos detectores de errores Para la detección de errores simples en dispositivo de memoria se suelen utilizar los bits de paridad. Es decir, se amplía en 1 la longitud de palabra para almacenar en las operaciones de escritura la paridad total (par o impar) de la palabra. En las operaciones de lectura se comprueba si se mantiene la paridad convenida. Las detecciones de fallos de la memoria se suelen traducir en excepciones (interrupciones) del sistema.
Códigos correctores de errores (Hamming) Permite la corrección de un error simple. El dato a transmitir de m bits de longitud se amplía con k bits de paridad, suficientes para codificar la posición de un posible bit erróneo en el mensaje completo de m + k bits. Es decir, deberá cumplirse que 2k – 1 ≥ m + k. Nº de bits del dato 8 16 32 64 128 256
Nº de bits de paridad
Nº total de bits
4 5 6 7 8 9
12 21 38 71 135 265
Incremento porcentual 50 % 31,25 % 18,75 % 10,94 % 6,25 % 3,52 %
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Da t os de en tr a da
Da t os de sa lida Libr e de er r ores sim ples
F
Dir ecciones
Mem or ia
R/W
COMP
F
CORR
Ejemplo Supongamos que la longitud de palabra de la memoria es m = 8. Los datos de m = 8 bits (d8, d7, d6, d5, d4, d3, d2, d1) los ampliamos con k = 4 bits de paridad (C8, C4, C2, C1) para formar un mensaje de m + k = 12 bits (m12, m11, m10, m9, m8, m7, m6, m5, m4, m3, m2, m1). Los bits de paridad Ci ocupan las posiciones en el mensaje correspondientes a las potencias de 2, es decir la 1, 2, 4 y 8 (de aquí el subíndice i). Con los bits (C8, C4, C2, C1) se codifican todas las posiciones del mensaje (12), es decir: (C8, C4, C2, C1) = 0 0 0 1 = 1 en decimal para m1, ... (C8, C4, C2, C1) = 1 1 0 0 = 12 en decimal para m12, de manera que cuando se produzca un error simple (complementación de un bit) en el bit mj del mensaje, (C8, C4, C2, C1) sea igual a j en decimal. Es decir, Ci deberá recoger la paridad de todos los mj que tengan Ci = 1 en su codificación, incluido el propio Ci: d8
d7
d6
d5
d4
d3
d2
d1
datos 16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
C8 m8 1 0 0 0
m12 1 1 0 0
m11 1 0 1 1
m10 1 0 1 0
m9 1 0 0 1
d8 d8
⊕d7
⊕d6
⊕d5
d7 d7
⊕d6 ⊕d5
m7 0 1 1 1
m6 0 1 1 0
m5 0 1 0 1
⊕d4 ⊕d4 ⊕d4
⊕d3 ⊕d3
⊕d2
C4 m4 0 1 0 0
⊕d2
m3 0 0 1 1
⊕d1 ⊕d1
C2 m2 0 0 1 0
C1 m1 0 0 0 1
paridades mensaje C8 C4 C2 C1 = = = =
C8 C4 C2 C1
El sistema de memoria deberá generar en la escritura los bits de paridad Ci para almacenarlos junto a los bits de datos Supongamos que el dato escrito es: d8 d7 d6 d5 d4 d3 d2 d1 = 1001 1101
Los bits de paridad para el código de Hamming valdrán:
Función F: C8 C4 C2 C1
= = = =
d8⊕d7⊕d6⊕d5 d8⊕d4⊕d3⊕d2 d7⊕d6⊕d4⊕d3⊕d1 d7⊕d5⊕d4⊕d2⊕d1
= = = =
1 1 0 0
⊕ ⊕ ⊕ ⊕
0 1 0 1
⊕ ⊕ ⊕ ⊕
0 1 1 1
⊕ ⊕ ⊕ ⊕
1 0 1⊕1 0⊕1
= = = =
0 1 1 1
En la lectura se generará de nuevo los bits de paridad con el bloque F’ a partir de los bits de datos leídos de memoria. El bloque F’ responde a la misma función lógica que F. Supongamos que en la lectura se produce un error simple en d5, es decir, escribimos un 1 y hemos leído un 0, el valor de F’ será:
Función F’: C’8 C’4 C’2 C’1
= = = =
d’8⊕d’7⊕d’6⊕d’5 d’8⊕d’4⊕d’3⊕d’2 d’7⊕d’6⊕d’4⊕d’3⊕d’1 d’7⊕d’5⊕d’4⊕d’2⊕d’1
= = = =
1 1 0 0
⊕ ⊕ ⊕ ⊕
0⊕0⊕0 1⊕1⊕0 0⊕1⊕1⊕1 0⊕1⊕0⊕1
= = = =
1 1 1 0
Para detectar la existencia de un error simple y su posición (para poderlo corregir) comparamos (Comparador COMP) los bits de paridad generados en la lectura, C’i con los almacenados en la escritura, Ci: Comporador COMP: C’’8 C’’4 C’’2 C’’1
= = = =
C8 C4 C2 C1
⊕ ⊕ ⊕ ⊕
C’8 C’4 C’2 C’1
= = = =
0 1 1 1
⊕ ⊕ ⊕ ⊕
1 1 1 0
= = = =
1 0 0 1
Si el resultado de la comparación es C’’8 C’’4 C’’2 C’’1 = 0 0 0 0 significa que no se ha producido error. Si se ha producido un error, los Ci’’ codificarán su posición. En nuestro ejemplo el resultado de la comparación vale 17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
C’’8 C’’4 C’’2 C’’1 = 1 0 0 1 = 9 (decimal) Î el bit m9 del mensaje ha fallado, es decir el bit de datos d5 Para corregir el error decodificamos su posición, es decir, los Ci’’ (decodificador DEC) con lo que disponemos de una línea individual para cada posible posición de error. Con cada una de estas líneas podemos controlar la inversión o no de la correspondiente línea de datos di’ leída de memoria según que se haya producido o no error en dicha línea. Para la inversión controlada de estas líneas utilizamos una etapa de puertas XOR. En la siguiente figura aparece el esquema completo de la memoria tolerante a un fallo simple y el proceso de corrección del fallo que hemos supuesto en el ejemplo d1 d2 d3 d4 d5 d6 d7 d8
Direcciones
F
1001 1101 error
R/W
1000 1101
0111 1 1 1 0
COMP
F’
0 1 1 1
1 0 0 1
0 1 2 3 4 5 6 7 DEC 8 9 10 11 12 13 14 15
Ausencia de error
Corrector 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
d1 d2 d3 d4 d5 d6 d7 d8
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
F’ = F C8 C4 C2 C1
= = = =
D8 D7 D6 D5 D4 D3 D2 D1
F d8 ⊕d7 ⊕d6 ⊕d5 d8 ⊕d4 ⊕d3 ⊕d2 d7 ⊕d6 ⊕d4 ⊕d3 ⊕d1 d7 ⊕d5 ⊕d4 ⊕d2 ⊕d1
= = = = = = = =
Corrector dec12 ⊕ d’8 dec11 ⊕ d’7 dec10 ⊕ d’6 dec9 ⊕ d’5 dec7 ⊕ d’4 dec6 ⊕ d’3 dec5 ⊕ d’2 dec3 ⊕ d’1
1. Memoria entrelazada. Para aumentar el ancho de banda de una memoria principal se puede descomponer en módulos con accesos independientes, de manera que se pueda acceder simultáneamente a una palabra de cada uno de los módulos. Me m o ria p rin c ip a l R. Dir eccion es
R. Dir eccion es
R. Direccion es
Módu lo M0
Módu lo M1
Módu lo Mk
R. Da tos
R. Da tos
R. Da tos
Existen diferentes elementos de diseño en una memoria modular, siendo el orden del entrelazado de las direcciones uno de los principales. Básicamente existen dos tipos de entrelazado para el espacio de direcciones de una memoria: entrelazado de orden superior y entrelazado de orden inferior.
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Entrelazado de orden superior Mp = 2n palabras Se divide Mp en 2m módulos de 2n-m palabras
m bits
(n – m) bits
Módulo
Dirección dentro del módulo
En tre lazado de orde n s u pe rior
Módulo M0
Módulo M1
Módulo Mk
R. Datos
R. Datos
R. Datos
D E C
Ejemplo: Para n = 5 y m = 2 tendríamos una distribución de direcciones de manera que las consecutivas irán en el mismo módulo:
módulo
00 00 00 00 00 00 00 00
Dir.módulo
000 001 010 011 100 101 110 111
M0
módulo
0 1 2 3 4 5 6 7
01 01 01 01 01 01 01 01
Dir.módulo
000 001 010 011 100 101 110 111
M1
módulo
8 9 10 11 12 13 14 15
10 10 10 10 10 10 10 10
Dir.módulo
000 001 010 011 100 101 110 111
M2
módulo
16 17 18 19 20 21 22 23
11 11 11 11 11 11 11 11
Dir.módulo
000 001 010 011 100 101 110 111
M3 24 25 26 27 28 29 30 31
20
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Entrelazado de orden inferior
E n t re la z a d o d e o r d e n i n fe ri o r Dir ección den t r o d el m ódu lo
Módu lo M0
Módu lo M1
Mód u lo Mk
R. Da t os
R. Da t os
R. Da t os
Módu lo
D E C
Ejemplo: Para n = 5 y m = 2 el entrelazado de orden inferior produciría una distribución de direcciones de manera que las consecutivas irán módulos diferentes:
Dir.módulo
000 001 010 011 100 101 110 111
módulo
00 00 00 00 00 00 00 00
M0 0 4 8 12 16 20 24 28
Dir.módulo
000 001 010 011 100 101 110 111
módulo
01 01 01 01 01 01 01 01
M1 1 5 9 13 17 21 25 29
Dir.módulo
000 001 010 011 100 101 110 111
módulo
10 10 10 10 10 10 10 10
M2 2 6 10 14 18 22 26 30
Dir.módulo
000 001 010 011 100 101 110 111
módulo
11 11 11 11 11 11 11 11
M3 3 7 11 15 19 23 27 31
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
5.1 Memoria entrelazada con organización S La organización S (Sencilla) utiliza entrelazado de orden inferior, accediendo simultáneamente, con la misma dirección local, a la misma palabra de cada uno de los módulos (n – m ) bit s
m bit s
Org a n i z a c i ó n S Dir ección den t r o del m ódu lo
Módu lo M0
Mód u lo M1
Módu lo Mk
R. Da t os
R. Da t os
R. Da t os
Módu lo
Con t r ol
MU X
S a lid a
Módulos M2m-1 . . .
acceso 1
acceso 2
acceso 3
M1
acceso 1
acceso 2
acceso 3
M0
acceso 1
acceso 2
acceso 3
Salida m
(p1,M0) (p1,M1)...... (p1,M2 -1)
m
(p1,M0) (p1,M1)...... (p1,M2 -1)
tiempo
22
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
5.2 Memoria entrelazada con organización C Org a n i z a c i ó n C
D E C
Con t r ola dor De Mem or ia
Dir ección Con t r ol
Módu lo M0
Dir ección
Con t r ol
Módu lo M1
Dir ección
Con t r ol
Módu lo Mk
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 6: Memoria Caché. 1. Principios básicos de funcionamiento de la memoria caché. 2. Elementos de diseño. 3. Factores de rendimiento de la memoria caché. 4. Ejemplos.
1. Principios básicos de funcionamiento de la memoria caché La velocidad de la memoria se ha distanciado progresivamente de la velocidad de los procesadores. En la figura siguiente se muestran las gráficas de la evolución experimentada por el rendimiento de las CPUs y las memoria DRAM (soporte de la memoria principal de los computadores actuales) en los últimos años. Las curvas muestran que el rendimiento de la CPU aumentó un 35% anual desde 1980 hasta 1987; y un 55% anual a partir de ese año. En cambio la memoria ha mantenido un crecimiento sostenido del 7% anual desde 1980 hasta la fecha. Esto significa que si se mantiene la tendencia, el diferencial de rendimiento no sólo se mantendrá sino que aumentará en el futuro. Para equilibrar esta diferencia se viene utilizando una solución arquitectónica: la memoria caché 100.000
CPU
10.000
55%
1000
Diferencia progresiva
100
Memoria (DRAM)
10
35%
7%
0.1 1980
1987
2000
Evolución de la mejora de rendimiento de la CPU y memoria DRAM 64 KB (DRAM)
La memoria caché es una memoria pequeña y rápida que se interpone entre la CPU y la memoria principal para que el conjunto opere a mayor velocidad. Para ello es necesario mantener en la caché aquellas zonas de la memoria principal con mayor probabilidad de ser referenciadas. Esto es posible gracias a la propiedad de localidad de referencia de los programas. Localidad de referencia Los programas manifiestan una propiedad que se explota en el diseño del sistema de gestión de memoria de los computadores en general y de la memoria caché en particular, la localidad de referencias: los programas tienden a reutilizar los datos e instrucciones que utilizaron recientemente. Una regla empírica que se suele cumplir en la mayoría de los programas revela que gastan el 90% de su tiempo de ejecución sobre sólo el 10% de su código. Una consecuencia de la localidad de referencia es que se puede predecir con razonable precisión las instrucciones y datos que el programa utilizará en el futuro cercano a partir del conocimiento de los accesos a memoria realizados en el pasado reciente. La localidad de referencia se manifiesta en una doble dimensión: temporal y espacial. Localidad temporal: las palabras de memoria accedidas recientemente tienen una alta probabilidad de volver a ser accedidas en el futuro cercano. La localidad temporal de los programas viene motivada principalmente por la existencia de bucles.
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Localidad espacial: las palabras próximas en el espacio de memoria a las recientemente referenciadas tienen una alta probabilidad de ser también referenciadas en el futuro cercano. Es decir, que las palabras próximas en memoria tienden a ser referenciadas juntas en el tiempo. La localidad espacial viene motivada fundamentalmente por la linealidad de los programas (secuenciamiento lineal de las instrucciones) y el acceso a las estructuras de datos regulares. CPU palabras Memoria cache (Mc) bloques (líneas) Memmoria principal Mp
Para implementar el mecanismo de actualización de la caché con los datos con mayor probabilidad de ser refernciados se divide la memoria principal en bloques de un número de bytes (4,8,16 etc.) y la caché en marcos de bloque o líneas de igual tamaño. El bloque será, pues, la unidad de intercambio de información entre la memoria principal y la caché, mientras que entre la caché y la CPU sigue siendo la palabra. El directorio contiene la información de qué bloques de Mp se encuentran ubicados en Mc Dirección de memoria 0 1 2
n
Mp
Directorio
Mc
Bloque 0
Marco de Bloque 0
Bloque 1
direccion Marco de Bloque m -1
n
Bloque 2 /K -1 2n -1
m marcos de bloque o líneas 2n palabras K palabras/bloque M = 2n/K bloques >> m
El funcionamiento de la memoria caché se puede resumir en el diagrama de flujo de la siguiente figura. En él se describe el proceso de traducción de la dirección física procedente de la CPU (en el supuesto que el procesador no disponga de memoria virtual o esté desactivado) en el dato ubicado en la posición de memoria determinada por dicha dirección:
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mc <-- CPU(DF)
Recibe la Dirección Física (DF) de la CPU
no
¿ DF∈ bloque en la cache?
(fallo)
Acceso a Mp para obtener el bloque que contiene DF
si (acierto) Leer el contenido de DF y llevarlo a la CPU
Asignar un marco de la cache al bloque de Mp
Mc <-- Mp(bloque)
CPU <-- <DF>
Cargar el bloque de Mp en el marco asignado de la cahe
Llevar el contenido de la DF a la CPU
Cuando una dirección se presenta en el sistema caché pueden ocurrir dos cosas: • Acierto de caché (hit): el contenido de la dirección se encuentre en un bloque ubicado en una línea de la caché. • Fallo de caché (miss): el contenido de la dirección no se encuentre en ningún bloque ubicado en alguna línea de la caché. Si en la ejecución de un programa se realizan Nr referencias a memoria, de las que Na son aciertos caché y Nf fallos caché, se definen los siguientes valores: •
Tasa de aciertos:
Ta = Na/ Nr
•
Tasa de fallos:
Tf = Nf/ Nr
Evidentemente se cumple: Ta = 1 - Tf 2. Elementos de diseño. A la hora de diseñar un sistema de memoria caché hay que elegir entre una serie de alternativas para cada uno de los siguientes elementos de diseño: •
Función de correspondencia: determina las posibles líneas de la caché (marcos de bloque) en las que se puede ubicar un determinado bloque de la memoria principal que ha sido referenciado por el programa y hay que llevarlo a memoria caché.
•
Algoritmo de sustitución: determina el bloque que hay que desubicar de una línea de la caché cuando ésta está llena y hay que ubicar un nuevo bloque.
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Política de escritura: determina la forma de mantener la coherencia entre memoria caché y memoria principal cuando se realizan modificaciones (escrituras)
•
Política de búsqueda de bloques: determina la causa que desencadena la llevada de un bloque a la caché (normalmente un fallo en la referencia)
•
Cachés independientes para datos e instrucciones: frente a cachés unificadas.
2.1 Función de correspondencia Existen tres funciones de correspondencia para definir la posible ubicación de un bloque de memoria principal (Mp) en la memoria caché (Mc): directa, asociativa y asociativa por conjuntos. En el primer caso un bloque de Mp sólo puede ubicarse en una línea de la caché, aquella que coincide con el bloque cuando superponemos Mc sobre Mp respetando fronteras de Mc, es decir, sobre espacios de Mp que son múltiplos del tamaño de Mc. En la correspondencia asociativa un bloque puede ubicarse en cualquier línea de Mc. Finalmente, la correspondencia asociativa por conjuntos es un compromiso entre las dos anteriores. Mp
Mc
Mc B0 B1 B2 B3 B4 B5 B6 B7
B0 B1 B2 B3 B4 B5 B6 B7
Directa
Asociativa
Mc
C0 C1 C2 C3 Asociativa por conjuntos
2.1.1 Correspondencia directa En la correspondencia directa el bloque Bj de Mp se puede ubicar sólo en el marco de bloque MBi que cumple la siguiente relación i = j mod m, donde m es el número total de líneas que tiene la caché. En la tabla siguiente se especifica el conjunto de bloques que se pueden ubicar en una línea de Mc:
Bloques de Mp
m, 2m, ... , 2s-1m m+1, 2m+1,..., 2s-1m+1 ...... m-1, 2m-1, 3m-1,..., 2sm-1
0, 1,
Marcos de bloque de Mc
0 1 ... m-1
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Interpretación de una dirección física en correspondencia directa: s
bloque etiqueta
marco de bloque
s-r
palabra
r
w
2w palabras/bloque 2s bloques de Mp 2r marcos de bloque en Mc (2r = m) 2s-r veces contiene Mp a Mc Los s - r bits de la etiqueta diferenciarán a cada uno de los bloques de Mp que pueden ubicarse en el mismo marco de bloque de Mc. El directorio caché en correspondencia directa contendrá un registro de s - r bits por cada marco de bloque para contener la etiqueta del bloque ubicado en ese momento en dicho marco. El mecanismo de obtención del contenido de una dirección física en cachés con correspondencia directa podemos resumirlo en el siguiente esquema: Mp s+w etiqueta
marco
palabra
etiqueta
dato dato
w
r
s-r
Memoria Cache
B0 MB0
dato dato
etiqueta s-r
dato dato
Comparador
w fallo
dato MBi
s
dato
acierto
Bj w
etiqueta
dato dato MBm-1 dato
B2s-1
dato
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ejemplo: para los tres tipos de correspondencia utilizaremos los siguientes datos: • • •
Tamaño de bloque K = 4 bytes = 22 => w = 2 Tamaño de Mc = 64 KBytes = 216 Bytes = 214 marcos de bloque => r = 14 Tamaño de Mp = 16 MBytes = 224 Bytes = 222 bloques => s = 22
Una Mc de correspondencia directa se puede implementar sobre una RAM con longitud de palabra suficiente para ubicar un bloque y los bits de etiqueta (directorio), tal como se muestra en la siguiente figura:
etiqueta
línea
palabra Memoria cache (RAM)
Comparador
etiqueta
p0
p1
p2
p3
MB0
etiqueta
p04
p5
p6
p7
MB1
etiqueta
p8
p9
p10
p11
MB2
etiqueta
MBm-2
etiqueta
MBm-1
MUX acierto fallo
En una operación de lectura se lee la palabra completa de la RAM, es decir, la línea y la etiqueta. Si la etiqueta leída coincide con la procedente de la dirección física, significa que la línea contiene la palabra de Mp referenciada por dicha dirección física: se produce un acierto de caché. En este caso con los w bits de palabra se selecciona la palabra referenciada dentro de la línea. Si no coinciden las etiquetas, significa que Mc no contiene el bloque de Mp al que pertenece la palabra referenciada, por lo que se produce un fallo de caché. Parte de un posible contenido de Mc en un instante determinado para el ejemplo anterior podría ser el siguiente:
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
etiqueta
línea
8
palabra
14
2
Mp
00
0000 13 57 92 46 0004 00 00 00 00 11 11 11 11 33 33 33 33 FFF8 FFFC
0000 0004 16MB
Mc
64KB 00 FF 16 00
13 57 92 46 24 56 78 99 22 33 44 55 33 33 33 33
16
55 55 55 55
13 67 988 8 24 24 25 26 22 33 44 55
16
MB0 MB1 MB2 MB3 . . . . . . .MB214-1
64KB FFF8 FFFC 55 55 55 55
0000 0004 FF
13 12 34 56 24 56 78 99 64KB
FFF8 FFFC
Se ha dibujado Mp divididida en zonas consecutivas de tamaño 64 KB (igual que el tamaño de Mc) para facilitar la correspondencia de los bloques de Mp y los marcos de bloque de Mc. 2.1.2 Correspondencia asociativa En la correspondencia asociativa un bloque Bj de Mp se puede ubicar en cualquier marco de bloque de Mc. Interpretación de una dirección física en correspondencia asociativa: etiqueta
2s bloques de Mp 2r marcos de bloque de Mc
s
palabra w
En este caso la etiqueta tendrá s bits para poder diferenciar a cada uno de los bloques de Mp (todos) que pueden ubicarse en el mismo marco de bloque de Mc. El directorio caché en correspondencia asociativa contendrá, pues, un registro de s bits por cada marco de bloque para contener la etiqueta del bloque ubicado en ese momento en dicho marco. El mecanismo de obtención del contenido de una dirección física en cachés con correspondencia asociativa podemos resumirlo en el siguiente esquema:
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mp s+w etiqueta
Memoria Cache
palabra B0
MB0 w
s
MBi s
Bj MBm-1 w Comparador
acierto fallo
El directorio de una Mc de correspondencia asociativa se puede implementar con una memoria asociativa con tantas palabras como líneas tenga Mc. Las líneas se soportan sobre un array de memoria con longitud de palabra suficiente para ubicar un bloque, tal como se muestra en la siguiente figura:
etiqueta
palabra
Dirección física Etiquetas
Datos MB0 MB1
Memoria Asociativa
MBm-2 MBm-1 acierto/fallo MUX
La memoria asociativa contiene las direcciones de todos los bloques de Mp ubicados en cada momento en Mc. Opera realizando una comparación simultánea de su contenido con el campo de etiqueta de la dirección física.
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
2.1.3 Correspondencia asociativa por conjuntos En la correspondencia asociativa por conjuntos las líneas de Mc se divide en v=2d conjuntos con k líneas/conjunto o vías cada uno. Se cumple que el número total de marcos de bloque (líneas) que tiene la caché m = v*k. Un bloque Bj de Mp se puede ubicar sólo en el conjunto Ci de Mc que cumple la siguiente relación i = j mod v. Interpretación de una dirección física en correspondencia asociativa por conjuntos: s
bloque etiqueta s-d
conjunto
palabra
d
w
En este caso la etiqueta tendrá s – d bits para poder diferenciar a cada uno de los bloques de Mp que pueden ubicarse en el mismo conjunto de Mc. El directorio caché en correspondencia asociativa por conjuntos contendrá, pues, un registro de s - d bits por cada conjunto de líneas de Mc. El esquema lógico de acceso a una caché de correspondencia asociativa por conjuntos se muestra en la siguiente figura: Mp s+w etiqueta
conjunto
Memoria Cache
palabra B0
d
s-d
w C0
s
Bj w Comparador
Cv-1
fallo acierto
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Una Mc de correspondencia asociativa por conjuntos de v vías se puede implementar como k módulos de correspondencia directa en paralelo cada uno con v líneas. Los conjuntos lo formarían las líneas que ocupan idéntica posición en cada módulo:
etiqueta
conjunto
palabra
C0 C1
Comparador
MUX
C0 C1
Comparador
MUX
Si dibujamos Mp divididida en zonas consecutivas de tamaño 32 KB (con tantos bloques como conjuntos tiene Mc) para facilitar la correspondencia de los bloques de Mp y los marcos de bloque de Mc, podremos representar fácilmente parte de un posible contenido de Mc con correspondencia asociativa por conjuntos de dos vías en un instante determinado para el ejemplo anterior.
k = 2 => v = m/k = 2r/2 = 214/2 = 213 => d = 13 w=2 s = 22 => s -d = 9
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
etiqueta 9
línea
palabra
13
2
Mp
000
0000 13 57 92 46 0004 00 00 00 00 11 11 11 11 33 33 33 33
Mc
32KB
7FF8 7FFC 0000 0004
13 67 98 88 24 24 25 26 22 33 44 55
001
001 13 67 98 88 1FF 24 56 78 99
000 001
001
1FF
13 57 92 46 24 24 25 26
C0 C1 C2
32KB
7FF8 7FFC 55 55 55 55 55 55 55 55
55 55 55 55
0000 13 12 34 56 0004 24 56 78 99 1FF
32KB
7FF8 7FFC 55 55 55 55
Las tres funciones de correspondencia se pueden ver en realidad como una sola, la asociativa por conjunto, siendo las otras dos correspondencias casos extremos de ella: conjunto/línea
etiqueta
índice
palabra
aumenta la asociatividad directa
asociativa
Si k = 1 ==> m = v ==> asociativa por conjuntos de 1 vía = directa Si v = 1 ==> m = k ==> asociativa por conjuntos de m vías = asociativa
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
2.2 Algoritmos de sustitución Como hemos visto, el espacio de ubicación de un bloque en Mc depende de la función de correspondencia. La correspondencia directa reduce el espacio a un marco de bloque, por lo que no queda alternativa de sustitución cuando hay que ubicar un nuevo bloque. En las correspondencias asociativa y asociativa por conjuntos hay que decidir qué bloque sustituir. En la primera la elección se tiene que realizar sobre cualquier bloque presente en Mc, mientras que en la segunda se reduce al conjunto único donde puede ubicarse el nuevo bloque. Las políticas de reemplazamiento más utilizadas son cuatro: 1.
Aleatoria: se escoge un bloque al azar
2.
LRU(Least Recently Used) • Se sustituye el bloque que hace más tiempo que no ha sido referenciado • Algoritmo: se asocian contadores a los marcos de bloque y Si se referencia MBi ∀ MBk : contador(MBk) ≤ contador(MBi) ==> contador(MBk) := contado(MBk) + 1 contador(MBi) = 0 Cuando se produce un fallo se sustituye el MBi : contador(MBi) = MAXIMO •
3.
FIFO (First In First Out) • •
4.
Para una memoria asociativa de dos vías basta con añadir un bit de uso a cada marco de bloque. Cuando un marco de bloque es referenciado su bit de uso se pone a 1 y el del marco del mismo conjunto a 0. Cuando hay que sustituir se elige el marco de bloque con bit de uso igual a 0.
Se sustituye aquel bloque que ha estado más tiempo en la caché (independientemente de sus referencias) Se puede implementar con una cola
LFU(Least Frequently Used) • •
Se sustituye aquel bloque que ha experimentado menos referencias Se puede implementar asociando un contador a cada marco de bloque
2.3 Política de escritura Determina la forma de actualizar Mp cuando se realizan operaciones de escritura. Hay que diferenciar dos casos: cuando la posición de memoria sobre la que se va a escribir está en Mc (acierto) y cuando no lo está (fallo). 1) Frente a aciertos en la caché: dos alternativas: •
Escritura directa o inmediata (write through) • • •
Todas las operaciones de escritura se realizan en Mc y Mp Inconveniente: genera un tráfico importante a Mp Solución: utilización de un buffer de escritura (alpha 21064)
Buffer de escritura
Mp
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Postescritura (copy back) • • •
Las actualizaciones se hacen sólo en Mc Se utiliza un bit de actualización asociado a cada marco de bloque para indicar la escritura del marco en Mp cuando es sustituido por la política de reemplazamiento Inconveniente: inconsistencia temporal entre Mc y Mp ==> complicación del acceso de la E/S a memoria que debe realizarse a través de Mc.
2) Frente a fallos en la caché •
Asignación en escritura (write allocate) •
•
El bloque se ubica en Mc cuando ocurre el fallo de escritura y a continuación se opera como en un acierto de escritura, es decir, con wirte through o copy back
No asignación en escritura (No write allocate) •
El bloque se modifica en Mp sin cargarse en Mc
2.4 Política de búsqueda Determina las condiciones que tienen que darse para buscar un bloque de Mp y llevarlo a una línea de Mc. Existen dos alternativas principales: 1) Por demanda • Se lleva un bloque a Mc cuando se referencia desde la CPU alguna palabra del bloque y éste no se encuentra en Mc 2) Anticipativa (prebúsqueda) •
Prebúsqueda siempre: la primera vez que se referencia el bloque Bi se busca también Bi+1
•
Prebúsqueda por fallo: cuando se produce un fallo al acceder al bloque Bi se buscan los bloques Bi y Bi+1
Clasificación de los fallos caché Los fallos de la caché se pueden clasificar en tres tipos: •
Forzosos: producidos por el primer acceso a un bloque
•
Capacidad: producidos cuando Mc no puede contener todos los bloques del programa
•
Conflicto: (en correspondencia directa o asociativa por conjuntos) producidos por la necesidad de ubicar un bloque en un conjunto lleno cuando Mc no está completa.
3. Factores que determinan el rendimiento de la memoria caché. El tiempo de acceso a memoria durante la ejecución de un programa será :
Tacceso = Na * Tc + Nf * Tp
(1)
donde:
Na es el número de referencias con acierto Nf es el número de referencias con fallo Tc es el tiempo de acceso a una palabra de Mc Tp es el tiempo de acceso a un bloque de Mp 13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El tiempo de acceso medio durante la ejecución del programa valdrá:
Tacceso_medio = Tacceso/ Nr = Ta*Tc + Tf*Tp donde:
Ta = Na/Nr es la tasa de aciertos Tf = Na/Nr es la tasa de fallos Nr es el número total de referencias a memoria El tiempo de acceso a un bloque de Mp constituye la componente principal del tiempo total de penalización de un fallo. En la siguiente expresión hemos considerado ambos términos equivalentes:
Tacceso_medio = Tacierto + Tf * Penalización_fallo
(2)
donde:
Tacierto = Ta*Tc, válido si frente a un fallo, el bloque se lleva a Mp al tiempo que la palabra referenciada del bloque se lleva (en paralelo) a Mc. Si estas dos acciones se realizan de forma secuencial Tacierto = Tc. ya que toda referencia implicaría un acceso a Mc y por tanto la expresión (1) se transformaría en:
Tacceso = Nr * Tc + Nf * Tp ==> Tacceso_medio = Tacceso/ Nr = Tc + Tf*Tp (3) De las expresiones (2) ó (3) podemos inducir que para mejorar el rendimiento de una caché, podemos actuar sobre tres términos, dando lugar a tres tipos de optimizaciones: 1. 2. 3.
Reducción de la tasa de fallos, Tf Reducción de la penalización de los fallos, Penalización_fallo Reducción del tiempo de acierto, Tacierto
3.1 Reducción de la tasa de fallos La tasa de fallos podemos reducirla con las siguientes alternativas: a) Aumento del tamaño del bloque •
Al aumentar el tamaño de bloque disminuye la tasa de fallos iniciales (forzosos) porque mejora la localidad espacial.
•
Sin embargo con el aumento del tamaño de bloque aumenta la penalización de fallos, ya que el tiempo de lectura y transmisión serán mayores si los bloques son mayores.
b) Aumento de la asociatividad •
Experimentalmente se comprueba que una caché asociativa por conjuntos de 8 vías es tan eficiente (tasa de fallos) como una caché completamente asociativa.
Tf
Mc 1K
15% 10%
16
•
4K
32
64
128
tamaño de bloque
Una caché de correspondencia directa de tamaño N tiene aproximadamente la misma tasa de fallos que una asociativa por conjuntos de 2 vías de tamaño N/2
• Al aumentar la asociatividad se incrementa el ciclo de reloj y por tanto Tacierto c) Utilización de una caché de víctimas 14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Se añade una pequeña caché completamente asociativa entre Mc y su camino hacia Mp para contener sólo los bloques descartados (sustituidos) por un fallo (víctimas)
•
Ante un fallo se comprueba si el bloque está en la caché de víctima antes de acudir a Mp
•
Reducen los fallos de conflicto fundamentalmente en cachés pequeñas con correspondencia directa.
=
Cache de víctima
Mc
Mp
d) Cachés pseudoasociativas Se trata de cachés de correspondencia directa que con una ligera modificación se pueden comportar como asociativas. Para ello se permite que un bloque de Mp se pueda ubicar en dos (pseudoasociativa de 2 vías) marcos de bloque de Mc, el que le corresponde (por la correspondencia directa) y el que resulta de conmutar el bit más significativo de la dirección del bloque, tal como se indica en el siguiente esquema: etiqueta
marco
palabra Memoria cache pseudoasociativa
0 X X...........X
conjunto pseudoasociativo 1 X X...........X
Comparador
MUX acierto fallo
Analicemos el rendimiento de una Mc pseudoasociativa:
Tiempo_acceso_mediopseudo = Tiempo_aciertopseudo + Tasa_fallospseudo *Penalización_fallospseudo 15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tasa_fallospseudo = Tasa_fallos2vías Penalización_fallospseudo = Penalización_fallosdirecta Tiempo_aciertopseudo = Tiempo_aciertodirecta + Tasa_aciertos_alternativospseudo *2 Tasa_aciertos_alternativospseudo = Tasa_aciertos2vías - Tasa_aciertosdirecta = (1 - Tasa_fallos2vías)- (1 - Tasa_fallosdirecta) = Tasa_fallosdirecta - Tasa_fallos2vias Tiempo_acceso_mediopseudo = Tiempo_aciertodirecto + (Tasa_fallosdirecta - Tasa_fallos2vias)*2 + Tasa_fallos2vías *Penalización_fallosdirecta Ejemplo: Tamaño (caché) 2K 2K
grado asociatividad 1 2
tasa de fallos 0,098 0,076
penalización fallo 50 -
Tiempo de acierto 1 -
Tiempo_acceso_mediopseudo = 1 + (0,098 - 0,076)*2 + 0,076*50 = 4,844 Tiempo_acceso_mediodirecta 1 + 0,098*50 = 5,90 > 4,844 e) Prebúsqueda de instrucciones y datos •
La prebúsqueda de instrucciones y/o datos antes de ser demandados por la caché disminuye la tasa de fallos.
•
Las instrucciones o datos prebuscados son llevados directamente a la caché o a un buffer externo que es accedido a mayor velocidad que Mp
Mc
Buffer de Prebúsqueda
Mp
•
El Alpha AXP 21064 pre-busca dos bloques cuando ocurre un fallo, el que contiene la palabra causante del fallo y el siguiente. El primero lo coloca en MC y el segundo en el buffer de prebúsqueda
•
Experimentalmente se ha comprobado que un buffer de prebúsqueda simple elimina el 25 % de los fallos de una caché de datos con correspondencia directa de 4 KB
f) Prebúsqueda controlada por el compilador
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Utiliza instrucciones explícitas de prebúsqueda del tipo prefetch(dato) que el compilador utiliza para optimizar los programas después de realizar un análisis de sus sentencias.
•
La prebúsqueda se realiza al tiempo que el procesador continúa la ejecución del programa, es decir, la prebúsqueda se hace en paralelo con la ejecución de las instrucciones.
•
Los bucles son las construcciones más apropiadas para que el compilador genere prebúsqueda
Ejemplo Supongamos que en una caché de 8 KB de correspondencia directa y bloques de 16 bytes se ejecuta el siguiente programa:
for (i = 0; i < 3; i = i + 1) for (j = 0; j < 100; j = j + 1) a[i][j] = b[j][0] * b[j+1][0];
Cada elemento de los arrays a[i][j] y b[j][j] ocupan 8 bytes (doble precisión) y están dispuestos en memoria en orden ascendente de sus índices, es decir:
a[0][0] a[0][1] a[0][2] ........ a[0][99] a[1][0] a[1][1] a[1][2] ........ a[1][99] a[2][0] a[2][1] a[2][2] ........ a[2][99]
b[0][0] b[0][1] b[0][2] ......... b[0][99] b[1][0] b[1][1] b[1][2] ......... b[1][99] b[2][0] b[2][1] b[2][2] ......... b[2][99]
Cada 2 elementos consecutivos ocupan un bloque, por lo que a[ ][ ] se beneficiará de la localidad espacial: los valores pares de j producirán fallos (forzosos: primera lectura) y los impares aciertos (puesto que se llevan a Mc en los mismos bloques que los pares). Por tanto, teniendo en cuenta que tenemos 3 filas y 100 columnas, el número de fallos será (3 * 100)/2 = 150. El array b[ ][ ] no se beneficia de la localidad espacial ya que los accesos no se realizan en el orden en que están almacenados sus elementos. En cambio se beneficiará dos veces de la localidad temporal ya que se accede a los mismos elementos para cada iteración de i. Además, cada iteración de j usa los mismos valores de b[ ][ ] que la iteración anterior. Ignorando los posibles fallos por conflicto, el número de fallos en el acceso a b serán 101, es decir, 1 para b[0][0] y 100 para b[1][0] hasta b[100][0]. En la 1ª iteración se producirán dos fallos: b[0][0] y b[1][0]; en la 2ª uno: b[2][0], puesto que b[1][0] ya está en Mc; en la última uno: b[100][0].
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mc iteraciones a[0][0] a[0][1]
b[0][0] b[0][1]
b[1][0] b[1][1]
i= 0, j= 0
a[0][0] ,b[0][0],b[1][0]
b[2][0] b[2][1]
i= 0, j= 1
a[0][1] ,b[1][0],b[2][0]
a[0][2] a[0][3]
b[3][0] b[3][1]
i= 0, j= 2
a[0][2] ,b[2][0],b[3][0]
a[0][98] a[0][99]
b[99][0] b[99][1]
i= 0, j= 98
a[0][98] ,b[98][0],b[99][0]
b[100][0] b[100][1]
i= 0, j= 99
a[0][99] ,b[99][0],b[100][0]
1 + 100 = 101 fallos a[1][0] a[1][1]
i= 1, j= 0
a[2][98] a[2][99]
i= 2, j= 98
a[1][0] ,b[0][0],b[1][0]
a[1][0] ,b[0][0],b[1][0]
3*100/2 = 150 fallos
El número total de fallos será, pues, de 251.
Utilizando prebúsqueda el compilador puede transformar el programa en el siguiente:
for (j = 0; j < 100; j = j + 1) prefetch (b[j+6][0]); prefetch (a[0][j+6]); a[0][j] = b[j][0] * b[j+1][0]; for (i = 1; i < 3; i = i + 1) for (j = 0; j < 100; j = j + 1) prefetch (a[i][j+6]); a[i][j] = b[j][0] * b[j+1][0];
Se ha descompuesto el bucle en dos, el primero (iteración para i = 0) prebusca a partir de b[6][0] y a[0][6]:
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Mc prebusqueda
a[0][6]
b[6][0]
a[0][7]
b[0][7]
fallos a[0][0] a[0][1]
a[0][2] a[0][3]
a[0][4] a[0][5] 3 fallos
a[0][99]
b[0][0] b[0][1]
iteraciones b[1][0] b[1][1]
i= 0, j= 0
b[2][0] b[2][1]
i= 0, j= 1
b[3][0] b[3][1]
i= 0, j= 2
b[4][0] b[4][1]
i= 0, j= 3
b[5][0] b[5][1]
i= 0, j= 4
1 + 5 = 6 fallos
b[99][0] i= 99 j= 99
Se ha elegido el valor 6 para el número de iteraciones que se buscan por adelantado. En el segundo bucle sólo se prebusca a[1][6]... a[1][99], a[2][6]... a[2][99] puesto que todo el array b[i][j] ya ha sido prebuscado en el primer bucle y se halla en Mc. E el número de fallos en estas dos iteraciones de i será 2*3 = 6. Luego en total solo se producen 15 fallos. El costo de evitar 236 fallos de cachés es ejecutar 400 instrucciones de prebúsqueda. g) Optimizaciones del compilador Las optimizaciones consisten en transformaciones del código fuente del programa realizadas en tiempo de compilación con el objetivo de aumentar la localidad espacial y/o temporal del programa, y consiguientemente reducir la tasa de fallos. Entre las transformaciones más importantes estudiaremos las siguientes: •
Fusión de arrays Se sustituyen varios arrays de igual tamaño por un único array de elementos estructurados. La transformación aumenta la localidad espacial si el programa referencia localmente las componentes de igual índice de los aarrays originales. Ejemplo: programa original int val[SIZE]; int key [SIZE];
programa transformado struct merge { int val; int key; }; struct merge array_fundido[SIZE]
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
val
array_fundido
key
La transformación mejora la localidad espacial de los elementos de los dos arrays originales. •
Fusión de bucles
programa original for (i = 0; i < 100; i = i + 1) for (j = 0; j < 100; j = j + 1) a[i][j] = 2/b[i][j] *c[i][j];
programa transformado for (i = 0; i < 100; i = i + 1) for (j = 0; j < 100; j = j + 1) a[i][j] = 2/b[i][j] *c[i][j]; d[i][j] = a[i][j] + c[i][j];
for (i = 0; i < 100; i = i + 1) for (j = 0; j < 100; j = j + 1) d[i][j] = a[i][j] + c[i][j];
La transformación mejora la localidad temporal, ya que las referencias a a[][] y c[][] en el primer bucle del programa original se hacen separadas en el tiempo a las referencias a a[][] y c[][] del segundo bucle. En cambio en el programa transformado estas referencias se hacen para los mismos valores de los índices en las 2 expresiones consecutivas.
•
Intercambio de bucles
programa original for (j = 0; j < 100; j = j + 1) for (i = 0; i < 5000; i = i + 1) x[i][j] = 2*x[i][j];
programa transformado for (i = 0; i < 100; i = i + 1) for (j = 0; j < 5000; j = j + 1) x[i][j] = 2*x[i][j];
20
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
bucle original
iteración
1
iteración 101
bucle intercambiado
x[0][0] x[0][1]
iteración 1 iteración 2
x[0][2]
x[0][4999] iteración
2
iteración 102
x[1][0] x[1][1]
iteración 5001 iteración 5002
x[1][2]
x[1][4999]
iteración 100
x[99][0]
iteración 495001
iteración 200
x[99][1]
iteración 495002
x[99][2]
x[99][4999] iteración 500000
iteración 500000
La transformación mejora la localidad espacial. •
Descomposición en bloques • • •
Reduce la tasa de fallos aumentando la localidad temporal En lugar de operar sobre filas o columnas completas de un array los algoritmos de descomposición en bloques operan sobre submatrices o bloques El objetivo es maximizar los accesos a los datos cargados en la caché antes de ser reemplazados
Ejemplo: multiplicación de matrices for (i = 1; i < N; i = i + 1) for (j = 0; j < N; j = j + 1) { r = 0; for (k = 0; k < N; k = k + 1){ r = r + Y[i][k] *Z[k][j];}; X[i][j] = r; };
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
X00
X01
X02
X03
X04
X05
Y00
Y01
Y02
Y03
Y04
Y05
Z00
Z01
Z02
Z03
Z04
Z05
X10
X11
X12
X03
X14
X15
Y10
Y11
Y12
Y13
Y14
Y15
Z10
Z11
Z12
Z13
Z14
Z15
X20
X21
X22
X23
X24
X25
Y20
Y21
Y22
Y23
Y24
Y25
Z20
Z21
Z22
Z23
Z24
Z25
X30
X31
X32
X33
X34
X35
Y30
Y31
Y32
Y33
Y34
Y35
Z30
Z31
Z32
Z33
Z34
Z35
X40
X41
X42
X43
X44
X45
Y40
Y41
Y42
Y43
Y44
Y45
Z40
Z41
Z42
Z43
Z44
Z45
X50
X51
X52
X53
X 54
X55
Y50
Y51
Y52
Y53
Y 54 Y55
Z50
Z51
Z52
Z53
Z54
Z55
Programa transformado: for (jj = 0; jj < N; jj = jj + B) for (kk = 0; kk < N; kk = kk + B) for (i = 0; i < N; i = i + 1) for (j = jj; j < min(jj + B, N); j = j + 1) { r = 0; for (k = kk; k < min(kk + B,N); k = k + 1){ r = r + Y[i][k] *Z[k][j];}; X[i][j] = X[i][j] +r; };
Este programa va calculando parcialmente los valores de x[][] para que los bloques de elementos de Y[][] y Z[][] sean utilizados totalmente cuando se llevan a la caché, aumentando su localidad temporal: X00
X01
X02
Y00
Y01
Y02
Z00
Z01
Z02
X10
X11
X12
Y10
Y11
Y12
Z10
Z11
Z12
Z20
Z21
Z22
3.2 Reducción de la penalización de fallos a) Prioridad a los fallos de lectura frente a los de escritura Con una caché de escritura directa (writre throuhg) la mejora de rendimiento más importante proviene del uso de un buffer de escritura de tamaño apropiado. Sin embargo, esto complica los accesos a memoria debido a que el buffer puede contener el valor actualizado (escrito) de una posición que se necesita en un fallo de lectura. Ejemplo: Supongamos que una Mc de correspondencia directa y escritura directa hace corresponder los bloques en los que se encuentran las direcciones 512 y 1024 sobre la misma línea de Mc. Supongamos que se ejecuta el siguiente programa: (1) (2) (3)
M[512] <-- <R3> R1 <-- M[1024] R2 <-- M[512]
// escritura sobre M[512] // lectura de M[1024] // lectura de M[512]
22
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1
Mc
Buffer de Escritura
Mp
512 <R3>
3 512 / 1024 2 1024
Cuando se ejecuta (1) se lleva <R3> al buffer de escritura y a la línea de Mc a la que pertenece la posición 512 (supuesto acierto de escritura, es decir, el bloque al que pertenece 512 se encuentra en Mc). Cuando se ejecuta (2) se produce un fallo de lectura y se sustituye en Mc el bloque al que pertenece 512 por el bloque al que pertenece 1024 Cuando se ejecuta (3) se vuelve a producir un fallo de lectura para llevar de nuevo el bloque al que pertenece 512 a Mc, pero es posible que éste no esté actualizado por el efecto de (1) si aún el contenido del buffer no se ha escrito en Mp Este problema de inconsistencia se puede resolver de dos maneras: 1) Retrasando el servicio del fallo de lectura producido por (3) hasta que el buffer esté vacío (todo su contenido se haya reflejado en Mp). Esta solución penaliza bastante los fallos de lectura, pues los datos empíricos demuestran que la espera sistemática a que el buffer se vacíe para servir un fallo e lectura puede penalizar estos fallos por un factor de 1.5. Por ello es recomendable dar prioridad a la lectura (es mucho más frecuente que la escritura) adoptando la segunda alternativa. 2) Incorporar al proceso asociado al fallo de lectura producido por (3) la comprobación de si el buffer contiene la posición 512, y continuar si el resultado es falso. b) Utilización de sub-bloques dentro de un bloque La utilización de bloques de gran tamaño no solo disminuyen la tasa de fallos sino que reduce el espacio de memoria caché dedicado al directorio (almacenamiento de las etiquetas de los bloques residentes en una línea). Sin embargo, bloques grandes aumentan la penalización por fallos debido al aumento de la cantidad de datos que se deben transferir en el servicio de cada fallo. Una forma de disminuir la penalización por fallos sin modificar los otros factores positivos consiste en dividir el bloque en sub-bloques y asociar un bit de validez a cada sub-bloque. De esta forma, cuando se produzca un fallo, no será necesario actualizar más que el sub-bloque que contiene la palabra referenciada. Esta alternativa hace que no sólo haya que comprobar si el bloque está en la caché comparando etiquetas, sino que habrá que asegurar que el sub-bloque que contiene la palabra referenciada es un sub-bloque válido, es decir, con datos actualizados. También podemos ver esta alternativa de diseño como una forma de economizar información de directorio asociando una sola etiqueta a un grupo de bloques, e indicando con un bit particular asociado a cada bloque (bit de validez) su estado de actualización cuando el grupo está en Mc. En la siguiente figura se muestra un esquema de esta alternativa de diseño:
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
bits de validez de los subloques
etiqueta
línea
palabra
etiqueta
subbloque1
subbloque2
subloque3
subloque4
Comparado
c) Utilización de un segundo nivel de caché Como los fallos se sirven leyendo bloques de Mp, una alternativa para disminuir la penalización por fallo consiste en disminuir el tiempo de acceso a Mp utilizando el mismo mecanismo caché, es decir, utilizando una caché intermedia o de segundo nivel (L2) entre Mc (L1) y Mp. CPU
Mc (L1)
Mc (L2)
Mp
Tiempo_acceso_medio = Tiempo_acierto N1 + Tasa_fallos N1 * Penalización_fallos N1 Penalización_fallosN1 = Tiempo_acierto N2 + Tasa_fallos N2 * Penalización_fallos N2 Cuando tenemos varios niveles de cachés hay que diferenciar entre la tasa de fallos local y la global:
Tasa_fallos_local = nº de fallos / nº de accesos a la caché Tasa_fallos_global = nº de fallos / nº total de accesos realizados por la CPU En general se cumple:
24
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tasa_fallos_local ≥ Tasa_fallos_global Y en particular:
Tasa_fallos_localN1 = Tasa_fallos_globalN1 Tasa_fallos_localN2 > Tasa_fallos_globalN2 Ejemplo: 1000 referencias a un sistema de cahé de dos niveles 40 fallos se producen en N1 20 fallos se producen en N2 Tasa_fallos_localN1 = Tasa_fallos_globalN1 = 40/1000 = 0.04 (4%) Tasa_fallos_localN2 = 20/40 = 0.5 (50%) Tasa_fallos_globalN2 = 20/1000 = 0.02 (2%)
3.3 Reducción del tiempo de acierto El tiempo de acierto podemos optimizarlo (minimizarlo) actuando sobre tres factores: a) Cachés pequeñas y simples •
El hardware pequeño acelera la comparación de etiquetas y por tanto el tiempo de acierto
•
También hace posible su incorporación al chip de la CPU, eliminando el conexionado externo y por tanto el tiempo de acceso desde la CPU
b) Evitar traducción de direcciones durante la indexación de las cachés •
Utilización de direcciones virtuales en las cachés
c) Escrituras segmentadas para rápidos aciertos de escritura Los aciertos de lectura son más rápidos que los de escritura, entre otros motivos porque en los primeros se puede leer el dato de Mc al tiempo que se comprueba si su etiqueta coincide con la de la dirección física. Si no coincide se ignora el dato leído. Esto no es posible en las escrituras, pero sí podemos simultanear la escritura de un dato con la comparación de la etiqueta del siguiente. Es decir, segmentar (pipe-line) la escritura sobre Mc. De esta forma se aceleran los aciertos de escritura.
25
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 7: Memoria Virtual. 1. Gestión de memoria. 2. Memoria virtual. 3. Memoria virtual paginada. 4. Memoria virtual segmentada. 5. Ejemplos
1. Gestión de memoria El sistema de memoria virtual de los actuales computadores surgió para liberar al programador de una serie de tareas relacionadas con el uso que los programas debían realizar con la memoria. La memoria virtual automatiza la gestión entre los dos niveles principales de la jerarquía de memoria: memoria principal y disco. Antes de entrar en los mecanismos específicos de la memoria virtual revisaremos una serie de funciones que deben incorporarse en la gestión de memoria. Solapamiento (overlay) El tamaño de la memoria principal disponible en los computadores ha aumentado de forma sostenida desde sus orígenes. Sin embargo, el tamaño de los programas ha crecido más rápidamente, por lo que la necesidad de ejecutar programas que no cabían en la memoria principal ha sido una constante en la historia de los computadores. Una forma de superar esta limitación es el uso de la técnica de solapamiento (overlay). En primer lugar, con la técnica de solapamiento se divide en módulos el programa que no cabe completo en la memoria principal. Después hay que situar en los lugares adecuados de cada módulo las instrucciones de E/S necesarias para cargar en memoria principal aquellos módulos residentes en el disco cuyas instrucciones deban ejecutarse o cuyos datos sean referenciados. Es decir, el propio programa se encarga de cargar dinámicamente aquellos módulos que son referenciados. Con este mecanismo se puede superar la limitación de la memoria principal, sin embargo tiene el inconveniente de hacer depender el programa del tamaño de la memoria disponible en el computador, con lo que variaciones en su configuración obligan a revisar la división modular del programa.
Memoria principal
Disco
M1
M2
M1
M3
M4
M2 e/s
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Reubicación En sistemas con multiprogramación se necesita que varios programas residan simultáneamente en memoria. El tiempo de CPU se va distribuyendo entre ellos de acuerdo a una política de prioridades determinada. La ubicación en memoria de los programas no se conoce en tiempo de compilación, por lo que no se pueden generar direcciones absolutas. Para conseguir una asignación dinámica de memoria en tiempo de ejecución se utilizan registros de reubicación. La dirección efectiva se obtiene sumando a la dirección generada por el compilador el contenido del registro de reubicación asignado al programa. Paginación La paginación también surgió de la necesidad de mantener más de un programa residente en memoria cuando la capacidad de ésta es inferior a la suma de los tamaños de los programas. Se trata de un mecanismo automático de solapamiento múltiple que practica el Sistema Operativo para hacer posible la multiprogramación. El espacio de memoria principal se divide en bloques de tamaño fijo denominados páginas. Los programas se dividen también en páginas y residen en el disco. El Sistema Operativo se encarga de asignar páginas físicas a los programas en ejecución (multiprogramación). De esta forma el tiempo de CPU puede distribuirse entre los programas residentes. Protección Un papel importante de la gestión de memoria es la protección. Si varios programas comparten la memoria principal debe asegurarse que ninguno de ellos pueda modificar el espacio de memoria de los demás. Como casi todos los lenguajes permiten el uso de punteros dinámicos, los test en tiempo de compilación no son suficientes para garantizar la protección. Esta debe mantenerla en tiempo de ejecución el sistema de gestión de memoria (MMU) Compartición Esta función parece estar en contradicción con la anterior. Sin embargo, con frecuencia los programas de un sistema multiprogramado deben poder compartir y actualizar información, por ejemplo, un sistema de bases de datos. Además, no es necesario tener varias copias de una rutina si se permite que todos los programas accedan a una misma copia. 2. Memoria virtual El sistema de memoria virtual implementa todas las funciones anteriores de forma integrada. En un computador con memoria virtual (MV) las direcciones de los programas (generadas por la CPU) hacen referencia a un espacio mayor que el espacio físico realmente disponible en la memoria principal o memoria física (MF). Los programas operan virtualmente con un tamaño físico de memoria principal mucho mayor que el realmente disponible. En estas máquinas hay que diferenciar, pues, entre el espacio de direcciones virtuales generado por la CPU y el espacio de direcciones físicas o reales existentes en memoria principal y determinado por el número de líneas del bus de direcciones. El espacio virtual se soporta sobre un disco con la ayuda de un mecanismo de traducción que genera la dirección física de memoria principal a partir de la virtual. En la siguiente figura hemos representado el mecanismo de traducción de direcciones virtuales (DV) a direcciones físicas (DF).
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CPU Número de Página Virtual (NPV)
Desplaz. Página (DP)
Dirección Virtual (DV)
v Memoria virtual Página 0
Reg. Base Tabla de Paginas
Página 1
Sumador
Página 2
Tabla de Páginas Página 3 Página 4
control pv 0 control pv 1
pag. fí sica f-1 pag. fí sica 2
control pv 2
pag. fí sica 1
control pv v-2
pag. fí sica 0
control pv v-1
pag. en disco
ACIERTO
Dirección Física (DF)
Página 5
Número de Página Física (NPF)
2v
Desplaz. Página (DP)
w Memoria física
páginas FALLO
Página 0 Página 1 Página 2
pv v-1
2w Página2
v-3
Página2
v-2
Página2 v-1
páginas
Memoria de Disco Página f-2 Página f-1
Tanto la memoria principal como la memoria del disco se dividen en páginas de igual tamaño. El número de páginas de la memoria virtual en general es mayor que el número de páginas disponibles de la memoria física. Por este motivo, en cada momento sólo las copias de un conjunto de páginas virtuales del programa residen en la memoria física. Este conjunto recibe el nombre de conjunto de trabajo o conjunto activo, y resulta relativamente estable a lo largo del tiempo, debido a la localidad referencial que manifiestan los programas. Esta es la clave del buen funcionamiento de la memoria virtual, al igual que ocurría con la memoria cache. Los bits de una DV se consideran divididos en dos campos, el número de página virtual (NPV) los más significativos, y el desplazamiento dentro de la página (DP), los menos significativos. El número de bits del campo DP lo determina el tamaño de página (nº de bits de DP = log2 tamaño de página). El número de bits del campo NPV lo determina el número de páginas virtuales (nº de bits de NPV = log2 nº de páginas virtuales). Los bits de una DF se consideran divididos también en dos campos, el número de página física (NPF) los más significativos, y el desplazamiento dentro de la página (DP), los menos significativos. El número de bits del campo DP de una DF es el mismo que el de una DV, puesto que las páginas tienen igual tamaño en MV y MF. El número de bits del campo NPF lo determina el número de páginas físicas de MF (nº de bits de NPF = log2 nº de páginas físicas). Las DVs generadas por la CPU se traducen a DFs con la ayuda de una Tabla de Páginas (TP). Esta tabla contiene tantas entradas como páginas existen en la MV, y la posición en la tabla de una entrada correspondiente a una página virtual concreta coincide con su NPV. Cada entrada contiene un primer campo de bits de control, de los que por el 3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
momento haremos referencia tan sólo a uno, el bit de presencia (P). Si este bit está activo (por ejemplo a 1) significa que la página virtual correspondiente a esa entrada está presente en la MF, y en este caso el segundo campo de la entrada contiene el correspondiente NPF. Si el bit P está inactivo (por ejemplo a 0) significa que la correspondiente página virtual no está en la MF, sino en el disco. En este caso el segundo campo de la entrada apunta a la dirección del disco donde se encuentra la página virtual. Como en un momento se pueden estar ejecutando más de un programa (multiprogramación o multiusuario) existirán más de una TP, una para cada programa (proceso) activo. Por ello, el acceso a la TP se realiza con la ayuda de un registro base de la tabla de páginas (RBTP) asociado a cada programa. Para traducir una DV en DF se busca en la correspondiente entrada de la TP. Si el bit P de esta entrada vale 1, se dice que ha ocurrido un acierto de página, y se lee el contenido del segundo campo que en los aciertos constituye el NPF en la memoria principal. La DF completa se obtiene concatenando los bits de NPF con los de DP de la DV. Si el bit P de la entrada de la TP vale 0, se dice que ha ocurrido un fallo de página, lo que significa que la página virtual donde se ubica la DV que se está traduciendo, no se encuentra en MF. En este caso el fallo de página se sirve buscado la página en el disco, ubicándola en MF y actualizando la correspondiente entrada de la TP.
3. Memoria virtual paginada El mecanismo de traducción de DV a DF que acabamos de describir corresponde a un sistema de memoria virtual paginada. En él el espacio virtual (y físico) se divide en páginas de igual tamaño. Veremos en el apartado siguiente otra alternativa en la que la MV se divide en segmentos de longitud variable, dando lugar a la memoria virtual segmentada. Las entradas de la TP de una MV paginada, además del NPF contiene unos bits de control, de los que hemos mencionado el bit de presencia P. Como se muestra en la siguiente figura, existen otros bits que controlan los derechos de acceso a la página: lectura (R), escritura (W) y ejecución (X), este último sólo para páginas de código. También suele existir un bit que indica si la página ha sido modificada (datos) y necesita escribirse en disco cuando sea sustituida. En general, los demás bits de control dependen de cada procesador. Entrada de la tabla de páginas con correspondencia directa P RWX Dirección de Página Física P= bit de presencia (de la página en memoria física) RWX = derechos de acceso de lectura, escritura y ejecución
Cada programa (proceso) puede ocupar una gran cantidad de memoria virtual. Por ejemplo, en la arquitectura VAX, cada proceso puede tener hasta 231 = 2 GBytes de memoria virtual. Utilizando páginas de 29 = 512 bytes, eso significa que se necesitan tablas de páginas de 222 entradas por proceso. La cantidad de memoria dedicada sólo a tablas de páginas podría ser inaceptablemente alta. Para solucionar este problema, la mayoría de los esquemas de memoria virtual almacenan las tablas de páginas en la propia memoria virtual, en lugar de utilizar la memoria física. Esto significa que la tabla de páginas también está sujeta a paginación, igual que el resto de los programas. Cuando un programa se está ejecutando, al menos una
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
parte de su tabla de páginas, incluyendo el elemento correspondiente a la página actualmente en ejecución, debe estar en la memoria principal. 3.1 Tablas de páginas de varios niveles Algunos procesadores hacen uso de un esquema de dos o más niveles para organizar las tablas de páginas. En este esquema, hay una página de directorio de nivel 1 en la que cada elemento apunta a una tabla de páginas de nivel 2, y así sucesivamente. En la siguiente figura se muestra una TP organizada en tres niveles: N1, N2 y N3. Típicamente, la longitud máxima de una tabla de páginas se restringe al tamaño de una página.
Nivel 1
Dirección Virtual Nivel 2 Nivel 3
Despla. Página
RBP Tabla Paginas N1
+ Entrada TP
+
Tabla Paginas N2
Entrada TP
+
Tabla Paginas N3
Entrada TP
Dirección Física Número de página física Despla. Página
3.2 Tabla de páginas invertida HASH Esta alternativa elimina de la TP las entradas que no apuntan a una página de la memoria física, reduciendo las entradas a número igual al de páginas de la memoria física. El campo NPV de la DV se hace corresponder sobre una tabla de dispersión (tabla hash) mediante una función de dispersión sencilla. La tabla de dispersión incluye un puntero a una TP invertida, que contiene los elementos de la TP. Existe un elemento en la tabla de dispersión y en la tabla de páginas invertida para cada página de memoria física, en vez de para cada página de memoria virtual. Se necesita, pues, una zona fija de la memoria física para las independientemente del número de programas o páginas virtuales que se admitan.
tablas,
Puesto que más de una DV puede apuntar al mismo elemento de la página de dispersión, se utiliza una técnica de encadenamiento para solucionar este problema. La 5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
técnica de dispersión da lugar a cadenas usualmente cortas, con uno o dos elementos. Esta alternativa de TP se utiliza en el PowerPC.
Dirección Virtual Nº Página Virtual Desplazamiento
Tabla de Dispersión
Tabla de Páginas
Función de Dispersión NPV
NPF
Enlace
NPF
Dirección Física Nº Página Física Desplazamiento
3.3 Buffer de traducción anticipada (TLB) En principio toda referencia a memoria virtual requiere dos accesos a la memoria física: uno para acceder al elemento de la TP, y otro para acceder a la memoria física. Por tanto, un esquema de memoria virtual como el que acabamos de estudiar duplicaría el tiempo de acceso a memoria. Para evitar este inconveniente los esquemas de memoria virtual utilizan una cache especial para los elementos de la TP, llamada usualmente buffer de traducción anticipada (TLB, Translation Lookaside Buffer). El TLB funciona lo mismo que una memoria cache, y contiene aquellas entradas de la TP a las que se han accedido recientemente. Por el principio de localidad temporal, la mayoría de las referencias a memoria corresponderán a posiciones incluidas en páginas recientemente utilizadas. Por ese motivo, la mayoría de las referencias involucran a entradas de la TP presentes en el TLB. Normalmente el TLB utiliza una correspondencia totalmente asociativa, por lo que una entrada de la TP puede ubicarse en cualquier posición del TLB
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
RWX
NPV
DP
Buffer de traducción anticipada (TLB)
RWX
=
NPV
Memoria Asociativa
NPF
Fallo de página
Violación de acceso
NPF
DP
Dirección Física
3.4 Interacción entre la memoria virtual y la memoria cache La memoria virtual debe interactuar con la memoria cache (no con la cache que implementa el TLB, sino con la cache de la memoria principal). Para traducir una DV el sistema de memoria consulta el TLB para comprobar si la entrada de la TP se encuentra en él. Si es así, se genera la dirección real (física), combinando el NPF con el DP. Si no, se accede a la TP en busca del elemento correspondiente. Una vez que se ha generado la dirección física, compuesta por una etiqueta y un número de conjunto, se consulta la cache para ver si el bloque que contiene la palabra referenciada se encuentra en dicho conjunto. Si es así, se envía al procesador. Si no, se produce un fallo de cache y se busca la palabra en memoria principal. Por tanto, la dirección virtual debe pasar primero por el TLB antes de que la dirección física pueda acceder a la cache, lo que alarga el tiempo de acierto. Este mecanismo se puede acelerar utilizando dos alternativas: 1. Acceder en paralelo (simultáneamente) al TLB para buscar el NPF y al directorio de la cache para buscar el bloque. 2. Utilizar caches con direcciones virtuales
La primera alternativa requiere que la longitud del campo de desplazamiento DP de la DV (igual al DP de la DF) sea mayor o igual que los campos de conjunto y palabra del formato de la DF para la cache, tal como se muestra en la siguiente figura. De esta forma será posible realizar en paralelo la búsqueda en el TLB del NPF que se corresponde con la 7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
etiqueta, y en el directorio de la cache el nº de bloque (línea), que junto a la palabra dentro del bloque, se corresponde con el DP, del que se dispone desde el instante que se genera la DV, pues no requiere traducción. N PV
DP
TLB
NPV
NPF
Fallo de página
N PF
DP Memoria cache
etiqueta
línea
palabra
Comparador
etiqueta
datos
MUX acierto fallo
Esto significa que el tamaño de la cache viene impuesto por el tamaño de la página y el grado de asociatividad. Por ejemplo, si tenemos un tamaño de página de 1K, el DP tendrá 10 bits. Si el número de palabras por bloque es 8 (3 bits de palabra) quedarán 7 bits para el campo de conjunto de la dirección física de la cache. Si la asociatividad fuese 1 (correspondencia directa) con esos 7 bits podríamos distinguir tan sólo entre 128 marcos de bloque o líneas de la cache, lo que impondría un tamaño de cache de 128 x 8 = 1024 = 1K. 8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Para aumentar este tamaño tendríamos que aumentar la asociatividad. Por ejemplo, si el grado de asociatividad es 2, el tamaño de la cache sería de 2K. Cuando aumenta el grado de asociatividad, también aumentan las comparaciones que debemos realizar con la etiqueta obtenida del TLB, ya que se deben comparar con ella todas las etiquetas del conjunto de la cache (tantas como vías) La segunda alternativa de utilizar caches direccionadas virtualmente tiene la ventaja de que en caso de acierto en la cache, no es necesario el proceso de traducción. Sin embargo, esta alternativa tiene dos problemas fundamentales. El primero surge en las conmutaciones de procesos. Cuando se cambia de proceso, la misma dirección virtual de cada proceso referencia diferentes direcciones físicas, lo que exige que se limpie la cache y esto supone una gran fuente de fallos forzosos. El segundo se origina porque es posible que distintos procesos con diferentes direcciones virtuales se correspondan con la misma dirección física (aliasing). Esto puede producir dos copias del mismo dato en una cache virtual, lo que ocasiona problemas de inconsistencia si hay escrituras. 3.5 Múltiples espacios virtuales Una forma de acelerar la conmutación de procesos evitando tener que borrar la TP (que puede estar en TLB o memoria invertida) es extender las entradas con un campo que contiene el identificador de proceso (PID).
PID
RWX
N PV
DP
(TLB)
RWX
PID
=
NPV
NPF
Fallo de página =
Violación de acceso
N PF
DP
Dirección Física
3.6 Políticas de búsqueda (fetch) •
Prebúsqueda (análoga a la utilizada en memoria cache)
•
Búsqueda por demanda (análoga a la utilizada en memoria cache)
Políticas de sustitución (replacement) •
Aleatoria 9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Elige una página aleatoriamente, sin mirar el número de referencias o el tiempo que la página lleva en memoria principal. En general esta política tiene unos resultados pobres, excepto en entornos donde donde existe poca localidad como en las bases de datos. •
FIFO (First In First Out) Se sustituye la página que lleva más tiempo residente en memoria. Utiliza una cola FIFO y hace un uso pobre de la localidad temporal
•
Reloj (FINUFO: First In Not Used First Out) Es una mejora de la FIFO en la que también se chequea si una página ha sido referenciada, haciendo mejor uso de la localidad temporal. Para implementar esta política se mantiene una cola como en la FIFO, pero circular, con un puntero a la última página sustituida, y un flag asociado a cada página para anotar que ha sido referenciada.
•
LRU (Least Recently Used) Análoga a la utilizada en memoria cache
•
Optima (MIN) Se trata de la mejor política posible: sustituir la página que vaya a tardar más tiempo en ser referenciada en el futuro (Belady). Aunque esta política tiene el mínimo número posible de fallos de página (de aquí el nombre de política MIN), no se puede llevar a la práctica en tiempo real, y se utiliza como una referencia teórica para medir la eficiencia de otras políticas en entornos experimentales.
4. Memoria virtual segmentada Mientras que la paginación es transparente para el programador, y le proporciona un espacio de direcciones mayor, la segmentación es normalmente visible para el programador, y proporciona una forma lógica de organizar los programas y los datos, y asociarle los privilegios y atributos de protección. La segmentación permite que el programador vea la memoria constituida por múltiples espacios de direcciones o segmentos. Los segmentos tienen un tamaño variable, dinámico. Usualmente, el programador o el sistema operativo asignará programas y datos a segmentos distintos. Puede haber segmentos de programa distintos para varios tipos de programas, y también distintos segmentos de datos. Se pueden asignar a cada segmento derechos de acceso y uso. Las direcciones virtuales estarán constituidas en este caso por un número de segmento (NS) y un desplazamiento dentro del segmento (DP). El proceso de traducción de dirección virtual a física es análogo al de la memoria virtual paginada, con la diferencia que ahora tenemos una tabla de segmentos (TS) cuyas entradas (denominadas también descriptores de segmento) contienen, además de los bits de control y la dirección real del segmento, la longitud L del mismo, ya que los segmentos tienen longitud variable. En la siguiente figura hemos representado esquemáticamente el proceso de traducción.
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tipo acceso RWX
Dirección Virtual Número Segmento(NS)
Desplaz. (DP)
Tabla de segmentos (TS) Reg. Tabla Segmentos
P RWX L Dir.Real Seg
P = bit de presencia L = Longitud del segmento
Dir. Real Seg.
Desplaz.(DP)
Dirección Física
Esta organización tiene ciertas ventajas para el programador, frente a un espacio de direcciones no segmentado: •
Simplifica la gestión de estructuras variables de datos. Si el programador no conoce a priori el tamaño que puede llegar a tener una estructura de datos particular, no es necesario que lo presuponga. A la estructura de datos se le asigna su propio segmento, y el sistema operativo lo expandirá o lo reducirá según sea necesario.
•
Permite modificar los programas y recompilarlos independientemente, sin que sea necesario volver a enlazar y cargar el conjunto entero de programas. De nuevo, esto se consigue utilizando varios segmentos.
•
Permite que varios procesos compartan segmentos. Un programador puede situar un programa correspondiente a una utilidad o una tabla de datos de interés en un segmento, que puede ser direccionado por otros procesos.
•
Se facilita la protección. Puesto que un segmento se construye para contener un conjunto de programas o datos bien definido, el programador o el administrador del sistema puede asignar privilegios de acceso de forma adecuada.
4.2 Políticas de ubicación (placement) para memorias segmentadas Se identifican los huecos de memoria principal por su tamaño(longitud) y dirección inicial, y se reúnen en una lista. La política de ubicación determinará la ordenación previa de la lista. Una vez que se decide el hueco donde se ubica el segmento, se actualiza la lista de huecos con el que se acaba de crear (a no ser que el segmento mida exactamente igual que el hueco de memoria utilizado). Si no se puede encontrar un hueco apropiado para el segmento, interviene la política de sustitución. Las tres políticas de ubicación de segmentos más utilizadas son las siguientes: •
Mejor ajuste (best fit) 11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La lista de huecos se mantiene ordenada en orden creciente de tamaño y se ubica el segmento en el primer hueco con capacidad suficiente para albergarlo. •
Peor ajuste (worst fit) La lista de huecos se mantiene ordenada en orden decreciente de tamaño y se ubica el segmento en el primer hueco con capacidad suficiente para albergarlo.
•
Primer ajuste (first fit) La lista de huecos se mantiene ordenada en orden creciente de las direcciones iniciales de los huecos, y se ubica el segmento en el primer hueco con capacidad suficiente para albergarlo. Con esta política, cuando transcurre un cierto tiempo, se acumulan un número elevado de huecos pequeños próximos a la cabeza de la lista, penalizando las búsquedas. Esto se puede evitar adelantando cíclicamente, después de cada búsqueda un hueco la posición inicial de la lista.
4.3 Memoria con segmentos paginados Como vimos en el apartado anterior, la segmentación presenta una serie de propiedades ventajosas para el programador, sin embargo, la paginación proporciona una forma más eficiente de gestionar el espacio de memoria. Para combinar las ventajas de ambas, algunos sistemas permiten una combinación de ambas, es decir, un sistema virtual con segmentos paginados. El mecanismo de traducción de DVs a DFs no es más que la composición del mecanismo de la memoria segmentada y el de la paginada, tal como se muestra en la siguiente figura:
Tipo acceso RWX
Dirección Virtual Nº Segmento
Nº Página
DP
Tabla de segmentos Reg. Tabla Segmentos
Tabla de Paginas del Segmento P RWX L Dir.Real Seg
P NPF P = bit de presencia L = Longitud del segmento
NPF
DP
Dirección Física
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
5. Ejemplo de sistema de memoria virtual: procesador Pentium II El Pentium II dispone de un sistema de gestión de memoria virtual con posibilidad de segmentación y paginación. Los dos mecanismos se pueden activar o desactivar con independencia, dando pues lugar a cuatro formas de funcionamiento del sistema de memoria: 1) Memoria no segmentada no paginada: la dirección virtual coincide con la dirección física. Esta alternativa resulta útil cuando el procesador se utiliza como controlador de sistemas empotrados. 2) Memoria paginada no segmentada: la memoria constituye un espacio lineal de direcciones paginado. La protección y la gestión de memoria se realizan a través de la paginación. 3) Memoria segmentada no paginada: la memoria constituye un conjunto de espacios de direcciones virtuales (lógicas). Esta alternativa presenta la ventaja frente a la paginación en que proporciona, si es necesario, mecanismos de protección a nivel de byte. Además, garantiza que la tabla de segmentos se encuentra ubicada en el procesador cuando el segmento está en memoria. Por ello, la segmentación sin páginas da lugar a tiempos de acceso predecibles. 4) Memoria segmentada paginada: se utilizan simultáneamente los dos mecanismos, la segmentación para definir particiones lógicas de memoria en el control de acceso, y la paginación u para gestionar la asignación de memoria dentro de las particiones. 5.1 Mecanismo de segmentación Cuando se activa la segmentación una dirección virtual (llamada dirección lógica en la terminología de Intel) consta de una referencia al segmento de 16 bits y un desplazamiento de 32 bits. Dos bits de la referencia al segmento se utilizan para el mecanismo de protección, y los 14 bits restantes para especificar al segmento en cuestión (16K segmentos). Con una memoria segmentada, el espacio de memoria virtual total que ve el usuario es 246 = 64 Terabytes (TBytes). El espacio de direcciones físicas utiliza direcciones de 32 bits, con una capacidad máxima de 4 GBytes. Existen dos formas de protección asociadas a cada segmento: el nivel de privilegio y el atributo de acceso. Hay cuatro niveles de privilegio, desde el más protegido (nivel 0), al menos protegido (nivel 3). El nivel de privilegio asociado a un segmento de datos constituye su clasificación; mientras que el nivel de privilegio asociado a un segmento de programa constituye su acreditación (clearance). Un programa en ejecución puede acceder a un segmento de datos sólo si su nivel de acreditación es menor (tiene mayor privilegio) o igual (igual privilegio) que el nivel de privilegio del segmento de datos. La forma de utilizar los niveles de privilegio depende del diseño del sistema operativo. Lo usual es que el nivel de privilegio 1 lo utilice la mayor parte del sistema operativo, y el nivel 0 una pequeña parte del mismo, la dedicada a la gestión de memoria, la protección y el control del acceso. Esto deja dos niveles para las aplicaciones. En muchos sistemas, las aplicaciones utilizan el nivel 3, dejándose sin utilizar el nivel 2. Los aplicaciones que implementan sus propios mecanismos de seguridad, como los sistemas de gestión de bases de datos, suelen utilizar el nivel 2. Además de regular el acceso a los segmentos de datos, el mecanismo de privilegio limita el uso de ciertas instrucciones. Por ejemplo, las instrucciones que utilizan los registros de gestión de memoria, sólo pueden ejecutarse desde el nivel 0; y las instrucciones de E/S sólo pueden ejecutarse en el nivel 13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
determinado por el sistema operativo, que suele ser el nivel 1. El atributo de acceso al segmento de datos especifica si se permiten accesos de lectura/ escritura o sólo de lectura. Para los segmentos de programa, el atributo de acceso especifica si se trata de acceso de lectura/ejecución o de sólo lectura. El mecanismo de traducción de dirección para la segmentación hace corresponder una dirección virtual con una dirección lineal. Una dirección virtual consta de un desplazamiento de 32 bits y un selector de segmento de 16 bits. 32
0
Desplazamiento Dirección Virtual 15
2
Número de segmento
1
0
TI RPL
Selector de segmento
El selector de segmentos consta de los siguientes campos: • • •
TI: Indica si la traducción va a utilizar la tabla de segmento global o local. Número de segmento: se utiliza como índice en la tabla de segmentos. RPL: Indica el nivel de privilegio del acceso.
Cada elemento de la tabla de segmentos consta de 64 bits, como muestra la siguiente figura: 32
0
Base(8bits)
G D/B Límite P DPL S Base (16 bits)
Tipo
Base(8 bits) Límite (16 bits)
Descriptor de segmento
Los campos son los siguientes: • • • • • • • •
Base ( 32 bits): dirección de comienzo del segmento dentro del espacio lineal de direcciones Límite ( 20 bits): tamaño del segmento Nivel de privilegio(DPL) (2 bits) Bit de segmento presente(P) ( 1 bit): indica si el segmento está disponible en memoria principal Bit S (1 bit): determina si el segmento es del sistema Tipo (4 bits) determina el tipo de segmento e indica los atributos de acceso Bit de granularidad (G) (1 bit): indica si el campo límite se interpreta en unidades Bytes o 4KBytes Bit D/B (1 bit): indica si los operandos y modos de direccionamiento son de 16 ó 32 bits (en segmentos de código)
5.2 Mecanismo de paginación Cuando se activa la paginación los programas utilizan directamente direcciones lineales. El mecanismo de paginación del Pentium II utiliza una tabla de páginas de dos niveles. El primero es un directorio de páginas, que contiene hasta 1.024 elementos. Esto divide los 4 GBytes del espacio lineal de memoria en 1.024 grupos de páginas, cada grupo 14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
con 4 Mbytes de capacidad y con su propia tabla de páginas. La flexibilidad del sistema de gestión de memoria permite utilizar un directorio de páginas para todos los procesos, un directorio de páginas para cada proceso o una combinación de ambos. El directorio de páginas del proceso en curso está siempre en memoria principal. Las tablas de páginas pueden estar en memoria virtual. La siguiente figura ilustra la combinación de los mecanismos de segmentación y paginación en la que no aparece el TLB ni la memoria cache. El Pentium II permite seleccionar dos tamaños de páginas de 4 KBytes ó de 4 MBytes. Cuando se utilizan páginas de 4 MBytes, hay un sólo nivel en la tabla de páginas. El uso de páginas de 4 MBytes reduce las necesidades de memoria. Con páginas de 4 KBytes, una memoria principal de 4 GBytes necesita del orden de 4 MBytes de memoria sólo para la tabla de páginas. Con páginas de 4 MBytes, una única tabla, de 4 KBytes de longitud, es suficiente para la gestión de las páginas.
Dirección lógica (virtual)
Segmento
Desplazamiento
Dirección lineal
Dir
Página
Desplaz.
Tabla de segmentos Directorio de páginas
Segmentación
Paginación
Tabla de páginas
Dirección física
Memoria principal
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 8: Organización de la Entrada/salida 1. Funciones implicadas en las operaciones de e/s. 2. Estructura del sistema de e/s: módulos de e/s y controladores 3. Mecanismos básicos de e/s: sincronización 4. E/S controlada por programa 5. E/S serie y paralela 1. Funciones implicadas en las operaciones de entrada/salida Para que un computador pueda ejecutar un programa debe ser ubicado previamente en la memoria, junto con los datos sobre los que opera, y para ello debe existir una unidad funcional de entrada de información capaz de escribir en la memoria desde el exterior. Análogamente, para conocer los resultados de la ejecución de los programas, los usuarios deberán poder leer el contenido de la memoria a través de otra unidad de salida de datos. La unidad de Entrada/Salida (E/S) soporta estas funciones, realizando las comunicaciones del computador (memoria) con el mundo exterior (periféricos). Los dispositivos periféricos que se pueden conectar a un computador se suelen clasificar en tres grandes grupos: a)
Dispositivos de presentación de datos. Son dispositivos con los que interactuan los usuarios, transportando datos entre éstos y la máquina, por ejemplo, ratón, teclado, pantalla, impresora, etc. b) Dispositivos de almacenamiento de datos. Son dispositivos que forman parte de la jerarquía de memoria del computador. Interactúan de forma autónoma con la máquina, por ejemplo, discos magnéticos y cintas magnéticas. c) Dispositivos de comunicación con otros procesadores. Permiten la comunicación con procesadores remotos a través de redes, por ejemplo, las redes de área local o global. d) Dispositivos de adquisición de datos. Permiten la comunicación con sensores y actuadores que operan de forma autónoma en el entorno del computador. Se utilizan en sistemas de control automático de procesos por computador y suelen incorporar conversores de señales A/D y D/A. 25° C
Cinta
CRT Teclado
Disco
Impresora
A/D-D/A
E/S
Memoria
CPU
Los dispositivos de transporte y presentación de datos representan una carga muy baja de trabajo para el procesador comparados con los dispositivos de almacenamiento. La siguiente tabla muestra las velocidades de transferencia típicas para diferentes dispositivos:
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Dispositivos Sensores Teclado Línea de comunicaciones Pantalla (CRT) Impresora de línea Cinta (cartridge) Disco Cinta
Velocidad 1 Bps – 1 KBps 10 Bps 30 Bps – 200 KBps 2 KBps 1 – 5 KBps 0.5 – 2 MBps 4.5 MBps 3-6 MBps
Aunque la velocidad de transferencia de los dispositivos de presentación de datos ha sido tradicionalmente lenta comparada con la de los dispositivos de almacenamiento, en los últimos tiempos la situación está cambiando. Cada vez más, los computadores se utilizan para manejar documentos multimedia que constan de gráficos, vídeos y voz. La siguiente tabla presenta algunos parámetros de transferencia para los dispositivos modernos de E/S multimedia: Medio Gráficos Vídeo Voz
Velocidad 1 MBps 100 MBps 64 KBps
Retardo máximo 1 - 5 segundos 20 milisegundos 50 - 300 milisegundos
Los gráficos requieren una gran capacidad de procesamiento de datos, hasta el punto que se han diseñado procesadores de propósito especial para manejar sofisticadas representaciones gráficas. El procesamiento de las imágenes gráficas puede requerir de 5 a 10 microprocesadores de alta velocidad.
El problema del vídeo es simplemente la animación de los problemas gráficos, ya que debe crearse una nueva imagen cada 1/30 de segundo (33 milisegundos).
El procesamiento de la voz es también elevado porque exige la creación o el reconocimiento de varios fonemas en tiempo real. De hecho es el medio que más capacidad de procesamiento requiere debido a que presenta el mayor grado de intolerancia por retrasos en el usuario.
Los dispositivos periféricos que pueden conectarse a un computador para realizar entrada y salida de información presentan, pues, las siguientes características:
Tienen formas de funcionamiento muy diferentes entre sí, debido a las diferentes funciones que realizan y a los principios físicos en los que se basan. La velocidad de transferencia de datos es también diferente entre sí y diferente de la presentada por la CPU y la memoria. Suelen utilizar datos con formatos y longitudes de palabra diferentes
No obstante estas diferencias, existen una serie de funciones básicas comunes a todo dispositivo de E/S:
Identificación única del dispositivo por parte de la CPU Capacidad de envío y recepción de datos Sincronización de la transmisión, exigida por la diferencia de velocidad de los dispositivos de E/S con la CPU
La identificación del dispositivo se realiza con un decodicador de direcciones. El envío y la recepción de datos tiene lugar a través de registros de entrada y salida de datos. Los circuitos de sincronización se manipulan por medio de registros de estado y control. El siguiente esquema representa gráficamente estas funciones:
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
líneas de control líneas de datos líneas de direcciones
envio/ recepción
Registros de datos (entrada y/o salida)
Decodificador de direcciones Registros de estado y control identificación
Circuitos de sincronización Dispositivo periférico
Las tres funciones básicas se pueden realizar a través del bus del sistema que conecta la memoria y la CPU, o bien se puede utilizar un bus específico para las operaciones de E/S. Estas alternativas se traducen en dos formas de organización de los espacios de direcciones: • Espacios de direcciones unificados Las unidades de E/S se ubican en el espacio único de direcciones como si fuesen elementos de memoria. A cada unidad de E/S se le asigna un conjunto de direcciones (suficiente para diferenciar todos sus registros internos). La interacción entre CPU y unidad de E/S se realiza a través de instrucciones de referencia a memoria. El bus del sistema es único. bus del sistema
CPU
Memoria
Unidad de E/S 1
Unidad de E/S n
• Espacios de direcciones independientes (Memoria y E/S) Las unidades de E/S se ubican en un espacio de direcciones diferente al de memoria. La interacción entre CPU y unidad de E/S se realiza a través de instrucciones específicas de E/S. La separación de espacios de direcciones puede soportarse con un bus único de uso compartido entre Memoria y E/S en función del estado de una línea de control MEM/IO:
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
bus del sistema Línea MEM/IO
CPU
Memoria
Unidad de E/S 1
Unidad de E/S n
Pero el desdoblamiento de espacios de direcciones puede responder a la existencia de dos buses independientes, uno para memoria (bus del sistema) y otro para E/S: bus de memoria
CPU
Memoria bus de E/S
Unidad de E/S 1
Unidad de E/S 2
Unidad de E/S n
Funcionalmente son equivalentes, pero desde el punto de vista de la codificación de programas difieren en el uso de las instrucciones. En el caso de E/S asignada en memoria se utilizan instrucciones de referencia a memoria, mientras que para E/S aislada existe un grupo particular de instrucciones para realizar esta función. Los dos ejemplos siguientes muestran ambas alternativas: E/S programada asignada en memoria 200 LOAD #1 STORE 517 202 LOAD 517 BPL 202 LOAD 516 E/S programada aislada 200 START I/O 5 201 TEST I/O 5 BNR 201 IN 5
/ AC <-- #1 / M[517] <-- <AC> / AC <-- M[517] / Bifurca si N=0 / AC <-- M[516]
/ Bifurca si dispositivo no disponible
2. Estructura del sistema de E/S: módulos de e/s y controladores de dispositivos Las diferencias existentes entre los dispositivos periféricos han hecho que la unidad de E/S de un computador se organice en torno a dos tipos de elementos, unos que soportan las características comunes a todos los dispositivos (módulos de E/S) y otros específicos para cada periférico que son los controladores de dispositivo:
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
8259 82 59
Módulo de E/S
DISCO
Controlador de dispositivo
2.1 Módulos de E/S Un módulo de E/S permite que el procesador gestione una amplia gama de dispositivos periféricos de una forma similar, ocultando los detalles concretos de temporización, formatos de datos y principios físicos de funcionamiento. El módulo de E/S se conecta con el procesador a través de un conjunto de líneas de datos, dirección y control (un bus). Los datos que se transfieren se almacenan temporalmente en un registro de datos. El estado del módulo se refleja en los bits de un registro de estado. El registro de control permite configurar y programar diferentes funciones en el módulo. Estos dos registros (estado y control) pueden unificarse en uno sólo en módulos simples. Un módulo de E/S dispone de la lógica específica para su conexión con uno o más dispositivos periféricos. En la siguiente figura se muestra la estructura general de un módulo de E/S: Datos Líneas de Datos
Lógica de interfaz con el dispositivo externo
Registro de datos
Registro de estado/control
Líneas de dirección Líneas de control
Estado Control
Datos Lógica de E/S
Lógica de interfaz con el dispositivo externo
Estado Control
Un módulo sencillo de E/S capaz de realizar la interfaz de un computador con una impresora podría tener la estructura mostrada en la siguiente figura. El decodificador hace que el módulo se identifique (SEL*) para A7 = 1, A6 = 0, A5 = 1, A4 = 1, A3 = 1,A2 = 1, A1 = 0, A0 = --, es decir, que ocupe las direcciones de memoria: 10111100 y 10111101, la primera corresponderá a los registros de estado y control (A0 = 0), y la segunda al registro de datos (A0 = 1). Los registros de estado y control pueden tener una única dirección asociada porque el primero sólo se lee (RD*) y el segundo sólo se escribe (WR*) desde el bus.
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
D E COD IFICAD OR
A7
IN TERF AZ D E IMP R ES OR A S EL*
...
CLK
D ATOS
A1 A0 OE*
CP U RD *
ES TAD O
CLK WR*
CON TR OL
B . D ATOS
2.2 Controlador de dispositivo (periférico) La estructura del controlador de un dispositivo tendrá que adaptarse en cada caso a las peculiaridades específicas del periférico. Unos tendrán que actuar sobre elementos electromecánicos (impresoras de línea), otros sobre elementos ópticos (CD-ROM), o magnéticos (discos), etc. Sin entrar en las singularidades de cada uno, podemos decir que los controladores de dispositivos periféricos presentan una estructura general como la representada en la siguiente figura: Estado (hacia el módulo de E/S)
Control (desde el módulo de E/S)
Lógica de control
Datos (desde y hacia el módulo de E/S)
Buffer Transductor
Controlador de dispositivo Datos (desde y hacia el exterior)
La conexión con el módulo de E/S se realiza a través de señales de control, estado y datos. Es la parte del controlador que omologa su comportamiento singular al esquema general de gestión de la E/S. Las señales de control determinan la función que debe realizar el dispositivo. La lógica de control asociada al dispositivo controla su operación en respuesta a las indicaciones del módulo de E/S. El transductor convierte las señales eléctricas asociadas a los datos a otra forma de energía. Además, suele existir un buffer asociado al transductor para almacenar temporalmente el dato que se transfiere entre el módulo de E/S y el dispositivo. En el tema 8 estudiaremos una serie de dispositivos periféricos particulares y sus controladores asociados. 2.3 Comunicación entre el módulo de E/S y el controlador de dispositivo periférico
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Analizaremos en este apartado el dialogo de señales que de forma general tiene lugar entre el módulo de E/S y el controlador de dispositivo en una transmisión de datos. • Salida En el caso de un dispositivo de salida (o de e/s en operación de salida) las líneas básicas que intervienen son las del bus de datos y dos de control: dato válido y dato aceptado. La primera indica al dispositivo la validez del dato presente en el bus de datos, y es activada por el módulo de E/S cuando ha estabilizado el bus de datos con el valor del dato a transmitir. La segunda la activa el dispositivo periférico en respuesta a la lectura y procesamiento del dato, y como respuesta a la disponibilidad para aceptar un nuevo dato. En la siguiente figura hemos representado en forma gráfica la evolución temporal de las señales en una operación de salida Salida bus de datos Módulo de E/S
dato válido
Dispositivo periférico
dato aceptado
bus de datos dato válido dato aceptado
La anterior secuencia de acciones que realizan el módulo de E/S y el dispositivo periférico en una operación de salida podemos también verlas en el siguiente diagrama: Módulo de E/S
Periférico
Dato --> bus de datos "1" --> dato válido
"1" = capacitación "0" = descapacitación "Z" = alta impedancia
bus de datos --> periférico "1" --> dato aceptado
0 --> dato válido "Z" --> bus de datos "0" --> dato aceptado (listo para aceptar una nueva operación)
•
Entrada
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
En el caso de un dispositivo de entrada (o de e/s en operación de entrada) las líneas básicas que intervienen son las del bus de datos y dos de control: petición de dato y dato aceptado. La primera solicita al dispositivo un dato de entrada, y es activada por el módulo de E/S. La segunda la activa el dispositivo periférico cuando ha generado el dato y su valor es estable en el bus de datos. Con la activación de esta señal el módulo de E/S conoce la validez del dato en el bus y puede proceder a su carga en el registro de datos. En la siguiente figura hemos representado en forma gráfica la evolución temporal de las señales en una operación de entrada
Entrada bus de datos Módulo de E/S
dato válido
Dispositivo periférico
petición dato
petición dato bus de datos dato valido
La anterior secuencia de acciones que realizan el módulo de E/S y el dispositivo periférico en una operación de entrada podemos también verlas en el siguiente diagrama:
Módulo de E/S
Periférico
"1" --> petición dato
"1" = capacitación "0" = descapacitación "Z" = alta impedancia
Dato --> bus de datos "1" --> dato válido
bus de datos--> Módulo E/S 0 --> petición dato "0" --> dato válido (listo para aceptar una nueva operación)
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
3. Mecanismos básicos de e/s: sincronización Las diferencias de velocidad entre la CPU y los periféricos de E/S, y lo que es más importante, la no previsibilidad del tiempo de respuesta de estos últimos, hace necesario un mecanismo de sincronismo que permita coordinar adecuadamente las transferencias de datos entre ambas unidades. Existen dos mecanismos básicos para sincronizar las operaciones de E/S con las de la CPU: a) Sincronización por programa b) Sincronización por interrupción El comportamiento de cada uno de estos mecanismos se resume en los dos siguientes organigramas:
no
Orden de lectura al módulo de
CPU → E/S
Leer el estado del módulo
E/S → CPU
Orden de lectura al módulo de
Leer el estado del módulo
¿estado indica orden realizada?
¿estado indica orden realizada?
CPU → E/S Ejecutar otra tarea
Interrupción E/S → CPU
no
Error
si
si Leer el dato del módulo de E/S
Escribir el dato en memoria
E/S → CPU
Leer el dato del módulo de E/S
CPU → Memoria
no
Escribir el dato en memoria
E/S → CPU
CPU → Memoria
no ¿final?
¿final?
si
E/S Programada
si
E/S por interrupción
4. E/S controlada por programa La sincronización por programa (E/S programada) es la más sencilla de implementar en un computador, sin embargo, presenta algunos inconvenientes: • • •
Pérdida de tiempo: el computador no realiza trabajo útil en el bucle de espera Impide la realización de tareas periódicas, como la exigida por el refresco de una pantalla Dificultades para atender varios periféricos
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Los dos últimos inconvenientes podrían paliarse en parte limitando el tiempo de espera, como se muestra en el siguiente organigrama: Orden de lectura al módulo de
CPU → E/S
Leer el estado del módulo
E/S → CPU
no ¿estado indica orden realizada?
no ¿límite de tiempo?
si Leer el dato del módulo de E/S
Escribir el dato en memoria
E/S → CPU
CPU → Memoria
Otras operaciones de E/S
no ¿final?
si
Ejemplos de E/S controlada por programa Determinemos el porcentaje de tiempo de ocupación de CPU de tres dispositivos que se conectan a un procesador mediante E/S programada: un ratón, un disco flexible y un disco duro. Supondremos que el número de ciclos que requiere la operación completa de E/S sobre el dispositivo es de 400, y que el procesador trabaja a 500 MHz. Se supone que se puede ejecutar la consulta del estado del dispositivo con la frecuencia necesaria para que no se pierda ningún dato, y que los dispositivos están potencialmente siempre ocupados. 1. El ratón debe ser leído 30 veces por segundo para asegurar que no se pierde ningún movimiento 2. El disco flexible transfiere datos al procesador en unidades de 16 bits, a una velocidad de 50KB/seg. No debe perderse ningún dato. 3. El disco duro transfiere datos en bloques de 4 palabras, y puede transferir a una velocidad de 4MB/seg. No debe perderse ningún dato. Ratón: Ciclos de reloj por segundo para la lectura = 30 X 400 = 12.000 ciclos por segundo Porcentaje de ciclos de procesador consumidos en la lectura = 12 x 103 / 500 x 103 = 0,002 % El resultado muestra que se podría utilizar E/S programada con el ratón, sin un impacto significativo en el rendimiento del procesador Disco flexible
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La frecuencia a la que debe realizarse la lectura será: 50KB/seg / 2 byte/acceso por encuesta = 25 K acceso por lectura/ seg. Ciclos por segundo para la lectura = 25K x 400 Porcentaje de ciclos de procesador consumidos en la lectura = 25 x 1000 x 400 / 500 x 106 = 2 % Este tiempo es importante, pero se puede tolerar en un sistema de gama baja. Disco duro Hay que realizar lectura del dispositivo a una frecuencia que coincida con el ritmo al que llegarán los bloques de 4 palabras, que es 250 K veces por segundo (4 MB por segundo / 16 bytes por transferencia). Por tanto: Ciclos consumidos para lectura = 250 K x 400 Porcentaje de ciclos de procesador consumidos en la lectura = 100 x 106 / 500 x 106 = 20 % Resultado que indica que una quinta parte del tiempo del procesador se consumirá en la lectura del dispositivo, con lo que resulta claramente inaceptable
5. E/S serie y paralelo La conexión entre el módulo de E/S y el dispositivo periférico se puede realizar en forma serie o paralela. La E/S serie utiliza una única línea de transmisión, y se emplea cuando módulo de E/S y dispositivo periférico están a una distancia media o larga y el costo del medio de transmisión resulta importante. La transmisión tiene lugar haciendo que la línea adquiera sucesivamente a lo largo del tiempo el estado de cada uno de los bits constitutivos del mensaje. El tiempo asignado a cada bit determina la velocidad de transmisión en bits/segundo o baudios.
Módulo de E/S
Dispositivo periférico
En cambio, la E/S paralela se utiliza para conectar módulos de E/S que se encuentran relativamente cerca del dispositivo periférico. Utiliza un conjunto de líneas por las que se transmiten simultáneamente (en paralelo) los bits del mensaje
Módulo de E/S
Dispositivo periférico
5.1 E/S serie Existen dos métodos para sincronizar las transmisiones en la E/S serie: • Asíncrona, que no utiliza reloj (de ahí su nombre) y que se resincroniza periódicamente con el dispositivo receptor al inicio de cada byte transmitido • Síncrona, que transmite simultáneamente la señal de datos junto con el reloj de sincronización
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
E/S serie asíncrona En este tipo de E/S no existe un reloj común entre el emisor (módulo de E/S) y el receptor (dispositivo), aunque ambos utilizan señales locales de reloj para generar (emisor) y muestrear (receptor) la información, señales con valores de frecuencia nominalmente iguales. El estado de reposo de la línea de tranmisión serie es en alta. El emisor comienza la transmisión con un bit de start de valor 0 cuyo flanco negativo detecta el receptor como inicio de una transmisión. A partir de ese momento el emisor transmite en forma serie los bits de datos de su registro de salida (que es un registro de desplazamiento) a una frecuencia marcada por su reloj local (reloj emisor). El receptor muestrea la línea con una frecuencia nominalmente igual a la del emisor sobre su registro de entrada (que es otro registro de desplazamiento). Como ambos relojes son físicamente diferente, no se evita que con el tiempo se vaya desplazando uno respecto al otro, con el risgo que si los bits transmitidos son muchos el receptor los muestree incorrectamente. Sin embargo, como emisor y receptor se resincronizan con el bit de start del siguiente caracter transmitido, y sólo se tranmite un caracter cada vez, estos deslizamientos no producen error. 1
0
1
1
R. desplazamiento (E) 10110010
0 0
1 0 R. desplazamiento (R) 10110010
reloj emisor
reloj receptor
En la siguiente figura se muestra que el reloj local del receptor muestrea la línea de transmisión en instantes de tiempo correctos, es decir, dentro del intervalo de tiempo correspondiente a un bit (intervalo bit)
R. desplazamiento (R) 10110010
reloj receptor
En cambio, si el reloj local del receptor tiene una frecuencia ligeramente inferior (mayor período), como se muestra en la siguiente figura, a partir del cuarto intervalo bit la señal será muestreada incorrectamente en el receptor.
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
R. desplazamiento (R) 10100100
reloj receptor
E/S serie síncrona La E/S serie síncrona utiliza una señal de transmisión que codifica conjuntamente la señal de información y el reloj. Por ejemplo, el código de Manchester, que se muestra en la siguiente figura, utiliza una codificación por transiciones, de tal manera que el 0 se codifica como una transición positiva y el 1 como una transición negativa. De esta forma en un intervalo bit existe al menos un cambio en la señal, con lo que se puede extraer la señal del reloj. 1
0
1
1
0
0
1
0
Codificación por nivel
Codificación Manchester Reloj decodificado
Ejemplo de módulo de E/S serie: ACIA (Asynchronous Communicatios Interface Adapter)
E/S paralela Ejemplo de módulo de E/S paralelo: VIA (Versatil Interface Adapter)
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 9: Interrupciones 1. E/S por interrupción: gestión de interrupciones 2. Tipos de sistemas de interrupciones: prioridades 3. Enmascaramiento de interrupciones. 4. Anidamiento de interrupciones 5. Ejemplos
1. E/S por interrupción: gestión de interrupciones En la E/S programada el procesador tiene que esperar un tiempo considerable a que el módulo de E/S esté preparado para realizar la operación. El procesador espera comprobando repetidamente el estado del módulo de E/S, degradándose significativamente el rendimiento de la CPU. Para evitar este inconveniente se introdujo el sistema de interrupciones en los procesadores. Básicamente una interrupción viene determinada por la ocurrencia de una señal externa que provoca la bifurcación a una dirección especifica de memoria, interrumpiendo momentáneamente la ejecución del programa. A partir de esa dirección se encuentra la rutina de tratamiento que se encarga de realizar la operación de E/S propiamente dicha, devolviendo después el control al punto interrumpido del programa. Programa principal I1 I2 . . .Ii Ii+1 .
señal de interrupción línea de interrupción
.
.In Rutina de tratamiento i1 i2 . . im
Podemos, pues, ver una interrupción como un salto a subrutina (rutina de tratamiento) ocasionado por una señal externa, y no por una instrucción del programa. De esta forma se pueden eliminar los tiempos muertos de consulta de la E/S programada La implementación de un sistema de interrupciones implica introducir una fase de consulta de las líneas de interrupción al final de la ejecución de cada instrucción. En un procesador sin sistema de interrupciones, se podría conseguir un efecto similar introduciendo una instrucción de consulta y la correspondiente de salto sobre el valor de la consulta, detrás de cada instrucción natural del programa. De esta forma se garantizaría la respuesta al dispositivo de E/S en el momento que pasa a estado disponible, al tiempo que la CPU ejecuta instrucciones útiles del programa. El precio a pagar sería el recargo introducido por la ejecución de las parejas de instrucciones de consulta y salto introducidas detrás de cada instrucción útil del programa. Sería algo así como una E/S programada en la que en lugar de preguntar en el mismo punto del programa por el estado del periférico, se replica la consulta por todo el programa, intercalándose con la ejecución de las instrucciones útiles. Pues bien, un sistema de interrupciones podemos verlo como la integración en hardware del supuesto software anterior, es decir, la integración de la consulta y posible salto dentro de la ejecución de cada instrucción del repertorio.
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El mecanismo de interrupción de un procesador tiene que implementar todas las medidas que hagan que se pueda bifurcar a la rutina de tratamiento y recuperar el estado del programa interrumpido cuando la rutina finaliza su ejecución. En el siguiente esquema se detallan las fases que tienen lugar en la atención a una interrupción producida por algún dispositivo periférico: petición de interrupción 1
programa
3
9
2
programa
4
5 rutina de tratamiento 6
7
8
(1) El programa en ejecución (CPU) activa el sistema de interrupciones utilizando instrucciones que operan (ponen a 1 y a 0) sobre el bit de capacitación de las interrupciones I del registro de estado (RE): STI
I <--1;
CLI I <-- 0
Registro de Estado (RE) I
C
N
Z
bit de interrupción
(2) Se produce la petición de interrupción por parte de algún dispositivo periférico en un instante de tiempo impredecible para la CPU. CPU
PC
1
señal de interrupción
línea de interrupción (INT)
RE
(3) La CPU finaliza la ejecución de la instrucción en curso. (4) La CPU salva automáticamente el estado en la pila, es decir, el contador de programa (PC) y el registro de estado (RE):
2
Estructura de Computadores, Facultad de Informรกtica, UCM, Curso 04-05
CPU
Memoria
PC
SP PC
1
1
RE
RE
(5) La CPU obtiene la direcciรณn de la rutina de tratamiento a partir del vector de interrupciรณn (VI), que usualmente se ubica en memoria. CPU
Memoria
PC
vector de interrupciรณn direcciรณn r.t.
1
RE
(6) La CPU descapacita las interrupciones (I = 0) para que durante la ejecuciรณn de la primera instrucciรณn de la rutina de tratamiento no se vuelva a detectar la misma interrupciรณn y provoque un bucle infinito. CPU
PC
0
RE
(7) La CPU ejecuta la rutina de tratamiento de la interrupciรณn que realiza lo siguiente: โ ข โ ข โ ข
Salva en la pila los registros a utilizar Realiza la operaciรณn de Entrada/Salida Restaura desde la pila los registros utilizados
(8) Finaliza la rutina de tratamiento con la ejecuciรณn de la instrucciรณn de retorno de interrupciรณn (RTI), que restaura automรกticamente el estado de la CPU desde la pila y vuelve al programa interrumpido:
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CPU
Memoria
PC PC 1
RE
1
RE
SP
(9) La CPU continúa la ejecución del programa interrumpido, quedando las interrupciones capacitadas automáticamente al recuperarse el valor I = 1 del RE.
2. Tipos de sistemas de interrupciones: prioridades Clasificaremos las interrupciones atendiendo a dos criterios independientes: la fuente que produce la interrupción, y el modo de obtener la dirección de la rutina de tratamiento o vector de interrupción. a) Atendiendo a la fuente que produce la interrupción:
Interrupciones hardware ♦ Internas: producidas por la CPU • división por cero • desbordamiento • instrucción ilegal • dirección ilegal • logaritmo de cero • raíz cuadrada de negativos • etc. ♦ Externas: producidas por los dispositivos de E/S • vectorizadas • no vectorizadas
Interrupciones software: producidas por la ejecución de instrucciones de la CPU.
b) Atendiendo al modo de obtener el vector de interrupción:
Interrupciones autovectorizadas: el vector de interrupción es fijo, una posición de memoria asociada a la línea de interrupción.
Interrupciones vectorizadas: el vector de interrupción o parte de él lo suministra el propio periférico cuando se le reconoce la interrupción. El método usual de obtener la dirección de la rutina de tratamiento de la interrupción en ambos casos es a través de la tabla de vectores de interrupción, tabla que contiene las direcciones de las rutinas de tratamiento de cada interrupción.
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Memoria Tabla de vectores de Interrupción
d.r.t. interrupción
0
d.r.t. interrupción
1
d.r.t. interrupción
2
d.r.t. interrupción
3
d.r.t. interrupción
i
Autovectorizadas
vector de interrupción
Vectorizadas d.r.t. interrupción N-1 d.r.t. interrupción N
2.1 Interrupciones autovectorizadas Disponen de una línea única de petición interrupción a la que se pueden conectar más de un dispositivo periférico, efectuándose en el punto de conexión la función lógica OR. El vector de interrupción para esta línea ocupa una posición fija de la tabla de vectores de interrupción. Cuando uno o más de los dispositivo periféricos conectados a la línea genera una señal de interrupción, la CPU debe identificar por software el dispositivo causante de la interrupción, y en caso de ser varios, establecer el orden de prioridad entre ellos. La identificación se realiza consultando los registros de estado locales de cada módulo de E/S. línea única de interrupción INT
CPU E/S 1 INT
E/S 2 estado
control
INT
E/S n estado
control
INT
estado
control
La OR-cableada en la línea de interrupción INT se realiza normalmente con tecnología de transistores con colector abierto. Por ello normalmente la señal activa de interrupción es en baja.
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
+5Vcc INT
E/S 1
INT
E/S 2
estado
INT
E/S n
estado
INT
estado
La rutina general de tratamiento asociada a la línea de interrupción comienza su ejecución identificando por encuesta el periférico causante de la interrupción, para bifurcar después a la rutina de tratamiento específica de dicho periférico, en donde se realiza la operación de E/S propiamente dicha:
Leer estado de E/S 1
Programa
INT activo
Rutina de tratamiento E/S 1
Eliminar fuente de interrupción
interrupción Leer estado de E/S n
RTI
INT activo
RTI
Rutina de tratamiento E/S n
Eliminar fuente de interrupción
RTI
2.2 Interrupciones vectorizadas:
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• • •
Disponen de dos líneas de interrupción, una de petición y otra de reconocimiento. El vector de interrupción es generado por el dispositivo que produce la interrupción. Utiliza un mecanismo de daisy chaining en la transmisión de la señal de reconocimiento.
línea de petición de interrupción
INT
bus de datos línea de reconocimiento de interrupción
RINT
vector
CPU
E/S
1
INT1
E/S
estado
2
E/S
n
estado
INTn
estado
INT2
control
control
+
control
prioridad
-
El proceso de interrupción se desarrolla en los siguientes pasos: 1. 2. 3. 4. 5.
El dispositivo de E/S genera la petición de interrupción activando INT. La CPU la reconoce activando RINT. Los dispositivos de E/S que reciben RINT y no han interrumpido, la transmiten al siguiente elemento de la cadena. El dispositivo de E/S que recibe RINT y ha realizado la petición coloca el vector de interrupción n en el bus de datos. A partir del vector n la CPU bifurca a la rutina de tratamiento correspondiente al dispositivo.
La lógica interna del paso de la señal de reconocimiento por encadenamiento (daisy chain) para cada módulo se representa en la siguiente figura:
INT
CPU vector INT INT
RE
RINT
2.3 Prioridades
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Cuando dos o más dispositivos de E/S generan una petición de interrupción, el sistema de prioridades determina la interrupción que se atiende en primer lugar. Interrupciones no vectorizadas: la prioridad la establece el software de encuesta con el orden de recorrido de todos los dispositivos de E/S salida conectados a una línea. Es decir, se establece por software. Interrupciones vectorizadas: la prioridad la determina el orden de proximidad a la CPU establecido por la línea de retorno de interrupción Es decir, se establece por hardware. Cuando existen más de una línea de interrupción, la prioridad viene establecida por hardware en el diseño del procesador: INT1 INT2 . . . INTn
prioridad
CPU
En ocasiones, cada línea de interrupción tiene su propia señal de reconocimiento:
RINT3 INT3
CPU
E/S 1
RINT3
INT3
E/S 1
RINT3 INT3
E/S 1
Aunque suele ser frecuente, para minimizar el número de pines del chip, que las diferentes líneas entren codificadas a la CPU, siendo necesario el uso de un codificador externo:
INT1 INT2 . . . INTm
COD
INTn-1 INTn
m = log2 n CPU m
INT1 INT2 INT3
RINT (reconocimiento) código reconocido
En estos casos suele existir una única señal de reconocimiento RINT, generándose por las líneas menos significativas del bus de direcciones el código de la interrupción reconocida, que será la más prioritaria entre las que realizaron la petición.
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
3. Enmascaramiento de interrupciones El sistema de interrupciones de un procesador dispone en general de la posibilidad de ser inhibido, es decir, impedir que las interrupciones sean atendidas por la CPU. Esta posibilidad hay que utilizarla en determinadas ocasiones en las que por ningún concepto se puede interrumpir el programa en ejecución. Además de la inhibición total del sistema, existe la posibilidad de enmascarar individualmente algunas de las líneas de interrupción utilizando un registro de máscara: CPU RE
I
0 Unidad de Control
DEC Prioridad
1 1 0
INT 0 INT 1 INT 2 INT 3
Registro de Máscara
La descapacitación de algunas interrupciones también se puede realizar a nivel local del propio módulo de E/S, actuando sobre su registro de control. A nivel software también se pueden inhibir las interrupciones producidas sobre una misma línea por diferentes periféricos, en la fase de identificación de la rutina de tratamiento correspondiente. 4. Anidamiento de interrupciones Un tema importante en un sistema de interrupciones es el de la capacidad de anidar interrupciones, es decir, la posibilidad de interrumpir la rutina de tratamiento de una interrupción por la generación de otra interrupción. Tal posibilidad viene determinada por el sistema de prioridades: "un dispositivo sólo puede interrumpir a otro cuando su nivel de prioridad es mayor que el que se está atendiendo". Programa
INT2
Rutina INT2
INT4
Rutina INT4
Rutina INT7
INT7
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Para describir con más detalle la forma en que opera la combinación de las prioridades y el anidamiento en un sistema de interrupciones, consideremos una CPU con tres líneas de interrupción: INT0, INT1, INT2, siendo la primera la más prioritari, y la última la menos prioritaria. Supongamos que llegan tres peticiones de interrupción en el orden temporal del siguiente esquema: prioridad
CPU INT0 INT1 prioridad INT2 tiempo
La CPU dispone de tres bits en su registro de estado para permitir la inhibición de forma independiente cada línea:
Si INTi = 0 nivel capacitado
INT0
INT1
INT2
Si INTi = 1 nivel descapacitado
Las interrupciones con menor prioridad no podrán interrumpir la rutina de tratamiento de una de mayor prioridad, por lo que la secuencia de peticiones y servicios será la que aparece en el siguiente esquema:
d1
Programa
Rutina INT1
dir1 dir1+1
INT2
d0
Rutina INT0
INT0
INT1
dir dir+1 d2 Rutina INT2
La evolución consiguiente de la pila y el estado de la CPU (CP y RE) será el siguiente:
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
llega INT1
llega INT2
llega INT0
fin INT0
fin INT1
atiende INT2
fin INT2
dir1+1 011 dir+1
Pila
dir+1
000 CP
d1
d1+ n 011
RE
000
011
d0
dir+1 000 dir1+1
111
dir+1 000 dir+1
011
000
d2
dir+1 001
000
6.
Ejemplos de sistemas de interrupciones Estudiaremos en este apartado de forma general los sistemas de interrupciones de dos micrprocesadores, uno de 8 bits, el MC 6809, y otro de 16, el MC 68000. Con el primero estudiaremos la forma de multiplicar una línea de interrupción autovectorizada en varias, también autovectorizadas, utilizando un dispositivo hardware. Con el segundo veremos un sistema de interrupciones más complejo en el que coexisten las interrupciones autovectorizadas y vectorizadas.
6.1 Sistema de interrupciones del microprocesador MC 6809 El MC 6809 dispone de las siguientes líneas de interrupción: Línea IRQ FIRQ NMI RESET
Prioridad Baja ⏐ ↓ Alta
Dirección Rutina FFF8 – FFF9 FFF6 – FFF7 FFFC – FFFD FFFE - FFFF
Bit de máscara en RE I F No enmascarable No enmascarable
Comportamiento Salva todos los registros Salva CP y RE Salva todos los registro No salva registros
Veremos como se puede transformar la línea IRQ en 8 líneas de interrupción diferentes. Para ello se aprovecha el que cuando se produce una interrupción por esta línea y es atendida por la CPU, ésta accede a su vector de interrupción que se encuentra en las direcciones FFF8 y FFF9, lo que significa que en el bus de direcciones aparecerán estas direcciones. Sólo en respuesta a una interrupción por IRQ se generan estas direcciones en el bus, por lo que podemos identificarla por hardware y descomponerla en 8 pares diferentes, una por cada línea nueva de interrupción. El esquema completo de un dispositivo que realiza esta conversión lo hemos representado en la siguiente figura. El dispositivo se selecciona cuando se activa la señal CS, por lo que esta señal deberá generarse cuando en el bus aparezcan las direcciones FFF8 y FFF9. Cuando eso ocurra, el dispositivo transformará las 4 líneas menos significativas del bus de direcciones (A4,A3,A2,A1) en otras 4 (Z4,Z3,Z2.Z1) de manera que en las Zi se genere uno de los 8 pares de las nuevas direcciones, el correspondiente a la línea INTi activada de mayor prioridad.
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
INT7 INT6 INT5 INT4
Rgist r o De P et ición
P r ior ida d y Má sca r a
Vector
INT3 INT2 IRQ
INT1 INT0 R/W CS E
Selección y Con t rol Z4
A4 Lógica com bin a cion a l
A3
Z3 Z2 Z1
A2 A1
La tabla de transformación de direcciones sería, pués, la siguiente: Dirección entrada A16....A4 A3 A2 A1
FFF8 – FFF9
Línea 1 INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
Dirección salida A16....Z4 Z3 Z2 Z1 FFE6 – FFE7 FFE8 – FFE9 FFEA – FFEB FFEC – FFED FFEE – FFEF FFF0 – FFF1 FFF2 – FFF3 FFF4 – FFF5
La disposición del controlador de interrupciones respecto a la CPU y la memoria se muestra en el siguiente esquema:
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CP U IRQ
INT7 INT6 INT5 INT4 INT3 INT2 INT1 INT0
IRQ
Co n tro la d o r de In te rru p c io n e s A4 A3 A2 A1
Z4 Z3 Z2 Z1
CS
Mem or ia A5,...A16
A5,...A16
D0,...D7
6.2 Sistema de interrupciones del microprocesador MC 68000 En el MC 68000 las interrupciones se generalizan al concepto de excepción, que incluye las interrupciones hardware de E/S propiamente dichas, las producidas por eventos internos en la CPU, y las producidas por software. Líneas de interrupción Las excepciones de E/S llegan a la CPU en forma codificada a través de tres líneas externas: IPL2, IPL1, IPL0, que codifican la ausencia de excepción (111), y 7 niveles con prioridad (000 el más prioritario y 110 el menos prioritario). VP A
IPL2 IPL1 IPL0
CP U 68000 FC2 = 1 FC1 = 1 FC0 = 1 A3 A2 A1
Una cuarta línea, VPA, determina si los siete niveles de las líneas IPLi codifican una excepción autovectorizada (VPA = 0) o vectorizada (VPA = 1). En el primer caso el vector de excepción es fijo para cada nivel, y en el segundo lo determina el periférico y lo transmite por las 8 líneas menos significativas del bus de datos cuando le llega la señal de reconocimiento procedente de la CPU, que corresponde al valor 111 de las señales de estado FC2, FC1, FC0. El número de la línea vectorizada reconocida lo genera la CPU a través de las líneas del bus de direcciones A3, A2, A1. Por ello, es necesario complementar con circuitería lógica externa el sistema, tal como aparece en el siguiente esquema:
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
VP A
COD
IPL2 IPL1 IPL0
n ivel n ivel n ivel n ivel n ivel n ivel n ivel
7 6 5 4 3 2 1
n ivel n ivel n ivel n ivel n ivel n ivel n ivel
7 6 5 4 3 2 1
7 líneas autovectorizadas
7 líneas vectorizadas
CP U 68000 Señ a l de r econ ocim ien t o globa l pa r a excepcion es vect or iza da s
FC2 FC1 FC0
Señ a l de r econ ocim ien t o in dividu a l pa r a ca da n ivel
A3 A2 A1 IN TA1 IN TA2 IN TA3 IN TA4 IN TA5 IN TA6 IN TA7
DE COD
Enmascaramiento Los bits I2,I1,I0 del registro de estado codifican los niveles inhibidos por la CPU, de acuerdo a la siguiente tabla:
I2 I1 I0 Niveles inhibidos 0 0 0 Ninguno 0 0 1 Nivel 1 0 1 0 Niveles 1 al 0 1 1 Niveles 1 al 1 0 0 Niveles 1 al 1 0 1 Niveles 1 al 1 1 0 Niveles 1 al 1 1 1 Niveles 1 al El nivel 7 no es enmascarable
T
S
I2
2 3 4 5 6 6
I1
I0
X
N
Z
V
C
Vectores de excepción
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Los vectores de excepción son posiciones de memoria donde la CPU obtiene la dirección de la rutina de tratamiento de la excepción. En el MC 68000 existen 255 vectores que se agrupan en la tabla de vectores de excepción ubicada en la zona más baja de memoria (desde la dirección 0 a la 1020 en decimal). Cada vector ocupa 2 palabras (4 bytes) excepto el vector de RESET que ocupa 4 palabras, 2 para el CP y las otras 2 para el SP, y se identifica con un número de 8 bits (en decimal del 0 al 255, excepto el 1, que corresponde a la segunda mitad del 0, que es el de RESET). La dirección real se obtendrá multiplicando por 4 el número de vector. El número de vector lo genera la CPU (excepciones autovectorizadas) o el periférico (excepciones vectorizadas).
Nº de vector 0 1 1 3 4 5 6 . . . 25 26 27 28 29 30 31 . . . 64 . . . 255
Tabla de vectores de excepción Asignación RESET (CP inicial) RESET (SP inicial) error del bus dirección no existente instrucción ilegal división por cero instrucción CHK (entero fuera de rango)
autovector nivel 1 autovector nivel 2 autovector nivel 3 autovector nivel 4 autovector nivel 5 autovector nivel 6 autovector nivel 7
192 vectores de excepción de usuario
Ejemplo de conexión de periféricos Para finalizar veamos el esquema completo de conexión de periféricos al sistema de excepción del MC 68000. Se han conectado tres periférico de forma encadenada (daisy chain) a la línea vectorizada de nivel 3.
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Periférico 1
Periférico 2
IPL2
nivel 7 nivel 6 nivel 5 nivel 4 nivel 3 nivel 2 nivel 1
COD
VPA
nivel 7 nivel 6 nivel 5 nivel 4 nivel 3 nivel 2 nivel 1
IPL1 IPL0
autovectorizadas
vectorizadas
CPU 68000
FC2 FC1
Periférico 3
FC0
NUMERO DE VECTOR
A3
Periférico 4
A2 A1
CIRCUITO LOGICO BUS DE DIRECCIONES
INTA1 INTA2 INTA3 INTA4 INTA5 INTA6 INTA7
Periférico 5
BUS DE DATOS
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 10: E/S de alta velocidad 1. E/S por acceso directo a memoria (DMA): motivación 2. Estructura y funcionamiento de un controlador de DMA 3. Procesadores de e/s: tipos y estructura. 4. Programas de operación de los procesadores de e/s.
1. E/S por acceso directo a memoria (DMA): motivación La E/S por interrupciones ocupa menos tiempo de CPU que la E/S controlada por programa. Sin embargo, con cualquiera de las dos alternativas las transferencias de datos deben pasar a través de la CPU. Esto significa que la velocidad de las transferencias está limitada por la velocidad a la que la CPU atiende el dispositivo periférico, ya que tiene que gestionarlas ejecutando una serie de instrucciones. En la E/S controlada por programa la CPU está dedicada exclusivamente a la E/S, transfiriendo los datos a relativa velocidad, pero al precio de dedicarse a ello a tiempo completo. Las interrupciones liberan en buena medida a la CPU de la gestión de las transferencias, a costa de disminuir su velocidad, pues la rutina de servicio de las interrupciones contiene por lo general instrucciones ajenas a la propia transferencia. Ambos procedimientos manifiestan, pues, ciertas limitaciones que afectan a la actividad de la CPU y la velocidad de transferencia. Para poner de manifiesto de forma cuantitativa las limitaciones de la E/S programada y por interrupción, consideremos los dos siguientes supuestos: Supuesto 1: conexión de un periférico lento, una impresora láser. La CPU opera a 200 Mhz. y su CPI vale 2. La impresora opera a 20 páginas/minuto, con 3.000 caracteres (bytes) por página. Se trata de imprimir un bloque de 10 Kbytes ubicado en la memoria.
200 Mh z CP I = 2
Mem or ia
CP U
10 Kby te s
Módu lo E /S
20 pa g./m in. 1 pa g = 3000 bytes
a) E/S programada Una instrucción tarda en ejecutarse 2 * 5 ns = 10 ns, ya que el tiempo de ciclo Tc = 1/Frecuencia = 1/200*106 seg. = 1/200*106 * 10-9 ns = 5 ns. La impresora imprime 20 * 3.000 = 60.000 caractéres/minuto = 1.000 caracteres/segundo = 1 Kbyte/s. Luego los 10 Kbytes los imprimirá en 10 segundos. La CPU está ocupada durante 10 segundos b) E/S por interrupción Para este caso habrá que conocer el número de instrucciones que se ejecutan dentro de la rutina de tratamiento de la interrupción. Supondremos que son 10 las instrucciones (3 para
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
salvar contexto, 2 para comprobar el estado y bifurcar, 1 para la transferencia, 3 para restaurar contexto, y 1 para retorno de interrupción, RTI). La impresora genera una interrupción cada vez que está preparada para recibir un nuevo caracter. Para transferir los 10 Kbytes se producirán 10.000 interrupciones, lo que significa ejecutar 100.000 instrucciones. Luego la CPU se ocupa durante 105 * 10 ns = 106 ns = 106 * 10-9 s. = 0,001 s. = 1 milisegundo. La E/S por interrupción ha reducido en 10.000 veces el tiempo que la CPU está ocupada en atender la impresora. Sin embargo, la velocidad de la operación de E/S no ha cambiado, como era de esperar al estar dominada por la velocidad del periférico. Supuesto 2: conexión de un periférico rápido, un disco magnético. La CPU opera igual que en caso anterior, es decir, a 200 Mhz y su CPI vale 2. El disco opera a una velocidad de transferencia de 10 Mbytes/s. Se trata en este caso de transmitir un bloque de 10 Mbytes de la memoria al disco.
200 Mh z CP I = 2
CP U
Mem or ia Módu lo E /S 10 Mby t e s
10 Mbyt es/s 10 Mby t e s
c) E/S programada A la velocidad de 10 Mbytes/s el disco tarda 1 segundo en recibir los 10 Mbytes, y como por E/S programada la CPU envia un byte cada vez que el disco está preparado para recibirlo, la CPU está ocupada en la tranferencia durante 1 segundo. d) E/S por interrupción Seguimos suponiendo que la rutina de tratamiento ejecuta 10 instrucciones. Como ahora se transmiten 107 bytes se producirán otras tantas interrupciones, lo que significa que la CPU ejecuta en toda la operación 107 * 10 = 108 instrucciones. Por tanto el tiempo total de ocupación de la CPU en la transferencia de E/S será 108 instrucciones * 10 ns/instrucción = 109 ns = 1 segundo. Luego en el supuesto 2 las interrupciones no ahorran tiempo de CPU en la operación de E/S frente a la E/S programada. La razón está en que se ha llegado al límite de velocidad que es capáz de soportar la línea de interrupción del supuesto (1 byte cada 100 ns). Por encima de los 10 Mbytes/s la E/S por interrupción perdería datos puesto que se presentaría un nuevo byte antes de haber finalizado la rutina de tratamiento del byte anterior. La E/S programada todavía admitiría mayor velocidad puesto que no tendría que ejecutar las instrucciones de guarda y restauración del contexto ni la instrucción RTI. El bucle de la E/S programada ejecutaría sólo 3 instrucciones (2 para comprobar el estado y bifurcar, 1 para la transferencia), es decir tardaría 30 ns en lugar de los 100 ns que tarda la rutina de tratamiento de la interrupción. Por tanto podría llegar hasta el límite de 30 ns/byte, es decir, 33 Mbytes/segundo
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Por tanto, cuando se tienen que transferir grandes cantidades de datos y a una elevada velocidad, es necesario disponer de una técnica que realice de forma más directa las transferencias entre la memoria y el dispositivo periférico, limitando al máximo la intervención de la CPU. Esta técnica se conoce con el nombre de acceso directo a memoria (DMA: Direct Memory Access). Básicamente se trata de un módulo con capacidad para leer/escribir directamente en la memoria los datos procedentes/enviados de/a los dispositivos periféricos. Para ello solicita la correspondiente petición a la CPU. Antes de que la CPU conceda acceso a memoria al DMA, pone en estado de alta impedancia su conexión a los buses del sistema (datos, direcciones y R/W), lo que es equivalente a desconectarse de la memoria durante el tiempo que es gestionada por el DMA. Cuando finaliza la operación de E/S el DMA genera una interrupción y la CPU vuelve a tomar control de la memoria. De esta forma la velocidad de transferencia sólo estarán limitadas por el ancho de banda de la memoria.
petición concesión
Acceso Directo a Memoria (DMA)
Módulo E/S
Control
MAR
B. DIR
MEMORIA CPU
MDR
B. DATOS
2. Estructura y funcionamiento de un controlador de DMA Para gestionar las transferencias de información, un controlador de DMA dispone de 3 registros: datos, dirección y contador de palabras. El registro de dirección almacena la dirección de la siguiente palabra a transmitir, incrementándose de forma automática después de cada transferencia. El contador de palabras almacena el número de palabras que quedan por transmitir y también se decrementa automáticamente después de cada transferencia. La lógica de control comprueba el contenido del contador de palabras y finaliza la operación cuando alcanza el valor 0. Un decodificador se encargará de identificar la dirección de memoria asignada al DMA. La CPU debe enviar, pues, la siguiente información al DMA cuando quiera realizar una operación de E/S: • • • •
El sentido de la operación de E/S: lectura o escritura La dirección del periférico La posición de memoria donde comienza el bloque a leer o escribir El número de palabras que componen el bloque
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Transmitida esta información, la CPU pasa a realizar otra tarea, delegando totalmente la operación de E/S al DMA. El DMA transfiere directamente, palabra a palabra, el bloque de datos entre el periférico y la memoria, sin pasar por la CPU. Cuando la transferencia finaliza el DMA envía una señal de interrupción a la CPU. r/w bus de datos bus de direcciones
CPU
Memoria
Contador de palabras
petición concesión interrupción
Dirección de memoria
Registro de datos
r/w Lógica de control
DEC
DMA
Dispositivo periférico
Para poder transferir a/desde la memoria, el DMA necesita controlar el bus durante un tiempo suficiente para completar la transferencia. Sin embargo, este tiempo no tiene que ser continuo, puede fraccionarse en pequeños intervalos que se alternan con la CPU. Existen diferentes alternativas en la forma de controlar el bus. Cada alternativa supone un compromiso diferente entre velocidad de transferencia y actividad de la CPU. El empleo de una alternativa en concreto dependerá de las prestaciones que se deseen y de las características del procesador que se utilice. Son las siguientes: •
Ráfagas: el DMA toma control del bus y no lo libera hasta haber transmitido un bloque de datos completo. Con este método se consigue la mayor velocidad de transferencia pero puede dejar sin actividad a la CPU durante períodos grandes de tiempo. In st r u cción 1
In st r u cción 2
Ciclo DMA
•
Ciclo DMA
Robo de ciclos: el DMA toma control del bus y lo retiene durante un solo ciclo. Transmite una palabra y libera el bus. Es la forma más usual de transferencia y en ella se dice que el DMA roba ciclos a la CPU.
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
In st r u cción 1
In st r u cción 2
Ciclo DMA
•
Ciclo DMA
Transparente: el DMA accede al bus sólo en los ciclos en los que la CPU no lo utiliza. Y esto ocurre en diferentes fases de ejecución de las instrucciones. De esta forma la ejecución del programa no se ve afectado en su velocidad de ejecución.
• In st r u cción Bú squ eda
Decodifica ción
Ciclo DMA
Bú squ eda
E jecu ción
Alm a cen a m ien t o
Ciclo DMA
En los sistemas con memoria cache también se puede aprovechar el acceso de la CPU a la cache para que el DMA pueda acceder simultáneamente a la memoria principal. En resumen, los pasos que se siguen en la transferencia mediante DMA son: 1. La CPU ejecuta las instrucciones de E/S que cargan los registros de dirección y contador de palabras del controlador de DMA. El registro de dirección debe contener la dirección base de la zona de memoria principal que se va a utilizar en la transferencia de datos. El registro contador de palabra almacena el número de palabras que se transfieren desde/hacia la memoria. 2. Cuando el controlador de DMA está preparado para transmitir datos, activa la línea de petición. La CPU espera a un punto de concesión del DMA, renuncia al control de los buses de datos y direcciones y activa la línea de reconocimiento de DMA. 3. El DMA transfiere directamente los datos a/desde memoria principal por alguno de los métodos que se acaban de ver. Después de transferir una palabra, el registro de dirección y el registro contador de palabras del controlador se incrementa y decrementa respectivamente. 4. Si el contenido del registro contador de palabra no es 0, pero el preparado para enviar o recibir los siguientes datos, el DMA devuelve liberando el bus del sistema y desactivando la línea de petición. desactivando la línea de reconocimiento de DMA y continuando normal.
periférico no está el control a la CPU La CPU responde con su operación
5. Si el contenido del contador de palabras es 0, el controlador de DMA renuncia al control del bus del sistema y envía una señal de interrupción a la CPU.
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El DMA, se puede configurar de diferentes formas: •
Bus único (DMA independiente): todos los módulos comparten el bus del sistema. El DMA, que actúa en sustitución de la CPU, intercambia datos entre la memoria y el periférico utilizando un procedimiento análogo al de E/S controlada por programa, es decir, hace de intermediario entre ambas unidades.
CPU
DMA
E/S
E/S
Memoria
Esta configuración, aunque puede ser muy económica, es claramente poco eficaz, ya que cada transferencia de una palabra consume 2 ciclos del bus. •
Integración de funciones DMA-E/S: reduce a 1 el número de ciclos de utilización del bus. Esto significa que hay un camino entre el controlador de DMA y uno o más controladores de E/S que no incluyen al bus del sistema.
CPU
DMA
DMA
Memoria
E/S E/S
E/S
La lógica del DMA puede ser una parte de un controlador de E/S o puede ser un módulo independiente que controla a uno o más controladores de E/S. •
Bus de E/S conectado al DMA: El concepto anterior se puede generalizar si se utiliza un bus de E/S para conectar los controladores de E/S al DMA. Esta alternativa reduce a una el número de interfaces de E/S en el DMA, y proporciona una configuración fácilmente ampliable.
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
bus del sistema
CPU
DMA
Memoria bus de E/S
E/S
E/S
E/S
3. Procesadores de E/S: tipos y estructura. Como hemos visto en los 2 temas anteriores y en los primeros apartados de este tema, la E/S de los computadores ha experimentado una continua evolución. Comenzó con la E/S controlada por programa. Le siguió la introducción de las interrupciones para evitar que la CPU malgastase su tiempo esperando la realización de las operaciones de E/S, aumentando el rendimiento global del sistema. Posteriormente se introduce en el controlador de E/S la capacidad para acceder directamente a memoria a través del DMA. De esta forma se pueden transferir bloques de datos a/desde memoria sin intervención de la CPU, excepto al comienzo y al final de la transferencia. Pero este proceso de evolución de la E/S no termina en el DMA. En el paso siguiente se potencia la capacidad del controlador de E/S hasta convertirlo en un procesador con un conjunto de instrucciones especializadas en operaciones de E/S. La CPU traduce las operaciones de E/S en órdenes dirigidas al procesador de E/S (PE/S) para que ejecute un programa de E/S residente en memoria. El PE/S ejecuta ese programa sin la intervención de la CPU y sólo se interrumpe cuando se ha ejecutado la secuencia completa. A los procesadores de E/S se les suele denominar también con el nombre de canales de E/S. No obstante los dos términos se emplean de forma indistinta.
CPU
MEMORIA bus del sistema
PE/S1
PE/S2
Periférico
CONTROL E/S
Periférico
CONTROL E/S
Periférico
CONTROL E/S
Periférico
CONTROL E/S
bus Periférico
CONTROL E/S
E/S1
bus Periférico
E/S2
CONTROL E/S
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Un PE/S representa, pues, una extensión del concepto DMA. Un PE/S tiene la capacidad de ejecutar instrucciones de E/S, lo que le da un control completo sobre dicha operación. En los computadores que incluyen PE/S, la CPU no ejecuta las instrucciones de E/S, éstas se almacenan en memoria principal para ser ejecutadas por un PE/S. Así, la CPU inicia una transferencia de E/S al dar una orden al PE/S para que ejecute un programa en memoria. El programa especifica entre otras cosas las siguientes: • • •
El periférico (o periféricos) que interviene en la operación de E/S. Las zonas de memoria utilizadas en la transferencia Las acciones a realizar si se producen ciertas condiciones de error durante la transferencia.
ME MOR IA P r ogr am a E /S -
CP U
P rogr a m a de ca n a l
P rocesa dor de E /S ó can a l
P er ifér ico
Las comunicaciones entre la CPU y el procesador de E/S a lo largo de la ejecución de una operación de E/S podemos resumirlas en el siguiente esquema:
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CPU
Solicita el estado del P /S
Si el estado es válido emite la orden de inicio de la operación de E/S
La CPU continúa la ejecución de otro programa
Solicita el estado al P E/S
Comprueba que la operación de E/ S ha sido correcta
Procesadaor de E/S
Envía a memoria la palabra de estado
Accede a Memoria para leer comandos del programa de E/S
Accede a Memoria para transferir por DMA bloques de datos
Interrumpe a la CPU cuando ha finalizado el programa de E/S
Transfiere a memoria el estado de realización del programa de E/S
3.1 Tipos de procesadores de E/S o canales Existen tres tipos de PE/S o canales: • • •
Canales multiplexores Canales selectores Canales multiplexores por bloques
Canal multiplexor Un canal multiplexor se utiliza para conectar dispositivos de velocidad baja y media. Son capaces de transferir datos a velocidades mayores que las de los dispositivos individuales
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
conectados al canal. Esto les permite operar en forma multiplexada sobre varios dispositivos de E/S.
Ca n a l Mu lt iplexor
Con t r ola dor E /S
Con t r ola dor E /S
Con t r ola dor E /S
Con t r ola dor E /S
En la siguiente figura aparece la organización interna de un canal multiplexor. Los parámetros correspondientes a la operación de cada dispositivo se ubican en posiciones fijas de la memoria principal. Cuando el canal direcciona un dispositivo particular, busca previamente los parámetros en memoria y los lleva a los registros de uno de los subcanales. Cuando el dispositivo se desconecta, los valores actualizados se llevan de nuevo a memoria. El número de subcanales disponibles en el sistema determina el número máximo de operaciones de E/S que pueden mantenerse simultáneamente.
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Su bca n a l 1
Su bca n a l 2
Su bca n a l n
n º pa la br a s
n º pa la br a s
n º pa la br a s
dir ección
dir ección
dir ección
con t r ol
con t r ol
con t r ol
Bu ffer de da t os
Con t r ol del ca n a l
Canal selector Un canal selector controla múltiples dispositivos de alta velocidad. En cualquier instante de tiempo está dedicado a la transferencia de datos con uno sólo de estos dispositivos. El PE/S selecciona un dispositivo y efectúa la transferencia de datos completa.
Ca n a l Select or Con t rola dor E /S
Con t rola dor E /S
Canal multiplexado por bloques Este tipo de canal combina las características de los canales multiplexores con las de los selectores. Permite la multiplexación de varias operaciones de E/S de alta velocidad, bloque por bloque. Las ventajas obtenidas a través del empleo de canales multiplexados por bloques, en comparación con las de los canales selectores, surgen de la naturaleza de la operación de dispositivos de E/S tales como discos y cintas magnéticas. Una operación común con una unidad de disco puede requerir la siguiente secuencia de comandos: • Localización de pista(mover la cabeza de lectura/escritura a una pista dada). • Búsqueda de un sector específico. • Inicio de la lectura de los datos contenidos en el sector.
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Debido al considerable retraso mecánico involucrado en las primeras dos operaciones, no es adecuado mantener ocupado el canal durante esta secuencia, lo que sería el caso con un canal selector. Un canal multiplexor por bloques puede enviar a la unidad de disco la orden de localización de pista y después desconectarse para dar servicio a otros dispositivos de E/S. Cuando se completa la operación de localización de pista, el canal se vuelve a conectar, envía la orden de búsqueda del sector y se desconecta de nuevo. Al terminar la búsqueda de sector, el canal inicia la transferencia del sector y permanece conectado hasta que finaliza la operación. El uso de un canal multiplexor por bloques da como resultado una mejora importante en la productividad, en comparación con los canales selectores. 4. Programas de operación de los procesadores de E/S. En un DMA simple los parámetros relacionados con las transferencias de datos se cargan en los registros correspondientes utilizando instrucciones de E/S. En máquinas grandes que utilizan canales de E/S, esto se sustituye por el concepto de programa de canal. El canal, como se ha dicho antes, es un pequeño procesador que tiene acceso a la memoria principal. Es capaz de ejecutar un conjunto limitado de instrucciones, conocidas como comandos de canal. Estos comandos especifican aquellos parámetros que el canal necesita para controlar los dispositivos de E/S y realizar operaciones de transferencia de datos. Un programa de canal es una secuencia de estos comandos almacenada en la memoria principal. La CPU inicia una operación de E/S con la emisión de una orden especial al canal que hace que el canal empiece a buscar en memoria y ejecutar los comandos que constituyen el programa de canal. El programa de canal consta de una serie de palabras de comando de canal (CCW: channel command words) cuyo formato simplificado aparece en la siguiente figura: Oper a ción Dir ección del da t o F la gs
CD
Nº de pa la br a s
CC SKIP P CI
Operación Este campo corresponde al código de operación de las instrucciones máquina normales. Especifica la operación que debe realizar la CCW. La unidad de control decodifica este campo y envía las señales adecuadas de control al dispositivo. Existen varias operaciones, las más importantes son las siguientes: Lectura: el canal transfiere a memoria principal un bloque de palabras de tamaño especificado en el campo nº de palabras, en orden ascendente de direcciones, empezando en la dirección especificada en el campo dirección del dato. Escritura: el canal transfiere datos de memoria principal al dispositivo. Las palabras se transfieren en el mismo orden que en la operación de lectura. Control: se utiliza esta orden para enviar instrucciones específicas al dispositivo de E/S, como rebobinar una cinta magnética, etc. Bifurcación: cumple en el programa de canal la misma función que una instrucción de salto en un programa normal. El canal ejecuta las CCW en secuencia, salvo cuando aparece una CCW de este tipo, que utiliza el campo dirección del dato como la dirección de la siguiente CCW a ejecutar. Flags Los bits de este campo indican lo siguiente:
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CC (Encadenamiento de comando): cuando este bit está a 1, indica al canal que la siguiente CCW especifica una nueva operación de E/S que debe realizarse con el mismo dispositivo. El canal ejecuta primero la operación de E/S especificada en la CCW que tiene a 1 el flag CC. Después ejecuta la siguiente sobre el mismo dispositivo. Desde el punto de vista del dispositivo, las dos operaciones resultantes de la primera y segunda CCW aparecen como dos comandos de E/S separados. CD (Encadenamiento de datos): una CCW con el bit CD a 1, indica al canal que la siguiente CCW contiene una nueva dirección del dato y un nuevo nº de palabras. Éstos deben utilizarse para transferir un segundo bloque de datos hacia o desde el dispositivo de E/S, mediante la orden especificada por la CCW actual. Cuando el canal termina la transferencia de datos especificada en la CCW con el bit CD a 1, no corta la conexión con el dispositivo de E/S, continúa la transferencia utilizando la dirección y el nº de palabras de la siguiente CCW. Con el encadenamiento de datos, los datos transferidos por la primera y segunda CCW aparecen como un bloque para el dispositivo de E/S. Esto facilita las transferencias entre un dispositivo y posiciones no contiguas de la memoria principal. Para poner de manifiesto la diferencia entre encadenamiento de comandos y de datos veamos lo que ocurre con una transferencia de dos bloques de datos de la memoria principal a una cinta magnética. Si se utiliza encadenamiento de comandos, los dos bloques se escribirán en la cinta separados por un separador de registros que la unidad de cinta inserta de forma automática al final de una operación de E/S especificada por una CCW en donde CD = 0. En cambio, el encadenamiento de datos provoca que los dos bloques se unan en un solo registro en la cinta. Una CCW con los flags CD y CC a 0 significa el final del programa de canal. SKIP (Salto): este bit, cuando está a 1, hace que el programa de canal salte un número de palabras igual al especificado en el campo nº de palabras. Cuando se utiliza con la orden de lectura, este flag hace que los datos se lean del dispositivo sin que se transfieran a la memoria principal. PCI (Interrupción controlada por programa): el canal produce una interrupción cuando ejecuta una CCW con el flag PCI a 1. Si esta CCW va precedida por otra CCW con encadenamiento de comandos, la interrupción se genera después de que hayan concluido todas las transferencias de datos. Ejemplo 1 En la siguiente figura se muestra un ejemplo de programa que transfiere tres bloques de datos de la memoria principal a una cinta magnética. CCW1 lee 70 bytes de memoria, a partir de la posición 2000, y los escribe en cinta. La operación de Escritura y la unidad de cinta a utilizar se especifican en el campo de operación. Puesto que el bit CD está 1, CCW2 debe interpretarse como una continuación de CCW1. Se realiza la misma operación de E/S, esto es, una Escritura en el mismo dispositivo, pero con los datos especificados en CCW2. Obsérvese que en CCW2 no se tienen en cuenta los bits de orden. Se transfieren a la cinta 100 bytes de memoria, a partir de la posición 2.200, como continuación del registro iniciado con CCW1. En CCW2 el bit CC está 1, lo que significa que sigue otra CCW (CCW3), pero que no está relacionada con la CCW2. Por lo tanto, al finalizar CCW2, se inserta un espacio de separación de registros en la cinta. De nuevo, CCW3 especifica una Escritura en la misma cinta. El resultado es una transferencia a la cinta de 500 bytes a partir de la posición 2.500 de memoria. Puesto que los flags CD y CC valen cero, se trata del final del programa de canal. OPERACION
DIRECCION
FLAGS CD CC SK PCI
Nº PALABRAS
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CCW1 CCW2 CCW3
ESCRITURA ESCRITURA
2000 2200 2500
Memoria principal
1 0 0
0 1 0
0 0 0
0 0 0
70 100 500
Cinta magnética
CCW1
2000 70 bytes
registro CCW2
separador
2200
registro
100 bytes CCW3
2500
50 bytes
Ejemplo 2 En la siguiente figura aparece otro programa de canal que muestra el empleo del flag de salto (SKIP). La primera CCW (CCW1) transfiere 80 bytes de la unidad de cinta especificada en el campo de operación a la memoria, a partir de la posición 4.500. Puesto que CD = 1, CCW2 realiza la misma operación. Sin embargo, como en CCW2 el flag de salto está 1, significa que el canal no transmitirá los siguientes 30 bytes que lea de la cinta. Puesto que CD sigue 1, continúa la misma operación de lectura con CCW3, provocando la transferencia de los siguientes 50 bytes a la memoria, a partir de la posición 4.700. Por lo tanto, el programa transfiere dos bloques de datos a la memoria principal desde un registro de la cinta, con un salto de 30 bytes a la mitad del registro. OPERACION CCW1 CCW2 CCW3
LECTURA
DIRECCION 4500 4700
FLAGS CD CC SK PCI 1 0 0 0 1 0 1 0 0 0 0 0
Nº PALABRAS 80 30 50
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Memoria principal
4500
Cinta magnética
CCW1
80 bytes
80 bytes registro 30 bytes
CCW2
4700
50 bytes
50 bytes
Inicio y control de los programas de canal Hemos visto como se utilizan los programas de canal para realizar operaciones de E/S. Estos programas residen en la memoria principal del computador y se ejecutan en el canal. Vamos a examinar ahora la forma en que la CPU inicia y supervisa las operaciones de E/S, es decir, el programa de canal. En el IBM S/370 existen cuatro instrucciones máquina que la CPU puede utilizar para estos fines. Son las siguientes: START I/O
Inicia una operación de E/S. El campo de dirección de la instrucción se emplea para especificar el canal y el dispositivo de E/S que participa en la operación.
HALT I/O
Finaliza la operación del canal.
TEST CHANNEL
Prueba el estado del canal.
TEST I/O
Prueba el estado del canal, el subcanal y el dispositivo de E/S.
Una operación de E/S se inicia con la instrucción START I/O. La ubicación del programa de canal en la memoria principal viene definida en la palabra de dirección de canal (CAW: Channel A ddress word), que siempre está almacenada en la posición 72 de la memoria principal. Mem or ia pr in cipa l
72
CAW
P r ogr a m a de ca n a l
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La CAW debe cargarse, pues, en la posición 72 antes de la ejecución de la instrucción START E/S. El dispositivo indica su disponibilidad para participar en la operación de E/S devolviendo su dirección al canal. A partir de este momento el dispositivo permanece conectado al canal hasta que finaliza la operación de E/S. Establecida la disponibilidad del dispositivo, el canal envía una señal a la CPU. En este momento finaliza la instrucción START E/S, y la CPU deja de ocuparse de la operación de E/S. Al finalizar la instrucción de START E/S, el canal comienza a ejecutar el programa de canal.
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Tema 11: Dispositivos periféricos y buses de comunicación. 1. Dispositivos periféricos y controladores asociados 2. Buses de comunicación: síncronos y asíncronos 3. Arbitraje de acceso a los buses 4. Buses normalizados
1. Dispositivos periféricos y controladores asociados Estudiaremos en este apartado los principios de funcionamiento de los principales dispositivos periféricos que se conectan a un computador así como la estructura lógica de los correspondientes controladores. 1.1 Discos magnéticos Los discos magnéticos se conectan al computador como dispositivos periféricos, aunque muchos forman parte de la jerarquía de memoria del computador. Un dispositivo de discos magnéticos está constituido por una o más superficies circulares recubiertas por un material ferromagnético sobre el que se puede grabar información alterando el sentido de la magnetización de pequeñas áreas de su superficie. El conjunto de superficies gira por la acción de un motor. La información se escribe y lee a través de un conjunto de cabezas (una por superficie) que se mueve radialmente de forma solidaria por la acción de un motor paso-a-paso, tal como se muestra en la siguiente figura:
Cab eza d e lect u r a y escr it u r a Su p er ficie m agn ét ica Mot or pas o-a-pas o
Mot or de gir o
1.1.1. Grabación de información sobre superficies magnéticas
Los materiales ferromagnéticos se caracterizan porque se magnetizan de forma permanente cuando se les aplica un campo magnético externo. Normalmente el campo externo se genera eléctricamente. Esto no les ocurre a los materiales diamagnéticos, que son repelidos por los campos magnéticos y no se magnetizan, ni a los materiales paramagnéticos, que son atraídos por los campos magnéticos y tampoco se magnetizan. Un material ferromagnético se caracteriza por sus curvas de magnetización e histéresis. Supongamos que el material ferromagnético está originariamente desmagnetizado (punto a de la siguiente gráfica). Conforme se incrementa el campo magnético externo H, también se incrementa la magnetización inducida M, hasta que se alcanza el valor de saturación (punto b). La curva entre los puntos a y b se denomina curva de magnetización. Si ahora reducimos el campo externo, la magnetización inducida también se reduce, pero no sigue la curva original. El material retiene una cierta magnetización permanente denominada magnetización remanente, que persiste incluso cuando se anula el campo externo (punto c). Si reducimos aún más el campo externo (sentido opuesto) podemos llegar a anular la magnetización remanente (Punto d), y si continúa la reducción se crea una magnetización inducida de sentido opuesto, llegándose también en este caso a un valor de saturación (punto e). Si ahora vamos reduciendo el campo externo hasta anularlo, el material queda con una magnetización remanente de sentido opuesto a la anterior (punto f). Para anular esta magnetización remanente debemos aumentar el campo externo (con el sentido
1
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
original) hasta alcanzar el punto g, y si seguimos aumentando llegamos de nuevo a la saturación (punto b), con lo que se completa el ciclo de histéresis. Los materiales ferromagnéticos tienen por tanto dos valores estables de magnetización, uno norte, correspondiente al punto c de la gráfica y otro sur, correspondiente al punto f. Estos dos estados de magnetización remanente que se mantienen en ausencia de campo externo son los que se utilizan para codificar la información binaria cuando se utilizan los materiales ferromagnéticos como soporte de memoria. M c
d
e
b
a
g
H
f
Los procesos de lectura y escritura sobre las superficies ferromagnéticas de un disco (habitualmente de óxido de hierro) se realizan a través de una cabeza de grabación compuesta por un núcleo de hierro en forma de herradura y dos bobinas conductoras, una para escritura y otra para lectura. La cabeza opera muy cerca de la superficie, de forma que casi vuela sobre ella, sobre el colchón de aire formado por su propio movimiento. Debido a esto, están cerrados herméticamente, porque cualquier partícula de polvo puede dañarlos. escr it u r a
lect u r a
cor r ien t e
t en sión
+
-
m ovim ien t o
Su per m a gn
Escritura: Se hace pasar por la bobina de escritura una corriente que crea un campo magnético en el núcleo de hierro que se cierra a través de la pequeña región de la superficie magnética que en ese momento está bajo la cabeza, dejando una magnetización remanente del mismo sentido que el campo de la bobina.
Lectura: Se mueve la superficie magnética previamente grabada por debajo de la cabeza. Cada variación de flujo producida por las pequeñas áreas magnetizadas inducirá una pequeña tensión en la bobina de lectura. Amplificando e interpretando adecuadamente estas tensiones podemos reconstruir en forma de señal eléctrica digital los valores grabados en la superficie del disco. Los discos magnéticos actuales disponen de AUTOPARK o aparcamiento automático de las cabezas, que posiciona las cabezas en un lugar fuera del alcance de la superficie del disco al apagar el ordenador. Esto evita posibles daños en la superficie del disco cuando la unidad es sometida a vibraciones o golpes en un posible traslado.
2
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1.1.2. Métodos de codificación sobre superficies magnéticas
Para grabar información en la superficie, se siguen una serie de códigos que transforman un patrón de bits en una secuencia de celdas con diferentes estados de magnetización. 1) Retorno a cero (RZ: «return to zero»). El 1 lógico se graba magnetizando el centro de la celda. El 0 es ausencia de magnetización 2) Retorno a saturación (RS: «return to saturation»). El 1 se representa por un estado de magnetización en el centro de la celda. El resto de la celda y el 0 se representa con el estado de magnetización opuesto. 3) Retorno a cero bipolar (BRZ: «bipolar return to zero»). El 1 se representa por un estado de magnetización en el centro de la celda y el 0 por el estado de magnetización opuesto, también en el centro de la celda. Los extremos de la celda quedan sin magnetizar. 4) Sin retorno a cero (NRZ: «non-return zero»). El 1 se representa por un estado de magnetización en toda la celda y el 0 por el estado contrario, también en toda la celda. 5) Sin retorno a cero inverso (NRZI: «non-return to zero invert»). El 1 se representa por un cambio del sentido del flujo de magnetización en toda la celda respecto al estado de la celda anterior. El 0 se representa por ausencia de cambio. 0
1
1
0
0
1
0
RZ
RS
BRZ
NRZ
NRZ1
6) Codificación en fase (PE: «phase encoding»). El 1 se representa por un cambio y el 0 por el cambio contrario. Estos cambios se realizan en el centro de la celda. Para poderse detectar dos ceros o dos unos seguidos, es necesario efectuar también un cambio al comienzo del segundo. 7) Modulación de frecuencia (FM: «frequency modulation»). Es la codificación más sencilla, consiste en la grabación de un cambio de flujo para cada uno, y el omitir el cambio de flujo para cada cero. Es decir, siempre se produce un cambio al comienzo de la celda, en el centro se producirá un nuevo cambio de magnetización si y sólo si se graba un 1. Este procedimiento se puede realizar con una electrónica de control relativamente simple, pero tiene el inconveniente de que cada bit de datos consume dos cambios de flujo, limitando mucho la capacidad del disco 8) Coeficiente de pulso (PR: «pulse ratio»).
3
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La celda tiene un primer intervalo de longitud RI en un estado de magnetización, y el segundo intervalo, de longitud R2, en el estado contrario. El 1 se representa por un pulso tal que Rl/R2 < 1, y el 0 por un pulso tal que R1/R2 > 1. 9) FM modificada (MFM: «modifed FM»). Similar a FM excepto que el cambio de estado al inicio de la celda se efectúa sólo si el bit precedente y actual son ambos 0. 10) Modulación de frecuencia modificada-modificada (MIFM: «modified-modified FM). Igual que FM pero sólo se efectúa el cambio de estado al comienzo de la celda si la celda anterior no contiene ningún cambio (ni al principio ni en el centro), y la celda actual no es un 1 .
0
1
1
0
0
1
0
PE
FM
PR
MFM
2
M FM
1.1.3. Formato de grabación
Los datos en un disco magnético se organizan en un conjunto de anillos concéntricos sobre el plato denominados pistas. Las pistas adyacentes están separadas por bandas vacías. Esto minimiza los errores debidos a falta de alineamiento de la cabeza o a interferencias del campo magnético. Para simplificar la electrónica, se suele almacenar el mismo número de bits en cada pista. Esto significa que la densidad en bits es mayor en las pistas más internas. Los datos se transfieren en bloques y se almacenan en regiones del tamaño de un bloque, conocidas como sectores. Normalmente hay entre 10 y 100 sectores por pista, y estos pueden ser de longitud fija o variable. Los sectores adyacentes se separan con regiones vacías. El disco se graba con un formato que contiene algunos datos extra, usados sólo por el controlador del disco y no accesibles al usuario. En la siguiente figura se puede ver la disposición de los datos:
4
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
sect or es
pist a s
Sepa r a ción in t er bloqu es
Ba n da de sepa r a ción de pist a s
En la siguiente figura se muestra un ejemplo del formato de grabación de un disco. En este caso, cada pista contiene 30 sectores de longitud fija, de 600 bytes cada uno. Cada sector contiene 512 bytes de datos, junto con la información de control utilizada por el controlador del disco. El campo ID es un identificador único, o dirección, usado para localizar un sector particular. El byte SINCRO es un patrón de bits especial que delimita el comienzo del campo. El número de pista identifica cada pista. El número de cabeza identifica una cabeza, si el disco tiene varias superficies. El ID y los campos de datos contienen, cada uno, un código de detección de errores de redundancia cíclica (CRC) que estudiaremos en el apartado siguiente. pist a ...................
Ga p (17 byt es)
Sect or i
ID
.................................
Ga p (41 yt es)
30 sect or es
Da t os (41 byt es)
Ga p (20 byt es)
iden t ifica dor Sin cr o
Byt es
Nº pist a
1
2
Byt es
Nº ca beza
1
Nº sect or
CRC (er r or es)
1
2
Sin cr o
Da t os
1
512
CRC (er r or es)
2
Existen procedimientos para aumentar la capacidad del disco colocando más sectores sobre las pistas exteriores que son más largas, manteniendo constante la velocidad de rotación. El sistema ZBR (Zone Bit Recording) es un ejemplo que requiere el uso de controladores más complejos..
5
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Un parámetro a tener en cuenta en el funcionamiento de un disco es el tiempo medio entre fallos,
MTBF (Mean Time Between Failures), que se mide en horas (15000, 20000, 30000..). Cuanto mayor sea
este parámetro mayor será la fiabilidad del disco.
1.1.4. Comprobación de Redundancia Cíclica (CRC)
Los códigos de comprobación de redundancia cíclica (CRC) se utilizan fundamentalmente en dispositivos de tratamiento serie de la información. El emisor genera a partir de un mensaje de k-bits que se quiere transmitir una secuencia de n-bits, denominada secuencia de comprobación (FCS: frame check sequence), que concatena con el anterior para formar el mensaje realmente transmitido, con n+k bits. El FCS se elige de manera que el mensaje transmitido sea divisible por algún número predeterminado. El receptor dividirá el mensaje recibido por ese número, y si el resto de la división es cero significa que no ha habido errores en la transmisión. Aritmética La aritmética que se utiliza en las operaciones CRC es módulo 2, de acuerdo con las reglas de la teoría de campos algebraicos. Es decir, no existen acarreos para la suma ni préstamos para la resta. Tanto la suma como la resta resultan pues idénticas a una O-exclusiva: Suma 1111101 + 0101001 ---------1010100
Resta 1101101 - 0101001 ---------1000100
Multiplicación 1111101 x 11 ---------1111101 1111101 ---------10000111
División
1111101
11 Å Cociente ---------10000111 Å Dividendo 1111101 ------1111101 1111101 ------0 Å Resto
Divisor Codificación M = mensaje de k bits original que se desea transmitir F = n bits de la secuencia de comprobación (FCS) T = mensaje de (k + n) bits que se transmite, con n < k P = patrón de n + 1 bits: divisor elegido Es evidente que multiplicar M por 2n equivale a desplazar hacia la izquierda n bits, introduciendo ceros por la derecha. Por tanto la operación de concatenación de M con F para dar T podemos expresarla de la siguiente forma: T = 2n M + F El objetivo es escoger F de tal manera que T sea divisible por P. Como: 2n M R ------ = Q + -P P Siendo Q el cociente y R el resto. Por tanto haremos: F= R T = 2n M - R = 2n M + R Ya que la suma y resta coinciden en aritmética módulo 2.
6
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Ejemplo Emisor Mensaje original a transmitir Patrón FCS
M = 1010001101 (10 bits) P = 110101 (6 bits) R = resto de la división de 2nM entre P
2nM = 25M = 101000110 00000 1101010110 Å Q --------------P Æ110101 101000110100000 Å 2nM 110101 -----111011 110101 -----111010 110101 -----111110 110101 -----101100 110101 -----110010 110101 -----01110 Å R El resto se suma a 2nM para formar T T = 2nM + R = 101000110 01110 Que es el mensaje o trama que se transmite Receptor Si no hay errores el receptor recibe el mensaje transmitido por el emisor y calcula el resto de la división por P: 1101010110 Å Q --------------P Æ110101 101000110101110 Å 2nM 110101 -----111011 110101 -----111010 110101 -----111110 110101 -----101111 110101 -----110101 110101 -----0 Å R Como el resto es cero se sabe que no ha habido errores.
7
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Representación de los errores Si se produce un error en la transmisión de un bit del mensaje significa que si en origen valía 0 en destino vale 1, y viceversa. Por tanto la representación de cualquier error (simple o múltiple) podemos hacerla con una cadena de bits E de longitud igual al mensaje transmitido, con valor 1 en aquellas posiciones de bit en las que se haya producido un error. El mensaje recibido Tr tendrá pues la siguiente expresión en términos del mensaje transmitido T y el error producido E : Tr = T ⊕ E Si T = 11000111 y se ha producido un error en el tercer bit por la derecha, es decir, E = 00000100, entonces Tr = (11000111) ⊕ ( 00000100 ) = 11000011 Evidentemente el receptor fallará en la detección de un error si y solo si Tr es divisible por P, lo que equivale a decir que E sea divisible por P. Interpretación polinómica de de los códigos CRC Los patrones de bits podemos representarlos como polinomios de una variable anónima X con coeficientes 0 ó 1. Los coeficientes corresponderán con los bits de la configuración binaria del patrón. Así, si M = 110011, M(X) = X5 + X4 + X + 1. Las operaciones aritméticas siguen realizándose en módulo 2. El polinomio correspondiente al mensaje que se transmite en código CRC vendrá dado por: T(X) = XnM(X) + R(X) donde R(X) es el resto de la división de XnM(X) entre P(X), es decir: XnM(X) / P(X) = Q(X) + R(X) / P(X) Errores Al recibir el mensaje Tr(X) el receptor lo divide por P(X). Error simple: si ha habido un error en un solo bit, E(X) = Xi donde i determina la posición del error. Si P(X) contiene el factor X+1, E(X) nunca será divisible por P(X), por lo que detectarán los errores simples. Errores dobles: en este caso E(X) = Xi +Xj, donde i > j. Esto también se puede escribir como E(X) = Xj (Xi-j + 1). Si suponemos que P(X) no es divisible entre X, una condición suficiente para detectar todos los errores dobles es que P(X) no sea divisor exacto de (Xk + 1) para ningún k hasta el valor máximo de i – j, es decir, hasta la longitud máxima del mensaje. Se conocen polinomios sencillos de bajo grado que dan protección a mensajes largos. Por ejemplo, X15 + X14 + 1 no dividirá exactamente a (Xk + 1) para ningún valor de k < 32.768. Errores en ráfaga: un error en ráfaga comienza y finaliza en 1, y entre ambos 1’s hay 0’s y 1’s. Para un error en ráfaga de longitud k, el polinomio tendrá la forma: Xi(Xk-1 + …+), donde i determina la distancia a la que se encuentra la ráfaga desde el extremo derecho del mensaje recibido. Si P(X) contiene un término X0, no tendrá a Xi como factor, por lo que, si el grado de (Xk-1 + …+) es menor que el grado de P(X), el residuo nunca puede ser cero. Si la longitud de la ráfaga es r+1, el residuo de la división entre P(X) será cero si y solo si la ráfaga es idéntica a P(X). Por la definición de ráfaga, el primero y último bits deben ser 1, así que el que sean iguales o no depende de los r – 1 bits intermedios. Si se consideran igualmente probables todas las combinaciones, la probabilidad de que se acepte como válido el mensaje recibido de de 1/2r-1
8
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Polinomios generadores estándar CRC-12
=
X12 + X11 + X3 + X2 + X1 + X0
CRC-16
=
X16 + X15 +
CRC-CCITT
=
X16 + X12 + X5
CRC-22
=
X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X1+X0
X2
+ X0 + X0
Implementación hardware La generación y detección CRC se implementa con un circuito divisor compuesto por puertas Oexclusiva y un registro de desplazamiento. El registro contiene tantos bits como el FCS, es decir, n, y n1 puertas O-exclusiva. Cada puerta O-exclusiva se ubica a la entrada de un biestable correspondiente a un monomio de coeficiente 1, salvo Xn. Para el divisor del ejemplo, 110101, cuyo polinomio asociado es X5 + X4 +
X2
+ X0
El divisor tendrá la siguiente forma:
⊕
C4
X5
C3
X4
⊕
C2
X3
C0
C1
X2
X1
⊕
Bits de entrada
X0
Sobre este circuito podemos seguir el proceso de generación CRC del ejemplo anterior, para el mensaje M = 1010001101:
Inicial Paso 1 Paso 2 Paso 3 Paso 4 Paso 5 Paso 6 Paso 7 Paso 8 Paso 9 Paso 10 Paso 11 Paso 12 Paso 13 Paso 14 Paso 15
C4
C3
C2
C1
C0
0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0
0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 1
0 0 0 1 0 1 1 1 1 1 1 0 1 0 1 0
0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 1
0 1 0 1 0 0 1 0 1 1 1 1 0 1 1 0
C4 ⊕ C3
0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 1
C4 ⊕ C1
0 0 1 0 1 1 1 1 1 1 0 1 0 1 1 1
C4 ⊕ entrada
1 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0
entrada
1 0 1 0 0 0 1 1 0 1 0 0 0 0 0 0
mensaje a enviar
cinco ceros añadidos
9
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1.1.5. Parámetros de rendimiento de un disco magnético
Tiempo de búsqueda (Ts): tiempo que tarda la cabeza en posicionarse en la pista. Se compone de dos partes, el tiempo de comienzo s o tiempo necesario para que la cabeza adquiera una cierta velocidad radial, y el tiempo necesario para atravesar las pistas que preceden a la que se accede, que no es una función lineal del número de pistas atravesadas. Sin embargo podemos aproximar Ts con la siguiente expresión: Ts = m * n + s donde: n = número de pistas atravesadas m = constante que depende del disco En un disco barato de PC m puede tener un valor de 0,3 ms y s de 20 ms; mientras que en un disco más caro m puede tener un valor de 0,1 ms y s de 3 ms Retardo rotacional (Tr): tiempo que tarda el sector en alcanzar la cabeza. Si r es la velocidad angular del disco en revoluciones/segundo (rps), la expresión del valor medio de Tr será la siguiente: Tr = 1/2r En discos duros que giran a 3.600 rpm, una revolución tardará 16,7 ms, y el valor medio del retardo rotacional será 8,3 ms. En cambio los disquetes que giran entre 100 y 600 rpm tienen un retardo rotacional medio que va de 100 a 200 ms. Tiempo de acceso (Ta): es la suma del tiempo de búsqueda y el retardo rotacional Ta = Ts + Tr = m * n + s + 1/2r Tiempo de transferencia (Tt): tiempo que tardan en transferirse los datos a ó desde el disco una vez accedido el inicio de los mismos. Dependerá de la velocidad de rotación del disco: Tt = b/rN donde: b = número de bytes a transferir N = número de bytes de una pista r = velocidad de rotación en rps Tiempo de operación (To): es la suma de las componentes anteriores, es decir: To = m * n + s + 1/2r + b/rN En un computador que funciona bajo control de un SO, para realizar una operación de E/S, a estos tiempos habrá que añadir el tiempo de espera por un canal, si el disco no dispone del suyo propio, y el tiempo de espera en la cola hasta que el dispositivo esté disponible. Comparación de tiempos en acceso secuencial y aleatorio
Ts = 20 m s Velc. Tr a n sfe. = 1 MB/s Sector = 512 B P ist a = 32 sect or es Ar ch ivo de 128KB = 256 sector es
1 Acceso secuencial 8 pistas adyacentes (256 sectores / 32 sectores/pista = 8 pistas)
10
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Acceso a la primera pista = Ts + Tr + Tt(1 pista) Ts = 20 ms Bytes / pista = 512*32 = 16.384 Tiempo / pista = 16.384 / 1000.000 = 0,016384 s. Tr = 0,016384 / 2 = 0,008192 = 8,192 ms Tt(1 pista) = 0,016384 s. = 16,384 ms Acceso a la primera pista = Ts + Tr + Tt(1 pista) = 45 ms. Acceso a las restantes 7 pistas = 7 * (Tr + Tt(1 pista) ) = 7*(8,192 + 16,384 = 7 * 25 = 220 ms. 2 Acceso aleatorio Acceso a un sector = Ts + Tr + Tt(1 sector) = 20 + 8,3 + 512/1000000 = 28,8 ms. Acceso a 256 sectores = 256 * 28,8 = 7.372 ms Existen una serie de técnicas que permiten aminorar los accesos a disco así como acelerar las transferencias de datos entre el sistema y el dispositivo. Una de las más conocidas es la utilización de memorias intermedias, buffers o cachés. Buffer de Pista: Es una memoria incluida en el controlador del disco, que almacena el contenido de una pista completa. Así cuando se hace una petición de lectura de una pista, esta se puede leer de una sola vez, enviando la información a la CPU. Cachés de Disco: Pueden estar dentro del propio disco duro, en tarjetas especiales o bien a través de programas utilizando la memoria central. La gestión de esta memoria es completamente transparente y consiste en almacenar en ella los datos más pedidos por la CPU y retirar de ella aquellos no solicitados en un determinado tiempo. 1.1.6. Dispositivo floppy
El dispositivo floppy disk fue introducido por IBM en 1967. La primera versión tenía un tamaño de 8 pulgadas y se redujo a 5.50 pulgadas en la segunda con 360 KB, que se utilizó en el primer IBM PC en 1981. Posteriormente apareció la versión de 3.25 pulgadas con 1.44 MB. El floppy utiliza una fina capa de material plástico recubierta de óxido de hierro (material ferromagnético) Estructura de bloques del dispositivo Como puede verse en el esquema de la siguiente figura, un dispositivo floppy dispone de los siguientes elementos: •
Mecanismo de cabeza: una sola cabeza para lectura y escritura, y otra para borrado inmediatamente antes de la escritura. La cabeza es accionada por un motor paso-a-paso que le permite posicionarla radialmente en una cualquiera de las pistas del floppy. También dispone de un mecanismo de elevación de la cabeza que se utiliza para evitar el rozamiento con la superficie cuando se mueve radialmente.
•
Motor de giro: hace girar el diskette a una velocidad de 300 ó 369 revoluciones por minuto.
•
Detector de la pista cero: que el dispositivo utiliza como referencia para desplazar la cabeza a la pista adecuada.
•
Detector de inicio de pista: fotodetector que genera una señal cada vez que se inicia una nueva revolución de giro.
11
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Pu lso Dir e cción pu lso E le va ción ca be za
Con tr ol
G ir o m otor
Re loj Da tos le ctur a Da tos e scr itu r a
Le ctu r a Y E scr itu r a
Motor de Giro
Cabeza l/e Motor P aso-a-paso
Listo
Pr otección e scr i.
Detector de pista 0
E sta do
In dice
fotocélula
Pista 0
Tod os los elementos del dispositivo son accionados y supervisados desde la circuitería de Control, Lectura/Escritura y Estado a través del controlador del dispositivo. Formato de datos
marca
pista
sector
longitud sector
CRC
sector
ID
marca inicio pista
marca
Campo de Datos
128 bytes de datos
CRC
índice
12
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Estructura y funcionamiento del controlador de dispositivo La estructura del controlador del floppy disk se representa en la siguiente figura:
Regist r o de Or den es Bu ffer de Da t os
Regist r o de E st a do
Regist ro de Sector
Cir cu itos de Ada pt a ción y Con t r ol
Regist ro de P ist a
CP U Regist r o de Da tos
Lógica de Selección y Con t r ol
D IS CO
Regist ro de Despla za m ien to
R. de Com pen sa ción y Sa lida
Consta de los siguientes elementos: Registro de pista contiene el número de pista sobre el que se encuentra en cada momento la cabeza. Registro de estado codifica la información de estado del dispositivo: disponible,…. Registro de Ordenes almacena la orden recibida por la unidad de E/S. Entre otras dispone de las siguientes:
Búsqueda de pista Búsqueda de sector Lectura de sector Escritura de sector
Analicemos las acciones que tienen lugar en el dispositivo durante la ejecución de la primera de estas órdenes. Búsqueda de pista El registro de pista se inicializa a 0 cuando se enciende el motor de giro y se activa el detector de pista 0. Una vez que el módulo de E/S ha puesto la orden de Búsqueda de pista sobre el Registro de Ordenes, carga en el Registro de Datos el número de la pista a buscar y comienza la operación. Se comparan los registros de Datos y Pista. Si sus contenidos coinciden, la cabeza se encuentra en la pista buscada, y la operación finaliza con una interrupción después de desactivar la señal de Elevación de cabeza y transcurrir un retardo de tiempo para el asentamiento de la cabeza. En caso contrario se envía un pulso al motor paso-a-paso de la cabeza con la dirección adecuada (dependiendo del resultado menor o mayor de la comparación) a fin de desplazarla a la pista contigua. Después se actualiza el Registro de Pista y se vuelve a comparar.
13
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
R.Da t os Å n º de pist a
<R.Da tos> : <R.P ist a >
>
Pu lso Å Π Dirección pu lso Å 1 R.P ist a Å <R.P ist a> + 1
=
E levación cabeza Å 0 Ret a r do( a sen t a m ien to de la ca beza ) In t err u pción
<
P u lso Å Π Dir ección pu lso Å 0 R.P ist a Å <R.P ist a> - 1
1.2 Discos ópticos Se trata de dispositivos para el almacenamiento de información cuya lectura se realiza por medios ópticos. Existen diferentes tipos, siendo los más importantes el CD-ROM (Compact Disc ROM) y el WORM(Write Once, Read Many times). 1.2.1. CD-ROM La información se almacena en forma de hoyos (pits) y salientes (bumps), grabados mecánicamente sobre un substrato de aluminio brillante, y son leídos por medio de un láser que se refleja con diferente dirección en los hoyos que en los salientes.
0,5 micras 1,6 micras
Etiqueta Capa protectora Capa aluminio
Base de policarbonato transparente
El proceso de escritura (grabación) sigue los siguientes pasos: • • • • •
La información se codifica usando un código de canal con el que cada byte (ASCII) queda representado por 14 bits y se graba en una cinta magnética La cinta es leída por un grabador de moldes para controlar un modulador óptico de un láser de potencia. El láser se enfoca sobre la superficie fotosensible que recubre el disco molde (que es de cristal). Mediante un proceso análogo al utilizado en la fabricación de CIs se revela el disco. Las zonas de la superficie fotosensible que han sido expuestas a la luz se convierten en hoyos, resultando un relieve exactamente igual al que tendrán los CD-ROM.
14
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• • •
Del molde original se obtienen varios discos denominados matrices, que son copias en negativo de los discos definitivos. Con las matrices se obtiene la capa de aluminio de CD-ROM. Finalmente se aísla del exterior, emparedándola entre la capa protectora superior y la base inferior de plástico
Con los CD-ROM se consiguen una densidad de grabación de 16.000 pistas/pulgada (t/i) muy superior a la de los discos magnéticos (los disquetes 96 t/i. El proceso de lectura sigue los siguientes pasos: • • • • •
Se utiliza un haz de luz generado por un diodo láser de arseniuro de galio, que una lente enfoca sobre la superficie de la base de plástico, convirtiéndose en un punto de 1 micra. El enfoque no se realiza sobre la superficie externa de la base de plástico, sino sobre el aluminio, por lo que las partículas de polvo o rayados del exterior del disco apenas afectan a su lectura. La lectura se efectúa con un fotodetector que mide la cantidad de luz reflejada (genera una corriente proporcional a la radiación recibida). Cuando la luz incide sobre los bordes de los hoyos se desvía, de forma que apenas vuelve nada hacia el objetivo, obteniéndose así un "1". Cuando el haz incide sobre la superficie plana de hoyos y salientes se refleja casi sin desviación, captándose en el detector prácticamente la totalidad del haz, obteniéndose así un "0". 10000010010000000000001000000010000001 Base de
laser de lectura (lee 1)
laser de lectura (lee 0)
Codificación de la información A nivel lógico la información se organiza en bloques (sectores) de 2.352 bytes, con el formato que aparece en la siguiente figura: bytes
00
FF
12
4
Sincronismo
ID
FF
2.048
288
Datos
FF
00
ECC
Minuto
Segund.
Sector
Modo
A nivel físico Los 1's se representan por el cambio de hoyo a saliente y los 0's por las superficies de los hoyos y salientes. Cada 0,3 micras de hoyo o saliente a lo largo de la pista corresponde a un 0. La longitud mínima físicamente posible para hoyos y salientes es de 0,6 micras, lo que exige que 2 1's deben estar separados como mínimo por 2 0's. Por eso cada byte de datos se codifica con 14 bits de canal, según la siguiente tabla:
15
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Codificación EFM (Eight to Fourteen Modulation) Byte 0000 0000 0000 0001 0000 0010 0000 0011
Código de canal 01 0010 0010 0000 10 0001 0000 0000 10 0100 0010 0000 10 0010 0010 0000
0000 0100 0000 0101 0000 0110 0000 0111 .........
01 0001 0000 0000 00 0001 0001 0000 00 0100 0010 0000 00 1001 0000 0000 .................
los 2.352 bytes de cada sector se estructuran en tramas. Cada trama contiene 24 bytes de sector. 588 bits byte de sector 1
byte de sector i
byte de sector 24
bits
1 byte de sector
bits
sincronización
datos
sep
14
3
24
sep
control
8 ECC
3
17
136
Un sector queda representado por 98 tramas Bits de canal de un sector = 588 bits/trama * 98 tramas/sector = 57.624 bits Luego los 2.048 bytes = 16.388 bits de datos de usuario ocupan 2.352 bytes = 18.816 bits de datos lógicos y 57.624 bits físicos de canal. 1.2.2. DVD (Digital Versatil Discs) Constan de varias capas de información sobre una misma cara del disco separadas por materiales que permiten el acceso selectivo a cada capa por medio de láseres con diferentes propiedades de reflexión.
Base de Base de
1.2.3. WORM (Write Once, Read Many times)
16
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Son unidades de discos ópticos similares a los lectores de CD-ROM, pero que contienen un láser de potencia, de forma que en la propia unidad se puede efectuar la grabación del disco.
1.3 Discos magnetoópticos o WMRA (Write Many, Read Always) Proceso de escritura: • •
Los discos vírgenes son previamente magnetizados, es decir, escritos todo a 0's, magnetización norte, o todo a 1's, magnetización sur. En la fase de escritura se realizan dos acciones: 1.
Toda la superficie del disco se somete a un campo magnético uniforme, de sentido contrario al de magnetización inicial, y de intensidad no suficiente para alterar el estado de magnetización inicial de cada celda.
2.
Simultáneamente se hace incidir un láser de unos 40 mW de potencia sobre las celdas en las que hay que escribir un valor distinto al inicial. De esta forma la celda se calienta cerca de su punto de Curie, con lo que cambia el sentido de magnetización inicial de la celda. magnetización inicial ↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
láser de escritura ↑
↑
↑
↑
↑
↓
↑
↑
↑
↑
↑
↑
campo magnético externo
Proceso de lectura: •
El proceso de lectura se funda en el efecto Kerr, que consiste en que el plano de polarización de un haz de luz gira en un sentido u otro, según el estado de magnetización de la superficie en la que se refleja. La lectura se realiza con un láser de unos 10 mW de potencia, que incide secuencialmente sobre las celdas del disco que se van a leer, captándose la luz reflejada en un fotodetector después de haber pasado por un analizador óptico.
17
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
fotodetector láser de lectura ↑
↑
↑
↑
↑
↓
↑
↑
↑
↑
↑
↑
fotodetector láser de lectura ↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
↑
Proceso de regrabación • Para volver a escribir sobre un disco previamente escrito se procede en primer lugar al borrado de todas las celdas que contengan un sentido de magnetización distinto al inicial. Para ello se aplica un campo magnético externo de sentido igual al inicial y con la suficiente intensidad para invertir el sentido de magnetización de cualquier celda que no coincida con el del campo externo. La capacidad de este tipo de discos va de 0.5 a 1 GB y una velocidad de transferencia de unos 150 KB/s con tiempo de acceso de 300 ms.
1.4 Monitores de tubo de rayos catódicos (CRT) Existen dos tipos de monitores basados en tubos de rayos catódicos, los caligráficos y los de barrido o raster. Los primeros generan la imagen haciendo que un haz de electrones trace sobre la superficie fosforescente de la pantalla la forma de la figura que se quiere visualizar. Los de barrido componen la imagen sobre un conjunto de líneas paralelas horizontales, inhibiendo o no el haz en el momento que pasa por los diferentes puntos de la pantalla. 1.4.1. Principios de funcionamiento En la siguiente figura se han representado los componentes principales de un monitor monocromo (blanco y negro) de tubo de rayos catódicos (CRT) que utiliza la técnica de barrido. El componente básico es el tubo de rayos catódicos que incluye un cañón que produce un haz de electrones. Cuando los electrones pasan a través del campo magnético producido por la bobina de deflexión montada en el cuello del tubo, sufren una desviación en función del valor del campo magnético. Cuando los electrones alcanzan la superficie interna del tubo, cubierta de una capa de material fosforescente, se ilumina el punto de incidencia. La pantalla mantiene la imagen refrescándola periódicamente a una frecuencia suficiente para la persistencia de la retina. La técnica de barrido utilizada por la mayoría de los monitores es análoga a la utilizada por los aparatos de televisión. Las señales que actúan sobre la bobina de deflexión son generadas por dos osciladores, uno actuando sobre la componente horizontal y el otro sobre la vertical. Los osciladores son sincronizados por señales externas, HSYNC para la sincronización horizontal, y VSYNC para la vertical, después se amplifican antes de entrar en la bobina. La señal de VIDEO controla la intensidad del haz de electrones, y por tanto la iluminación de los puntos de la imagen sobre la pantalla.
18
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Cañón de electrones
HSYNC
OSCILADOR HORIZONTAL
AMPLIFICADOR HORIZONTAL
H
VIDEO AMPLIFICADOR DE VIDEO
CRT
VSYNC OSCILADOR VERTICAL
AMPLIFICADOR VERTICAL
V
Bobina de deflexión
Capa de fósforo
Los monitores de color tienen una organización similar pero utilizan un cañón de electrones para cada uno de los tres colores básicos. Cada punto de la pantalla, píxel, está compuesto por tres pequeñas áreas que se iluminan de rojo, verde y azul cuando incide el correspondiente haz de electrones. La relación entre las tres intensidades de electrones produce la correspondiente intensidad de los tres colores básicos para formar el color real de la imagen.
rojo verde azul
En la siguiente figura hemos representado la forma en que se realiza el barrido de una pantalla monocromo. El haz de electrones comienza en la esquina superior izquierda y se mueve horizontalmente de izquierda a derecha. Cuando completa la primera línea horizontal vuelve al flanco izquierdo para realizar el barrido de la segunda línea, al tiempo que el haz sufre una pequeña deflexión vertical, en sentido descendente. de esta forma se genera un conjunto de líneas horizontales paralelas hasta alcanzar la esquina inferior derecha. En este punto se dice que se ha completado un barrido vertical o un marco. Después el haz de electrones vuelve a la esquina superior izquierda para repetir el proceso y así refrescar la pantalla. El refresco se hace necesario para que la imagen aparezca persistente en la retina del usuario.
19
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1 2 3 4 5 6 7
Para producir el barrido descrito los osciladores horizontal y vertical deberán generar unas señales en forma de diente de sierra, tal como las que se presentan en la figura siguiente: H
1
2
3
4
5
6
7
tiempo
V
tiempo
VIDEO
tiempo
La señal de VIDEO controla la intensidad de iluminación del punto de barrido en cada instante, haciendo que se dibuje la imagen sobre la pantalla, la letra A mayúscula en la figura. En este caso la intensidad la hemos considerado binaria, presencia o ausencia de luz (blanco o negro). En realidad será un valor entero para graduar la escala de grises. Si el refresco de la pantalla se realiza a razón de 60 marcos/segundo, corresponde a un intervalo de tiempo de 16.67 ms, de los cuales sólo 15,42 ms se consumen estrictamente en el barrido vertical, los restantes 1,25 ms se emplean en el retorno vertical. V
ms 15,42 barrido vertical
16,67
retorno vertical
Lo mismo le ocurre al barrido horizontal. Unos valores típicos para el barrido y el retorno son los que se muestran en la siguiente figura:
20
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
H
µs 53,5 barrido horizontal
10 retorno horizontal
Con los valores anteriores, el número total de líneas de un marco será: 1.542 µs / 63,5 ≈ 242 líneas. Sincronismo Las señales de barrido horizontal y vertical tienen evidentemente que sincronizarse entre sí y con la señal de VIDEO, que por simplicidad seguiremos considerando que es binaria. La sincronización del barrido horizontal y los pulsos de video se muestra en la siguiente figura:
borrado horizontal
pulsos de vídeo
HSYNC pulso de sincronismo horizontal
H
Algo equivalente ocurre para el sincronismo vertical:
intervalo de boorrado vertical
pulsos de VIDEO y HSYNC hor
VSYNC
V
21
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1.4.2. Generación de caracteres Para entender el funcionamiento de la lógica de temporización y control de la pantalla en el proceso de visualización, consideraremos en primer lugar el caso aislado de generación de un carácter, la Z, que constituye el primer carácter de una línea almacenada entre las direcciones dir_ini y dir_fin en la RAM de refresco. La codificación en mapa de bits de todos los caracteres visualizables se halla en una memoria ROM, denominada Generador de Caracteres. En dir_ini se encuentra en realidad la codificación ASCII de la Z, que se utilizará como puntero (dirección) al inicio de la zona de la ROM donde comienza la codificación en mapa de bits de la Z. HSYNC VSYNC
LOGICA DE TEMPORIZACION Y CONTROL dir_refresco
dir_línea
Reloj desplaz.
VIDEO
Registro de desplazamiento
(ROM)
(RAM)
carga
GENERADOR DE CARACTERES
MEMORIA DE REFRESCO dir_ini
Z (en ASCII)
dir_fin
Código ASCII utilizado como puntero
0 0 0 0 0 0 0
1 0 0 0 0 1 1
1 0 0 0 1 0 1
1 0 0 1 0 0 1
1 0 1 0 0 0 1
1 1 0 0 0 0 1
0 0 0 0 0 0 0
0 0 0 0 0 0 0
línea 0 línea 1 línea 2 línea 3 línea 4 línea 5 línea 6
Para visualizar la Z tendremos que ir extrayendo de la ROM el valor binario de sus pixels, línea a línea, llevando cada línea al Registro de Desplazamiento que controla la señal de VIDEO, es decir, la presencia (1) o ausencia (0) de luz en la pantalla. Hemos supuesto que la resolución de cada carácter, incluyendo los puntos de separación es de 8 x 7 = 56 pixels. El proceso completo de refresco de la línea contenida entre las direcciones dir_ini y dir_fin de la memoria de refresco lo hemos representado en el siguiente diagrama:
22
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
dir_refresco Å dir_ini
dir_ línea
Å0
REGISTRO DESPLAZAMIENTO Å ROM[RAM[dir_refresco] + dir_línea]
Despla. Derecha REGISTRO DESPLAZAMIENTO 8 posiciones
dir_línea Å dir_línea + 1
no
dir_línea > 6
si
no
dir_refresco Å dir_refresco + 1
dir._refresco > dir_fin
si
1.4.2. Controlador La estructura del controlador completo de la pantalla de tubo de rayos catódicos la componen un conjunto de contadores que actúan sobre la RAM de refresco, la ROM de generación de caracteres, el Registro de Desplazamiento que controla la señal de VIDEO y la Lógica de Temporización. Supondremos que la resolución de la pantalla es de 16 filas con 32 caracteres cada una, y cada carácter está definido por una matriz de 7 x 10 puntos, tal como se muestra en la siguiente figura: caracter 1
caracter 32
caracter 1
caracter 2
caracter 3 línea 1
ESTA ES UNA LINEA...
fila 1
32 X 16
línea 10 fila 16 columna 1
columna 7
El controlador actúa en sicronización con un Reloj que genera un pulso por cada píxel a visualizar. El Reloj actúa sobre el Registro de Desplazamiento para marcar los instantes en que tiene que renovarse el punto de la línea en fase de visualización.. También actúa de forma directa sobre el Contador de Puntos de cada línea de un carácter. En realidad este contador opera como divisor de la frecuencia del Reloj para cargar el Registro de Desplazamiento con las sucesivas líneas de todos los caracteres que se visualizan en la misma fila de la pantalla. La salida del Contador de Puntos actúa sobre el Contador de Caracteres, que a su vez actúa sobre el Contador de Línea de Puntos, que finalmente actúa sobre el Contado de Fila de Caracteres. Este funcionamiento en cascada de los 4
23
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
contadores va dividiendo la frecuencia del Reloj en los valores adecuados al recorrido de cada contador, que se corresponden con la resolución de la pantalla: Contador de Puntos Æ Puntos de cada fila de cada carácter (7) Contador de Caracteres Æ Número de caracteres de una fila de la pantalla (32) Contador de Línea de Puntos Æ Número de líneas de puntos de cada carácter (10) Contador de Fila de Caracteres Æ Número de filas de caracteres de la pantalla (16) caracter 1
HSYNC
Lógica de temporización HSYNC, VSYNC, VIDEO
VSYNC
caracter 32
fila 1
ESTA ES UNA LINEA...
32 X 16 Contador de fila de caracteres (÷16)
4
(RAM)
fila 16 VIDEO
5
7 Contador de línea de puntos (÷10)
4
Contador de caracteres (÷32)
7
Retardo
Contador de puntos (÷7)
(ROM)
carga
Registro de desplazamiento desplazamiento
Reloj
1.5 Pantallas de cristal líquido El cristal líquido de tipo twisted nematic, inventado por Schald y Helfrich y mostrado por Fergason en 1971, representa la primera aplicación con éxito de los cristales líquidos. Se basa en la regulación del paso de luz polarizada mediante cristal líquido sometido a una tensión eléctrica. Cuando la luz no polarizada pasa a través de un filtro polarizador, sólo se transmite un plano de polarización. Si se utilizan dos filtros polarizadores juntos, la transmisión de la luz dependerá de su orientación relativa. Por ejemplo, cuando los polarizadores se disponen de forma que sus planos de polarización son perpendiculares entre sí, la luz se bloquea. Pero cuando el segundo filtro, llamado analizador, es paralelo al primero, la luz que pasa por el primer filtro pasa también a través del segundo.
24
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
luz no polarizada
polarizador
luz polarizada
analizador
luz bloqueada
luz no polarizada
polarizador
luz polarizada
analizador
Luz polarizada
Una celda de cristal líquido twisted nematic está compuesta por: • • • •
Dos superficies de vidrio transparente cubiertas de un material conductor también transparente (oxido de estaño) que actúa como electrodo Un regulador de precisión del gap entre las dos superficies de la celda. Dos polarizadores cruzados: el polarizador y el analizador Material de cristal liquido nematic
Las superficies de los electrodos transparentes en contacto con el cristal líquido se recubren de una fina capa de polímero que ha sido frotado en una dirección. Las moléculas de cristal líquido tienden a orientarse con sus ejes longitudinales paralelos a esta dirección. Las superficies de vidrio se disponen de manera que las moléculas adyacentes al electrodo superior se orienten formando un ángulo recto con el inferior. Cada polarizador está orientado con su plano de polarización paralelo a la dirección de frotación del electrodo adyacente (de esta forma el polarizador y el analizador están cruzados). En ausencia de un campo eléctrico el eje director del cristal líquido sufre un giro suave de 90º dentro de la celda. La luz no polarizada entra al primer filtro polarizador y sale polarizada en el mismo plano que la orientación local de las moléculas de cristal líquido. La disposición girada (twisted) de las moléculas de cristal líquido dentro de la celda actúan como guía de las ondas luminosas y rotan el plano de polarización en un cuarto de giro (90º) de manera que la luz que alcanza el segundo polarizador (analizador) puede atravesarlo. En este estado la celda de cristal líquido es transparente. Cuando se aplica un voltaje a los electrodos, las moléculas de cristal líquido tienden a alinearse con el campo eléctrico resultante E, y de esta forma se pierden su propiedad de guía de las ondas luminosas, bloqueándose el paso de la luz polarizada. Cuando se desconecta el campo eléctrico, las moléculas tienden a adoptar de nuevo el estado girado (twisteado) y la celda se convierte de nuevo en transparente.
25
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
luz no polarizada
polarizador
luz no polarizada
polarizador
luz polarizada
analizador
luz polarizada
luz polarizada
analizador
luz polarizada
1.5 Impresoras 1.5.1 Impresora de martillo La impresora de martillos se ha utilizado mucho en aplicaciones que operan en ambientes industriales, ya que su sencillez la hace muy robusta. Consta de un cilindro con el mismo carácter repetido a lo largo de toda una generatriz, y tantas generatrices como caracteres imprimibles. También dispone de una batería de martillos que se accionan eléctricamente, tantos como veces se repite el carácter en una generatriz. Entre los martillos y el cilindro se desliza una cinta entintada y el papel. Cada generatriz lleva asociada un pequeño imán en su extremo que genera un pulso cada vez que pasa debajo de una pequeña bobina. También existe un imán asociado a todo el cilindro que genera un pulso al inicio de una revolución. Con la información de los dos trenes de pulsos, el Control conoce en todo momento el carácter que se halla debajo de la batería de martillos. Sólo tiene que accionar los martillos correspondientes a las posiciones de la línea de escritura donde deba aparecer el carácter bajo los martillos. En general la escritura de una línea requerirá una vuelta completa del cilindro.
26
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Control
martillos
bobina
imanes
cinta entintada
A A A A A A A A B B B B B B BB C C C C C C C C
papel
inicio de revolución
Amp
fila de caracteres
1.5.2 Impresora de chorro de tinta La impresora de chorro de tinta utiliza un principio de funcionamiento análogo a las pantallas caligráficas de rayos catódicos. Controla la desviación eléctrica que experimenta un chorro de tinta ionizada para dibujar sobre el papel la forma deseada. En este caso la información de la forma a dibujar se traduce en una diferente ionización del chorro de tinta para que se desvíe de la forma adecuada cuando pasa por unos electrodos a potencial fijo en su camino hacia el papel. La ionización de la tinta se produce en un electrodo de carga que se controla con la señal del carácter a imprimir. La impresora dispone de un dispositivo para recoger la tinta no utilizada y devolverla al circuito de alimentación de la cabeza que emite el chorro. Las impresoras de inyección de tinta pueden producir texto e imágenes de alta calidad en blanco y negro o color.
deflexión vertical
electrodo de carga
0 - 200 V
papel 3 kV
Control bomba
Tinta
señal forma carácter
tinta no utilizada
Filtro
27
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1.5.3 Impresora láser El principio de funcionamiento de la impresora láser se asemeja al de la pantalla de barrido de rayos catódicos. La imagen eléctrica a imprimir la forma un rayo láser sobre un cilindro recubierto de un material fotoconductor giratorio cuya superficie se corresponde con la de la página impresa. El láser opera generatriz tras generatriz. Cada generatriz del cilindro se corresponde con una línea de puntos de la página. La imagen eléctrica se transforma en imagen real por la aplicación de un polvo de carbón denominado toner. El cilindro impregnado de toner se transfiere a la página de papel con la ayuda del calor y la presión. Rayo Laser Espejo octogonal rotatorio
Modulador
Emisor de Laser
Rodillo de arrastre
Toner
Cilindro giratorio
Ratón
fotodetector
Contador Y
Contador X
fotodetector
28
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
2. Buses de comunicación Un bus es un medio compartido de comunicación constituido por un conjunto de líneas (conductores) que conecta las diferentes unidades de un computador. La principal función de un bus será, pues, servir de soporte para la realización de transferencias de información entre dichas unidades. La unidad que inicia y controla la transferencia se conoce como master del bus para dicha transferencia, y la unidad sobre la que se realiza la transferencia se conoce como slave. Los papeles de master y slave son dinámicos, de manera que una misma unidad puede realizar ambas funciones en transferencias diferentes. Por ejemplo, una unidad de DMA hace de slave en la inicialización que realiza el master, la CPU, para una operación de E/S. Sin embargo, cuando comienza la operación, la unidad de DMA juega el papel de master frente a la memoria, que en esta ocasión hace de slave. Para garantizar el acceso ordenado al bus, existe un sistema de arbitraje, centralizado o distribuido, que establece las prioridades cuando dos o más unidades pretenden acceder al mismo tiempo al bus, es decir, garantiza que en cada momento sólo exista un master. Para establecer el tiempo de duración de las transferencias y que sea conocido tanto por el master como por el slave, un bus debe disponer de los medios necesarios para la sincronización master-slave. 2.1 Estructura de un bus Las líneas de un bus podemos clasificarlas en grupos, atendiendo al papel que cumplen en las transferencias: 1. Líneas de información básica: las utiliza el master para definir los dos elementos principales de una transferencia, el slave y los datos. Se dividen , pues, en dos grupos: •
Líneas de Direcciones: determinan la unidad que hace de slave en la transferencia
•
Líneas de Datos: transportan los datos de la transferencia.
Existen buses con líneas independientes para cada uno de los anteriores tipos de información. En cambio en otros se utilizan las mismas líneas multiplexadas en el tiempo. 2.
Líneas de control: transmiten las órdenes que determinan la operación de transferencia a realizar por las líneas de datos y direcciones, y marcan el ordenamiento temporal de las señales que circulan por el bus. Las primeras son las líneas de control propiamente dichas, de las que las más importantes son: • • • •
Escritura en memoria Lectura de memoria Operación de salida Operación de entrada
Las segundas son las líneas de sincronismo, entre las que cabe citar las siguientes: • • • 3.
Reconocimiento de transferencia Reloj Reset
Líneas de arbitraje: establecen la prioridad entre diferentes peticiones de acceso al bus. Por ejemplo: • • •
Petición del bus Cesión del bus Ocupación del bus
29
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
CPU
Memoria
E/S
direcciones, datos
control
arbitraje
Las líneas de un bus podemos también clasificarlas en función de su direccionalidad:
Líneas unidireccionales • Emisor simple control tri-state
•
Emisor múltiple
colector abierto
Líneas bidireccionales
30
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
control tri-state
Desde el punto de vista físico un bus es un conjunto de conductores eléctricos paralelos dispuestos sobre una tarjeta de circuito impreso. Los dispositivos del sistema se conectan a través de conectores (slots) dispuestas a intervalos regulares a lo largo del bus.
T a rje ta C o n e c to r B us
La disposición anterior corresponde generalmente a los buses del sistema. Los denominados buses de entrada/salida conectan las unidades a través de cables. Los principales parámetros que caracterizan un bus son: • • • •
Ancho de banda: velocidad de transferencia medida en Mb/s Anchura del bus: número de líneas que lo componen Ancho de datos: número de líneas de datos Capacidad de conexión: número de unidades conectadas al bus
2.2 Protocolos de transferencia 2.2.1 Síncronos
En los buses síncronos existe un reloj que gobierna todas las actividades del bus, las cuales tienen lugar en un número entero de ciclos de reloj. La transferencia propiamente dicha coincide con uno de los flancos del reloj (el de bajada en el ejemplo de la figura).
31
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
ciclo-1
ciclo-2
ciclo-3
Reloj tiempo de establecimiento
Dirección tiempo de mantenimiento Datos R/W Escritura
Lectura
Escritura
En este caso hemos supuesto que el tiempo de acceso al slave es menor de un ciclo, es decir, en cada ciclo tiene lugar una operación con memoria. Los buses síncronos son rápidos pero no tienen capacidad para conectar unidades con velocidad de transferencia baja. o no conocida a priori. 2.2.2 Asíncronos
Los buses asíncronos utiliza un protocolo tipo handshaking para comunicarse el master con el slave. En el siguiente diagrama se presenta el diálogo de señales que tiene lugar durante una transacción de lectura de memoria por parte de la CPU utilizando un protocolo asíncrono (handshaking) sobre un bus que multiplexa las direcciones y los datos sobre las mismas líneas (datos/dirección). 1) La CPU activa la señal de lectura al tiempo que coloca la dirección de la posición a leer en las líneas datos/dirección. 2) La Memoria detecta la activación de lectura, lee la dirección que hay en datos/dirección y activa la señal de reconocimiento para indicar que ha detectado la orden de lectura. 3) la CPU detecta la activación de reconocimiento y en respuesta desactiva la señal de lectura y libera las líneas de datos/dirección. 4) La memoria detecta que se ha desactivado la señal de lectura y desactiva la señal de reconocimiento para dar por terminado el reconocimiento de la orden de lectura. 5) Cuando la memoria ha accedido al dato y lo tiene preparado lo pone en datos/dirección y activa la señal de dato disponible. 6) La CPU detecta que dato disponible está activa y procede a leer los datos del bus y activar la línea de reconocimiento para indicar que ya dispone del dato. 7) La memoria detecta la señal de reconocimiento, desactiva dato disponible y libera las líneas de datos/dirección. 8) Finalmente, la CPU al detectar que se desactiva dato disponible, desactiva, a su vez, la señal de reconocimiento, indicando que la transmisión ha finalizado. A partir de este momento se puede iniciar una nueva transacción.
32
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
lectura datos/direccion es
dato
dirección
reconocimiento dato disponible
Tiempo de acceso a memoria
Un bus asíncrono trabaja igual que un par de máquinas de estados finitos que se comunican de tal forma que uno de los autómatas no avanza hasta que sabe que el otro autómata ha alcanzado un determinado estado, es decir, los dos autómatas están coordinados. Los buses asíncronos se escalan mejor con los cambios de tecnología y pueden admitir una mayor variedad de velocidades de respuesta en los dispositivos.
CPU
Memoria
dirección --> datos/dirección Activar petición lectura reconocimiento = 0
reconocimiento = 1
Liberar datos/dirección Desactivar lectura dato disponible = 1 dato disponible = 0 Memoria <-- datos/dirección Activar reconocimiento dato disponible = 0 dato disponible = 1 Desactivar reconocimiento
lectura = 0
lectura = 1
dirección <-- datos/dirección Activar reconocimiento lectura = 1
lectura = 0
Desactivar reconocimiento Memoria --> datos/dirección Activar dato disponible
reconocimiento = 0
reconocimiento = 1
Liberar datos/dirección Desactivar dato disponible
2.2.3 Semisíncronos
En los protocolos semisíncronos existe, como en los síncronos, un reloj que gobierna las transferencias en el bus. Sin embargo, en este caso existe, además, una señal de espera (wait) que es activada por el slave cuando la transferencia va a durar más de un ciclo de reloj. De esta forma, los dispositivos rápidos operarán como en bus síncrono, mientras que los lentos alargarán la operación el número de ciclos que les sea necesario.
33
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Reloj
Dirección
Datos Espera Escritura asíncrona
Escritura síncrona
Lectura síncrona
Lectura asíncrona
2.2.4 Ciclo partido
En los buses de ciclo partido la operación de lectura se divide en dos transacciones no continuas de acceso al bus. La primera transacción es la de petición de lectura que realiza el master sobre el slave. Una vez realizada la petición el master abandona el bus. Cuando el slave dispone del dato leído, inicia un ciclo de bus actuando como master para enviar el dato al antiguo master, que ahora actúa como slave. Dirección Slave
Dirección Master
Dirección
Master SYNC Slave SYNC Datos dirección Master Æ Slave
dato Slave Æ Master
3. Protocolos de arbitraje La demanda para utilizar el bus en un computador puede provenir de diferentes unidades, no sólo de la CPU. Por ejemplo, si el computador tiene E/S por DMA, éste demandará el uso del bus cuando tenga el control de la operación con la memoria. Los procesadores de E/S necesitan acceder al bus no sólo para realizar las transferencias de datos por DMA, sino también para leer su programa de canal. Por supuesto, si el sistema es multiprocesador (más de una CPU con memoria compartida) los candidatos al uso del bus aumentan. Para garantizar que en todo momento sólo una unidad acceda al bus, se utilizan los protocolos de arbitraje. Los protocolos de arbitraje organizan el uso compartido del bus, estableciendo prioridades cuando más de una unidad solicita su utilización y garantizando, sobretodo, que el acceso al bus es realizado por un solo master. Existen dos grupos de protocolos de arbitraje, los centralizados y los distribuidos. En los primeros existe una unidad de arbitraje, el árbitro del bus, encargado de gestionar de forma centralizada el uso del bus. El árbitro puede ser una unidad físicamente independiente o estar integrado en otra unidad, por ejemplo, la CPU. Por el contrario, en los protocolos distribuidos no existe ninguna unidad especial para la gestión del bus. Esta se realiza de forma distribuida entre las unidades de acceso. Examinaremos en los siguientes apartados diferentes protocolos de arbitraje, tanto centralizados como distribuidos. 3.1 Protocolo de encadenamiento (daisy chaining) de dos señales Es el protocolo centralizado más sencillo ya que utiliza sólo dos señales encadenadas, una de petición del bus y otra de concesión.
34
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El master que quiere acceder al bus activa la señal de petición (out) y los demás masters la propagan hasta el árbitro. El árbitro activa la señal de concesión que es propagada por los masters que no solicitaron el acceso al bus. El master que recibe la señal de concesión y tiene una petición pendiente toma el control del bus. Si un master recibe una señal de petición mientras está accediendo al bus, bloquea su propagación al árbitro hasta que finalice la utilización del bus. La prioridad viene determinada por la proximidad al árbitro. concesión
petición
in
out
in
out
M1
M2
out in
out in
in
out
Mn out in
ARBITRO
BUS
3.2 Protocolo de encadenamiento (daisy chaining) de tres señales Utiliza una línea más que el protocolo anterior, la línea de ocupación. Además, la línea de petición no es encadenada sino compartida por todos los masters a través de una entrada al árbitro con capacidad de O-cableada. Cuando un master toma el control del bus activa la línea de ocupación. El árbitro sólo activa la línea de concesión cuando recibe una petición y la línea de ocupación está desactivada. Como en el caso anterior, si un master recibe la concesión y no ha solicitado el bus, transmite la señal al siguiente master. Un master toma el control del bus si tiene una petición local pendiente, la línea de ocupación está desactivada y recibe el flanco de subida de la señal de concesión. concesión
M1
M2
Mn
petición ARBITRO ocupación
BUS
3.3 Protocolo de encadenamiento (daisy chaining) de cuatro señales Este protocolo permite simultanear el uso del bus por un master con el proceso de arbitraje para la selección del master siguiente. De esta forma, cuando el primer master abandona el bus, no se pierde tiempo en el arbitraje para el siguiente porque ya se ha hecho, pasando directamente el master seleccionado a realizar su transacción, al tiempo que se
35
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
realiza la selección del siguiente master. Para ello se añade una cuarta línea al esquema anterior, la línea de reconocimiento. concesión
M1
M2
Mn
petición ARBITRO ocupación
reconocimiento
BUS
La línea de reconocimiento la activa un master que solicitó el bus (activó petición) y recibió la concesión pero la línea de ocupación estaba activa (bus ocupado). Cuando el árbitro recibe la activación de reconocimiento inhibe su actuación, es decir, deja de atender la señal de petición y generar la de concesión. El master queda en espera para ocupar el bus tan pronto lo abandone su actual usuario, que lo hará desactivando la señal de ocupación. Cuando esto ocurre, el master ocupa el bus y desactiva la señal de reconocimiento, con lo que el arbitro recupera su actuación, procediendo a un nuevo arbitraje entre los master solicitantes, simultáneamente con la operación de transacción en el bus. En la siguiente figura hemos representado el diálogo de señales correspondiente a una ocupación del bus por el master M1, seguido por el arbitraje a favor de M2 mientras M1 realiza su transacción, y terminando con la ocupación del bus por M2 cuando M1 finaliza: M1
petición
M2 M1
M2
concesión M1
M2
ocupación M2
reconocimiento
3.4 Protocolo con concesión por encuesta (polling) Este protocolo sustituye la línea encadenada de concesión del bus por un conjunto de líneas que permiten acceder de forma selectiva a la dirección asignada cada master sobre estas líneas.
log2n
M1
M2
Mn
concesión ARBITRO
petición ocupación
BUS
36
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
3.5 Protocolo con señales independientes También denominado en estrella, utiliza una línea de concesión específica para cada línea de petición independiente. Esta alternativa tienen la ventaja que el árbitro puede aplicar distintos algoritmos de decisión en caso de peticiones simultaneas (FIFO, prioridad fija, prioridad variable). Además, los retardos de propagación de las señales son pequeños en comparación con las anteriores alternativas. Tiene la desventaja del número elevado de líneas de arbitraje (una por posible master). El número de master queda limitado al número de líneas existentes.
M1
M2
Mn
concesión-1 petición-1 ARBITRO concesión-2 petición-2 concesión-n petición-n
BUS
3.6 Protocolo distribuido En estos protocolos la responsabilidad del arbitraje no reside una unidad independiente sino que se distribuye por los diferentes masters conectados al bus.
M1
R1
M2
G1
Arbitro 1
R2 P1
M3
G2 G1
Arbitro 2
R3 P2
Mn
G3 G2
Arbitro 3
Rn P3
Gn Rn
Arbitro n
Pn
Bucle de prioridad
ocupación
Arbitro-i concede el bus al master Mi activando Gi si: • • •
Mi ha activado su línea de petición de bus Ri, La línea de ocupación está desactivada. La línea de entrada de prioridad Pi-1 está activada
Si el master Mi no ha activado su línea de petición de bus Ri, el Arbitro-i activa la línea de salida de prioridad Pi. 4 Jerarquía de un bus Los ordenadores antiguos utilizaban una topología de bus único, denominado bus del sistema o backplane, para conectar procesador, memoria y los módulos de E/S, tal como la que se muestra en la siguiente figura:
37
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Procesador
Bus del sistema (único)
Red
Memoria
Vídeo
Sin embargo, cuando el número de dispositivos conectados a un bus aumenta disminuye su rendimiento. Esto es debido a dos motivos fundamentales. El primero el aumento del retardo de propagación de las señales debido al aumento de longitud de los conductores que dan soporte al bus. Esto afecta especialmente a la propagación encadenada de la señal de concesión del bus. El segundo el incremento de demanda de acceso que se produce al aumentar el número de dispositivos conectados. Este exceso de dispositivos puede crear un cuello de botella que haga que el rendimiento del sistema se degrade por la espera inútil que se origina cuando tienen que realizar transferencias. Por otra parte, las diferencias en la velocidad de operación de los dispositivos conectados también repercute negativamente en el rendimiento de un bus. En efecto, los dispositivos lentos pueden ocasionar retrasos importantes a los rápidos. Por ejemplo, supongamos que un procesador que opera a 200 MHz (Tc = 5 ns, 100 MIPS) y con un CPI = 2. se conecta a un único bus compartido por la cache, la memoria y los dispositivos de E/S, entre ellos un disco con 10 ms de tiempo de acceso y 15 MB/seg de velocidad de transferencia. Durante la transferencia de disco a memoria de un archivo de 512 KB se emplearán 10 ms + 512 KB/ 15.000 KB/s = 44,1 ms. En este tiempo la CPU podría haber ejecutado 0,0441 * 100 * 106 = 4,41 millones de instrucciones. Para evitar la caída de rendimiento, el sistema de buses se jerarquiza, apareciendo dos buses más: el bus local, y el bus de E/S.
Procesador
bus local
Cache
Memoria
bus del sistema
Adaptador de bus
Bus de E/S o bus de expansión
Vídeo
Red
Impresora
Monitor
El bus local es de longitud pequeña, de alta velocidad, y adaptado a la arquitectura particular del sistema para maximizar el ancho de banda entre el procesador y la caché, por eso suele ser un bus propietario. Este bus aísla el tráfico procesador-caché del resto de transferencias del sistema.
El bus de E/S o de expansión reduce el tráfico en el bus del sistema, de manera que el procesador puede acceder a memoria en un fallo de caché mientras realiza una operación de entrada/salida.
38
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Los buses de expansión son buses estándar o abiertos (ISA, EISA, PCI, etc.) es decir, independientes del computador y con unas características bien definidas en el correspondiente documento de normalización. La existencia de estos buses permite diseñar una amplia gama de controladores de periféricos compatibles. Para conectar los buses del sistema y de expansión se requiere un Adaptador de Bus, dispositivo que permite adaptar las distintas propiedades de ambos buses: velocidad, carácter síncrono o asíncrono, multiplexación, etc. El proceso de jerarquización se puede complicar más con otras topologías que den cabida a dispositivos de distinta velocidad. De esta forma se equilibra mejor el tráfico de información en sistemas que operan con muchos dispositivos conectados. En la figura siguiente se muestra una topología jerárquica en la que se contempla un bus de alta velocidad del que cuelgan dos buses, uno de expansión para dispositivos rápidos y otro de E/S para dispositivos lentos.
bus local
Procesador
Cache
Memoria
bus del sistema
Adaptador de bus
Bus de alta velocidad
Vídeo
Adaptador de bus
Red
Monitor
Adaptador de bus
Bus de E/S
Bus de expansión
Red
Red
Red
5. Buses normalizados Las especificaciones de un bus estándar están perfectamente definidas en un documento de estandarización respaldado por alguna sociedad de prestigio en el área (IEEE, etc.). En las especificaciones se distinguen varios niveles: •
Nivel mecánico, en el que se recoge la forma y tamaño de los conectores, el número de contactos por conector y el número de dispositivos que soporta el bus.
39
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
•
Nivel eléctrico, en el que se especifican los valores de tensión de las diferentes señales, polarización, etc.
•
Nivel lógico, especifica la función de cada señal del bus: direcciones, datos, control, etc.
•
Nivel de temporización o sincronismo, que especifica el protocolo de transferencia empleado
•
Nivel de arbitraje, especifica el protocolo de arbitraje que utiliza el bus.
5.1 Bus PCI (Peripheral Component Interconnect) El bus PCI es un bus de ancho de banda elevado e independiente del procesador. El estándar actual permite el uso de hasta 64 líneas de datos a 66 MHz, para una velocidad de transferencia de 528 MBytes/s, o 4,224 Gbps. El PCI está diseñado para permitir una cierta variedad de configuraciones basadas en microprocesadores, incluyendo sistemas con uno o varios procesadores. Utiliza temporízación síncrona y un esquema de arbitraje centralizado. 5.1.1 Estructura
El bus PCI puede configurarse como un bus de 32 o 64 bits. La siguiente tabla define las líneas más importantes obligatorias en el PCI: CLK (reloj)
Señal de reloj que es muestreada en el flanco de subida.
RST# (reset)
Hace que todos los registros y señales específicas del PCI pasen al estado inicial.
Señales de direcciones y datos AD[31:0]
Incluye 32 líneas para datos y direcciones multiplexadas en el tiempo.
C/BE[3:0]#
Se utilizan para interpretar y validar las líneas de datos y direcciones.
Señales de control de interfaz FRAME#
Activada por el master para indicar el comienzo y la duración de una transferencia. Las activa al comienzo y la desactiva al final de la fase de datos.
IRDY#
Señal de master preparado (Initiator Ready). La proporciona el master actual del bus (el iniciador de la transacción). Durante una lectura, indica que el master está preparado para aceptar datos; durante una escritura indica que el dato válido está en AD.
TRDY#
Señal de slave preparado (Target Ready). La activa el slave al principio de la transferencia, y la desactiva cuando no puede completar la transferencia en un solo ciclo de reloj
DEVSEL#
Señal de slave (dispositivo) seleccionado (Device Select). Activada por el slave cuando ha reconocido su dirección.
Señales de arbitraje REO#
Indica al árbitro que el dispositivo correspondiente solicita utilizar el bus. Es una línea punto-a-punto específica para cada dispositivo.
GNT#
Indica al dispositivo que el árbitro le ha cedido el acceso al bus. Es una línea punto-a-punto específica para cada dispositivo.
5.1.2 Ordenes
40
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
La actividad del bus consiste en transferencias entre dos elementos, denominándose maestro al que inicia la transacción. Cuando un maestro del bus adquiere el control del mismo, determina el tipo de transferencia que se producirá a continuación. Los tipos, entre otros son los siguientes: • • • • •
Reconocimiento de interrupción Lectura de E/S Escritura en E/S Lectura de memoria Escritura en memoria
5.1.3 Transferencia de datos
Toda transferencia de datos en el bus PCI es una transacción única, que consta de una fase de direccionamiento y una o más fases de datos. La siguiente figura muestra la temporización de una operación de lectura. Todos los eventos se sincronizan en las transiciones de bajada del reloj, cosa que sucede a la mitad de cada ciclo de reloj. 1
2
3
4
5
6
7
8
CLK a FRAME
h d
AD
direccion
dato-1
b C/BE
dato-2
dato-3
e
lectura
byte activo
byte activo
c
byte activo
g
IRDY
i f TRDY
DEVSEL
fase de dirección
fase de datos
fase de datos
fase de datos
Los dispositivos interpretan las señales del bus en los flancos de subida, al comienzo del ciclo. A continuación, se describen los eventos significativos señalados en el diagrama: a)
Una vez que el master ha obtenido el control del bus, inicia la transacción: • activando FRAME, que permanece activa hasta la última fase de datos • situando la dirección de inicio en el bus de direcciones • situando la orden de lectura en las líneas C/BE.
b)
El slave reconoce su dirección en las líneas AD al comienzo del ciclo de reloj 2.
c)
El master deja libre las líneas AD del bus y cambia la información de las líneas C/BE para indicar qué líneas AD se utilizan para transportar datos (de 1 a 4 bytes). También activa IRDY para indicar que está preparado para recibir el primer dato (*).
41
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
d)
El slave activa DEVSEL para indicar que ha reconocido su dirección. Después sitúa el dato solicitado en las líneas AD y activa TRDY para indicar que hay un dato válido en el bus.
e)
El master lee el dato al comienzo del ciclo de reloj 4 y cambia las líneas C/BE según se necesite para la próxima lectura.
f)
En este ejemplo el slave necesita algún tiempo para preparar el segundo bloque de datos para la transmisión. Por tanto desactiva TRDY para señalar al master que no proporcionará un nuevo dato en el próximo ciclo. En consecuencia el master no lee las líneas de datos al comienzo del quinto ciclo de reloj y no cambia la señal C/BE durante ese ciclo. El bloque de datos es leído al comienzo del ciclo de reloj 6.
g)
Durante el ciclo 6 el slave sitúa el tercer dato en el bus. No obstante, en este ejemplo, el master todavía no está preparado para leer el dato. Para indicarlo, desactiva IRDY. Esto hará que el slave mantenga el tercer dato en el bus durante un ciclo de reloj extra.
h)
El master sabe que el tercer dato es el último, y por eso desactiva FRAME para indicárselo al slave. Además activa IRDY para indicar que está listo para completar esa transferencia.
i)
El master desactiva IRDY, haciendo que el bus vuelva a estar libre, y el slave desactiva TRDY y DEVSEL.
(*) Nota: En todas las líneas que pueden ser activadas por más de un dispositivo se necesita un ciclo de cambio (indicado por las dos flechas circulares) para que pueda ser utilizado por el dispositivo de lectura. 5.1.4 Arbitraje
El bus PCI utiliza un esquema de arbitraje centralizado síncrono, en el que cada maestro tiene una señal propia de petición (REQ) y cesión (GNT) del bus. Estas líneas se conectan a un árbitro central. La especificación PCI no indica un algoritmo particular de arbitraje. El árbitro puede utilizar un procedimiento de primero en llegar primero en servirse, un procedimiento de cesión cíclica (round-robin), o cualquier clase de esquema de prioridad. El maestro del PCI establece, para cada transferencia que desee hacer, si tras la fase de dirección sigue una o más fases de datos consecutivas. La siguiente figura es un ejemplo en el que se arbitra a cuál de los dispositivos A y B se cede el bus. Se produce la siguiente secuencia:
42
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
1
2
3
4
5
6
7
CLK REQ#-A
a b
REQ#-B GNT#-A
c
e GNT#-B d
f
g
FRAME
IRDY# TRDY#
AD
Dirección
Dato
Dirección
acceso A
Dato
acceso B
a)
En algún momento anterior al comienzo del ciclo de reloj 1, A ha activado su señal REQ. El árbitro muestrea esa señal al comienzo del ciclo de reloj 1.
b)
Durante el ciclo de reloj 1, B solicita el uso del bus activando su señal REQ.
c)
Al mismo tiempo, el árbitro activa GNT-A para ceder el acceso al bus a A.
d)
El maestro del bus A muestrea GNT-A al comienzo del cielo de reloj 2 y conoce que se le ha cedido el acceso al bus. Además, encuentra IRDY y TRDY desactivados, indicando que el bus está libre. En consecuencia, activa FRAME y coloca la información de dirección en el bus de direcciones, y la orden correspondiente en las líneas C/BE. Además mantiene activa REQ-A, puesto que tiene que realizar otra transferencia después de la actual.
e)
El árbitro del bus muestrea todas las líneas GNT al comienzo del ciclo 3, y toma la decisión de ceder el bus a B para la siguiente transacción. Entonces activa GNT-B y desactiva GNT-A. B no podrá utilizar el bus hasta que éste no vuelva a estar libre.
f)
A desactiva FRAME para indicar que la última transferencia de datos está en marcha. Pone los datos en el bus de datos y se lo indica al dispositivo destino con IRDY. El dispositivo lee el dato al comienzo del siguiente ciclo de reloj.
g)
Al comienzo del ciclo 5, B encuentra IRDY y FRAME desactivados y, por consiguiente, puede tomar el control del bus activando FRAME. Además, desactiva su línea REQ, puesto que sólo deseaba realizar una transferencia.
Hay que resaltar que el arbitraje se produce al mismo tiempo que el maestro actual del bus está realizando su transferencia de datos. Por consiguiente, no se pierden ciclos de bus en realizar el arbitraje. Esto se conoce como arbitraje oculto o solapado (hidden arbitration). 5.2 Bus USB (Universal Serial Bus)
43
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El bus USB (Universal Serial Bus) es un bus normalizado para la conexión de periféricos, desarrollado por empresas de informática y telecomunicaciones (7 compañías: Compaq, DEC, IBM, Intel, Microsoft, NEC y Northern Telecom). Permite conectar de forma sencilla dispositivos periféricos al computador, sin necesidad de reiniciarlo ni de configurar el sistema. Se pueden conectar hasta 127 dispositivos, con una longitud máxima de cable de 5 metros para cada uno, con lo que una conexión en cadena permitiría que el último dispositivo estuviese a 635 metros del ordenador. Trabaja en dos modos, a baja velocidad, 1,5 Mbps, para dispositivos lentos como teclados y ratones, y a alta velocidad, 12 Mbps, para dispositivos rápidos, como CD-ROM , módems, etc. Utiliza un cable de cuatro hilos, dos para datos y dos para alimentación. El bus USB está organizado en una estructura de árbol descendente, con unos elementos especiales, llamados hubs que encaminan las señales desde un dispositivo al host o viceversa. En la raíz está el host, que es el interfaz entre el bus USB y el bus del ordenador. De él cuelgan los dispositivos USB y los hubs, que también son dispositivos USB. A un hub se puede conectar uno o más dispositivos, que a su vez pueden ser otros hubs. Teclado
Ratón
Monitor
Teclado
Mic
Host(CPU)
Scaner
Teléfono
Hub
Cuando se conecta un dispositivo, se detecta la diferencia de tensión en la red USB y procede a determinar las características del dispositivo (vendedor, funcionalidad, ancho de banda requerido, etc.). El host le asigna una dirección única ID para diferenciarlo del resto de los dispositivos de la red USB. Después el SO carga los drivers del dispositivo, solicitándolos al usuario si es necesario. Cuando se desconecta el dispositivo, el host lo detecta y descarga los drivers. El host USB tiene, entre otras, las siguientes funciones:
Detectar la conexión de nuevos dispositivos al sistema . Detectar la desconexión de dispositivos previamente conectados, Enumerar y configurar los dispositivos conectados al sistema. Administrar y controlar el flujo de datos entre el host y los dispositivos USB. Administrar y controlar las transferencias síncronas y asíncronas de información. Recoger y resumir estadísticas de actividad y estado de los elementos del sistema. Proporcionar energía eléctrica a algunos dispositivos del computador (teclado, ratón, etc.).
Un puerto serie es capaz de transmitir hasta 112,5 KB/s y un puerto paralelo entre 600KB/s y 15MB/s, sin embargo la velocidad de transferencia de un puerto USB está entre 1,5MB/s y 12MB/s. El FIREWIRE (IEEE 1394), maneja transferencias entre 100MB/s y 400MB/s, que permite conectar hasta 63 dispositivos y un cable de 4.5 metros por dispositivo, permitiendo al igual que el USB la conexión en operación. Uno de los problemas del puerto USB es que suministra solamente 500 miliamperios de corriente para los dispositivos conectados, que aunque es suficiente para la mayoría de los dispositivos que se conectan a este puerto, resulta pequeña cuando conectamos varios dispositivos sin fuente de alimentación propia. Otra de las funciones importantes de los hubs es la de aislar a los puertos de baja velocidad de las transferencias de alta velocidad, proceso sin el cual todos los dispositivos de baja velocidad conectados al bus entrarían en colapso. La protección de los dispositivos lentos de los rápidos ha sido siempre un problema importante en el diseño redes mixtas, como es USB. El hub está compuesto por dos unidades principales: el Controlador y el Repetidor. El Repetidor tiene la función de analizar, corregir y retransmitir la información que llega al hub hacia los puertos del mismo. Contiene una memoria de varios registros para sus funciones.
44
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
El Controlador es una pequeña CPU de supervisión de las múltiples funciones realiza un hub. Todos los dispositivos conectados acceden al canal o medio para transmitir sus datos siguiendo un protocolo administración del host análogo al de token ring, que consecutivamente va dando la posibilidad de transmisión a cada periférico. 5.2.1 Arquitectura
En la siguiente figura aparece un diagrama de bloques de un microcontrolador USB: DPO
D MO Tra n s c e iv e r
S IE (Ser ia l Bu s In t er fa ce E n gin e)
F IU (F u n ct ion In t er fa ce U n it ) CP U
Bu s Da t os
Bu s Tr a n sm it Receive
F IF Os
Transceiver El cable USB dispone de solo cuatro hilos: Vbus, D+, D- y GND. La información y los datos van por los hilos D+ y D-, con dos velocidades: 12Mbps o 1.5Mbps. El Transceiver, incorporado dentro del chip controlador, constituye la interfaz de un dispositivo externo con el resto del sistema.
SIE (Serial Interface Engine) Tiene la función de serializar y paralelizar las transmisiones, además maneja los protocolos de comunicación, las secuencias de paquetes, el control CRC y la codificación NRZI.
FIU (Function Interface Unit) Administra los datos que son transmitidos y recibidos por el cable USB. Se basa y apoya en el contenido y estado de las memorias FIFOs. Controla los estados de las transacciones, los buffer FIFO, y solicita atención para diversas acciones a través de interrupciones.
FIFOs Los controladores típicos disponen de un total de 8 buffer tipo FIFO, cuatro destinadas a la transmisión y cuatro a la recepción de datos. Tanto para la transmisión como para la recepción, los buffer soportan cuatro tareas o funciones, numeradas de 0 a 3. 5.2.2 Protocolo
Toda transferencia de datos o transacción que emplee el bus, involucra al menos tres paquetes de datos. Cada transacción se da cuando el host decide qué dispositivo hará uso del bus. Para ello envía un paquete al dispositivo específico. Cada dispositivo tiene un número de identificación, asignado por el Controlador de host cuando arranca el computador o cuando un se conecta un dispositivo nuevo al sistema. De esta forma, cada periférico puede determinar si es el receptor de un paquete de datos. Técnicamente un paquete de datos se denomina Token Packet.
45
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Este protocolo tiene un sistema muy eficiente de recuperación de errores, empleando uno de los modelos más seguros como es el CRC (Código de Redundancia Cíclica). Y puede estar implementado al nivel de software y/o hardware de manera configurable. 5.2.3 Modos de transmisión
Asíncrona
Síncrona
Bulk La transmisión Bulk, es una comunicación no periódica, utilizada por transferencias que requieren todo el ancho de banda disponible o en su defecto son retrasadas hasta que el ancho de banda completo esté disponible. Aparecen en el movimientos de imágenes o vídeo, donde se requiere una gran capacidad de transferencia en poco tiempo.
USB permite dos tipos más de transferencias de datos: Control Es un tipo de comunicación exclusivamente entre el host y el dispositivo que permite configurar este último. Sus paquetes de datos son de 8, 16, 32 o 64 bytes, dependiendo de la velocidad del dispositivo que se pretende controlar. Interrupción Este tipo de comunicación está disponible para aquellos dispositivos que demandan mover muy poca información y con poca frecuencia. Su paquete de datos tiene las mismas dimensiones que el de las transmisiones de control.
5.3 Bus SCSI (Small Computer System Iterface) El bus SCSI se utiliza en ordenadores personales y en muchas estaciones de trabajo. Se trata de una interfaz paralela, con 8, 16 o 32 líneas de datos. Cada dispositivo SCSI tiene dos conectores, uno de entrada y otro de salida, conectándose en cadena (daisy chain). Todos los dispositivos funcionan independientemente, y pueden intercambiar datos entre ellos, igual que con el computador. Por ejemplo, un disco duro puede guardar su contenido en una cinta sin que tenga que intervenir el procesador. Los datos se transfieren mediante paquetes, que componen un mensaje.
Versiones
La especificación original SCSI, la SCSI-1, se desarrolló en los años 80. SCSI-1 utiliza 8 líneas de datos y opera a una frecuencia de reloj de 5 MHz, o a una velocidad de datos de 5 MBytes/s. SCSI-1 permite conectar al computador hasta siete dispositivos. En 1991 se introdujo SCSI-2. Los cambios más notables fueron la expansión opcional a 16 o 32 líneas de datos y el aumento de la frecuencia de reloj a 10 MHz. Como resultado se tiene una velocidad de datos máxima de 20 o 40 Mbytes/s.
Fases
Todos los intercambios en el bus SCSI se producen entre un dispositivo iniciador y un dispositivo seleccionado. Normalmente, el computador es el iniciador y un controlador periférico el dispositivo seleccionado, pero algunos dispositivos pueden asumir los dos papeles. En cualquier caso, toda la actividad del bus se produce en una secuencia de fases: • Bus Libre: ningún dispositivo está utilizando el bus, está disponible. • Arbitraje: determina el dispositivo que toma control del bus, de manera que pueda iniciar o reanudar una operación de E/S. • Selección: de un dispositivo para realizar una operación, por ejemplo, una orden de lectura o escritura. • Reselección: permite que el dispositivo seleccionado se vuelva a conectar al iniciador para reanudar una operación iniciada previamente, pero suspendida por el dispositivo.
46
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• Orden: el dispositivo solicita una orden de información al iniciador. • Datos: el dispositivo solicita la transferencia de un dato hacia el iniciador (entrada de datos, Data In) o viceversa (salida de datos, Data Out). • Estado: el dispositivo solicita la información de estado desde al iniciador. • Mensaje: el dispositivo solicita la transferencia de uno o más mensajes desde el iniciador (entrada de mensaje, Message In) o viceversa (salida de mensaje, Message Out). La siguiente figura ilustra el orden en que se producen las fases del bus SCSI: Condición de encendido o inicio
Fase de bus libre
Fase de arbitraje
Fase de selección o reselección
Fase de orden, datos, estado y mensaje
Después de conectarse el sistema, o después de un reinicio, el bus pasa a la fase de bus libre. A ésta le sigue la fase de arbitraje, que da lugar a que un dispositivo tome el control. Si el arbitraje falla, el bus vuelve a la fase de bus libre. Cuando el arbitraje termina con éxito, el bus pasa a una fase de selección o reselección, en la que se designa un iniciador y un dispositivo seleccionado para realizar la transferencia. Después de determinados los dos dispositivos, se producirá una o más fases de transferencia de información entre ambos (fases de orden, datos, estado y mensaje). La fase final de transferencia de información es normalmente la fase de entrada de mensaje, en la que un mensaje de desconexión o de orden completa se transfiere al iniciador, seguida de una fase de bus libre. Una característica importante del bus SCSI es la capacidad de reselección. Si una orden enviada necesita algún tiempo para completarse, el dispositivo seleccionado puede liberar el bus y volverse a conectar al iniciador más tarde. Por ejemplo, el computador puede enviar una orden a un dispositivo de disco para que dé formato al disco, y el dispositivo realiza la operación sin necesidad de acceder al bus. Líneas de señal BSY: Bus ocupado, activada por el iniciador o dispositivo seleccionado SEL: Selección de un dispositivo por el iniciador o del iniciador por un dispositivo C/D: Indicación por el dispositivo si el bus de datos lleva información de control (orden, estado o mensaje) o datos I/O: Control por el dispositivo de la dirección del movimiento de datos en el bus de datos. REQ: Petición por el dispositivo de una transferencia de información o datos. ACK: Reconocimiento por el iniciador de la señal de REQ del dispositivo. DB(7-0): Bus de datos Operación (temporización) Para aclarar el papel de cada señal en las distintas fases (estados) del bus, analizaremos una operación de lectura que transfiere datos desde un dispositivo periférico al iniciador (computador). Esta sigue las siguientes fases:
47
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
Arbitraje
Selección
Orden
Transferencia de datos
Estado
Mensaje
El arbitraje se realiza con la señal BSY y las 8 señales de datos, la 7 asignada al computador, y las otras 7 asignadas a otros tantos dispositivos (7 es el número máximo de dispositivos que se pueden conectar al SCSI-1). El dispositivo que quiere acceder al bus activa BSY y su señal de datos asociada. Entre las señales de datos existe una prioridad, siendo la 7 la más prioritaria y la 0 la menos prioritaria. Cada dispositivo conoce si puede acceder al bus leyendo las líneas de datos. Si no hay otra activa con mayor prioridad accederá al bus. En nuestro caso es la CPU quien accede (máxima prioridad) para realizar la lectura. El dispositivo que ha ganado el arbitraje se convierte en el iniciador y comienza la fase de selección del dispositivo con el que quiere realizar la transacción. Para eso activa la señal SEL y las dos líneas de datos: la suya propia y la del dispositivo con el que quiere conectar. El dispositivo reconoce su identificación activando la señal BSY que ha desactivado previamente el iniciador después de su uso en el arbitraje. Después se pasa a la fase de orden en la que el iniciador transmite al dispositivo en forma asíncrona el conjunto de bytes que componen la orden a ejecutar (lectura en nuestro caso). El sincronismo se realiza con la ayuda de las señales conocidas REQ (controlada por el dispositivo y leída por el iniciador) y ACK (controlada por el iniciador y leída por el dispositivo). Una vez que el dispositivo conoce que es una orden de lectura se pasa a la fase de transmisión de datos que de nuevo se realiza byte a byte de forma asíncrona con la ayuda de REQ y ACK.. Finalizada la transmisión el dispositivo pasa el bus a la fase de estado en la que transmite un byte en el que se codifica que la transmisión se ha realizado con éxito. Finalmente el dispositivo hace pasar al bus a la fase de mensaje en la que se transmite un byte con el mensaje de orden completa. El diagrama de tiempos para la orden de lectura con las principales señales implicadas sería el siguiente:
BSY
SEL C/D
I/O REQ
ACK
DB(7-0) byte orden Arbitraje
Selección
byte orden Orden
gyte datos
byte datos
Datos (entrada)
byte estado Estado
orden completa Mensaje
Mensajes • Orden completa • Desconexión
48
Estructura de Computadores, Facultad de Informática, UCM, Curso 04-05
• • •
Error detectado en el iniciador Abortar Transferencia síncrona de datos
49