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