Está en la página 1de 20

UNIDAD 2: “Subsistema Unidad Central de Procesos”

• Repaso de máquinas que ejecutan instrucciones


• Ejemplificación en procesadores típicos IA32
• Análisis del conjunto de instrucciones en procesadores de uso comercial
• Concepto de máquinas CISC y RISC
• Lineamientos básicos en el diseño de un procesador RISC. Análisis de
prestaciones. Ejemplos: procesadores MIPS y ARM.
• Interrupciones: tratamiento general
• Interrupciones por software y por hardware, vectores, descripción y
tratamiento particular de cada una
• Relación entre las interrupciones y el manejo de operaciones de E/S

Preguntas frecuentes en finales viejos:

Describa cómo se debe implementar la estructura de pila en un procesador de


tipo RISC cuyos registros son genéricos (basarse en MIPS) ¿Cómo se deberá
trabajar el anidamiento de procesos/funciones?
Describa las características que diferencian los procesadores RISC de los CISC

Análisis del conjunto de instrucciones en procesadores de uso comercial


Desde el desarrollo del computador de programa almacenado alrededor del año 1950,
ha habido extraordinariamente pocas innovaciones auténticas en las áreas de
organización y arquitectura de computadores. Los siguientes son algunos de los
principales avances desde el nacimiento del computador:
El concepto de familia: Introducido por IBM en su system/360 en 1964. Se
ofrece un conjunto de computadoras, con distintas características en cuanto a precio y
prestaciones, que presentan al usuario la misma arquitectura.
Unidad de control microprogramada: Introducida por IBM en s/360 en 1964, la
microprogramación facilita la tarea de diseñar e implementar la unidad de control y da
soporte al concepto de familia.
Memoria cache: Introducida por primera vez en el IBM s/360 en 1968. La
introducción de este elemento en la jerarquía de memoria mejoró las prestaciones de
manera espectacular.
Segmentación de cauce: Una manera de introducir paralelismo en la naturaleza
esencialmente secuencial de un programa constituido por instrucciones máquina. Dos
ejemplos son la segmentación de instrucciones y procesamiento vectorial.
Múltiples procesadores: Esta categoría cubre diferentes organizaciones y
objetivos.

A esta lista hay que añadir una de las más interesantes y, potencialmente, de las
más importantes innovaciones: la arquitectura de computador de repertorio reducido de
instrucciones (reduced instruction set computer RISC).

Características de la ejecución de instrucciones


Uno de los aspectos relacionados con los computadores que han evolucionado de
manera más visible es el de los lenguajes de programación. Conforme el coste del
hardware ha disminuido, el coste relativo del software ha ido creciendo. Junto con esto,
la escasez permanente de programadores ha hecho subir los costes del software en
términos absolutos. De ahí que el coste principal del ciclo de vida de un sistema sea el
software, no el hardware. Otro elemento que se añade al coste y a otros
inconvenientes, es la falta de fiabilidad: es frecuente que los programas, tanto de
sistema como de aplicación, continúen mostrando nuevos errores después de años de
funcionamiento.
La solución a esto fue desarrollar lenguajes de programación de alto nivel más
potentes y complejos. Estos lenguajes de alto nivel (high level languajes, HLL)
permiten al programador expresar los algoritmos de manera más concisa, se encargan
de gran parte de los pormenores y, a menudo, apoyan de manera más natural la
programación estructurada o el diseño orientado a objetos.
Desgraciadamente, la solución ocasionó otro problema, conocido como el salto
semántico: la diferencia entre las operaciones que proporcionan los HLL y las que
proporcionan la arquitectura del computador. Los supuestos síntomas de este salto
incluían: ineficiencia de la ejecución, tamaño excesivo del programa en lenguaje
máquina y complejidad de los compiladores.
Los diseñadores respondieron con arquitecturas que proponían cerrar ese hueco.
Sus características principales incluyen repertorios de instrucciones grandes, docenas
de modos de direccionamiento y varias sentencias HLL implementadas en hardware.
Mientras tanto se hicieron estudios, que dieron como resultado una arquitectura
que diera soporte a los HLL más sencillos, en lugar de a los más complejos.

Operaciones

Se han hecho varios estudios para analizar el comportamiento de los programas


escritos en HLL. Existe una gran concordancia en los resultados de esta mezcla de
lenguajes y aplicaciones. Las sentencias de asignación predominan, lo cual indica que el
sencillo movimiento de datos tiene mucha importancia. También predominan las
sentencias condicionales (if, loop). Estas sentencias se implementan en el lenguaje
máquina con alguna instrucción del tipo “comparar y saltar”. Esto indica que el
mecanismo incluido en el repertorio de instrucciones para el control del
secuenciamiento es importante.

Estos resultados son instructivos para el diseñador del repertorio de


instrucciones máquina, porque le dicen que tipos de sentencias tiene lugar más a
menudo, y por consiguiente deben ser implementadas de una forma óptima. No
obstante, estos resultados no revelan que sentencian consumen más tiempo en la
ejecución de un programa típico. Es decir, dado un programa en lenguaje máquina
compilado, ¿qué sentencias del lenguaje fuente provocan la ejecución de la mayoría de
las instrucciones en lenguaje máquina?

Operandos
Estos estudios demostraron que la mayoría de las referencias se hacen a variables
escalares simples. Además, más del 80% de los datos escalares eran variables locales,
asimismo, las referencias a matrices/estructuras requieren una referencia previa a su
índice o puntero que nuevamente suele ser un dato escalar local. de este modo, hay un
predominio de referencias a operandos escalares, y estos están muy localizados.

Estos estudios también reflejan la importancia de una arquitectura que se


preste a un rápido acceso a operandos, dado que es una operación que se realiza con
mucha frecuencia. Un candidato fundamental a optimizar es el mecanismo de
almacenamiento y acceso a variables escalares locales.

Llamadas a procedimientos

Hemos visto que las llamadas y retornos de procedimientos constituyen un aspecto


importante de los programas en HLL, son las operaciones que consumen más tiempo
en programas en HLL compilados. Así, será ventajoso considerar formas de
implementar estas operaciones eficientemente.
Hay dos aspectos importantes: el número de parámetros y variables que trata
un procedimiento y la profundidad de anidamiento. El estudio de Tanenbaum
encontró que al 98% de los procedimientos llamados

dinámicamente se les pasaban menos de seis argumentos, y que el 92% de ellos


usaban menos de seis variables escalares locales. El equipo de RISC de Berkeley
presentó resultados parecidos. Estos resultados muestran que el número de palabras
necesarias por cada activación de un procedimiento no es muy grande. Los resultados
expuestos anteriormente indicaban que una alta proporción de referencias a operandos
se hacía a variables locales escalares. Estos estudios muestran que aquellas referencias
se limitan, de hecho, a relativamente pocas variables.

El mismo grupo de Berkeley también estudió los patrones seguidos por las
llamadas y retornos de procedimientos de programas en HLL. encontraron que es poco
común tener una larga secuencia ininterrumpida de llamadas a procedimientos seguida
por la correspondiente secuencia de retornos. Vieron, más bien que un programa
permanece confinado en una ventana bastante estrecha de profundidad de invocación
a procedimientos. Tales resultados refuerzan la conclusión de que las referencias a
operandos están muy localizadas.

Consecuencias

Intentar realizar una arquitectura de repertorio de instrucciones cercano al de los HLL,


no es la estrategia de diseño más efectiva. En su lugar, se puede ofrecer mejor soporte
para los HLL optimizando las prestaciones de las características de los programas
típicos en HLL que más tiempo consumen. Los elementos que caracterizan las
arquitecturas RISC son:

1. Un gran número de registros, o un compilador que optimice el tratamiento de


estos. Su finalidad es optimizar las referencias a operandos. Los estudios recién
discutidos muestran que hay varias referencias por instrucción de HLL, y que
hay una alta proporción de sentencias de transferencia (asignación), esto
asociado con la localidad y predominio de las referencias a datos escalares,
sugiere que las prestaciones pueden mejorarse reduciendo las referencias a
memoria, a costa de más referencias a registros. Debido a la localidad de estas
referencias, parece práctico un conjunto de registros ampliado.

2. Hay que prestar una cuidadosa atención al diseño de los cauces de


instrucciones. Debido a la alta proporción de instrucciones de bifurcación
condicional y de llamada a procedimientos, un cauce de instrucciones sencillo
será ineficiente. Esto se manifiesta debido a que una gran proporción de
instrucciones se pre-captan, pero nunca llegan a ejecutarse.

3. Es recomendable un repertorio de instrucciones simplificado.

Utilización de un amplio banco de registros


Lo deseable es un rápido acceso a los operandos. Dependemos del almacenamiento en
registros ya que constituyen el dispositivo de almacenamiento más rápido disponible;
más que la memoria principal y que la cache. El banco de registros es pequeño
físicamente, está en el mismo chip que la ALU y la unidad de control, y emplea
direcciones mucho más cortas que las de la cache y la memoria. Por tanto, se necesita
una estrategia que permite que los operandos a los que se accede con mayor frecuencia
se encuentren en registros, y que se minimicen las operaciones registro-memoria.
Son posibles dos aproximaciones básicas: una basada en software y la otra en
hardware. La aproximación por software consiste en confiar al compilador la
maximización del uso de los registros. El compilador intentará asignar registros a las
variables que se usen más en un periodo de tiempo dado. Esta aproximación requiere el
uso de sofisticados algoritmos de análisis de programas. La aproximación por hardware
consiste sencillamente en usar más registros, de manera que más variables puedan
mantenerse en registros durante periodos más largos de tiempo.
En esta sección nos enfocaremos en la aproximación por hardware. Este enfoque
se usó en el primer producto RISC comercial (el Pyramid), y se utiliza en la actualidad
en la arquitectura SPARC.

Ventanas de registros
El uso de un conjunto amplio de registros debería reducir la necesidad de acceder a
memoria.
Ya que la mayoría de las referencias se hacen a datos escalares locales, la
solución evidente sería almacenar éstos en registros, reservando tal vez, registros para
variables globales. El problema que surge es que la definición de “local” varía con cada
llamada y retorno de procedimiento, operaciones que suceden con frecuencia.
La verdadera solución se basa en otros dos resultados. En primer lugar, un
procedimiento típico emplea sólo unos pocos parámetros de llamada y variables locales,
en segundo lugar, la profundidad de activación de procedimientos fluctúa dentro de un
rango relativamente pequeño.
Para explotar estas propiedades, se usan múltiples conjuntos pequeños de
registros, cada uno asignado a un procedimiento distinto. Una llamada a un
procedimiento hace que el procesador conmute automáticamente a una ventana de
registros distinta de tamaño fijo, en lugar de salvaguardar los registros en memoria.
Las ventanas de procedimientos adyacentes están parcialmente solapadas para permitir
el paso de parámetros.

Un amplio banco de registros frente a una cache


El banco de registros organizado en ventanas funciona como un buffer pequeño y
rápido, que contiene un subconjunto de todas las variables que probablemente se usen
mucho. Desde este punto de vista el banco de registros se comporta de manera muy
similar a una memoria cache. Surge la cuestión de si será mejor y más sencillo utilizar
una cache y un tradicional banco de registros pequeño.
Incluso si la cache es tan rápida como el banco de registros, el tiempo de acceso
será considerablemente más grande. Por consiguiente, desde el punto de vista de las
prestaciones, el banco de registros basado en ventanas es superior para datos
escalares locales. Se puede conseguir una mejora añadiendo una cache sólo para
instrucciones.

Optimización de registros basada en el compilador


Supongamos que ahora disponemos de una máquina RISC que contiene únicamente un
pequeño número de registros (16 o 32). En tal caso, el uso optimizado de registros es
responsabilidad del compilador (aproximación por sotftware).
El objetivo del compilador es mantener en registros, en lugar de en memoria los
operandos necesarios para tantos cálculos como sea posible, y minimizar las
operaciones de carga y almacenamiento.
Lo esencial de la labor de optimización es decidir qué cantidades tienen que ser
asignadas a registros en cualquier punto determinado del programa. La técnica usada
más comúnmente para RISC se conoce como “coloreado de grafos”.
El problema del coloreado de grafos es el siguiente. Dado un grafo que consta de
nodos y arcos, asignar colores a los nodos de manera que nodos adyacentes tengan
colores diferentes, y hacerlo de tal forma que se minimice el número de colores
distintos.
Generalmente existe un compromiso entre el uso de un conjunto de registros
grande y la optimización de registros basada en el compilador. Un estudio demostró
que con más de 32 registros sólo hay una mejora escasa de las prestaciones. También
observaron que con un pequeño número de registros (por ejemplo, 16), una máquina
con una organización de registros compartidos funciona más rápido que una con una
organización separada.

Ejemplificación en procesadores típicos IA32

El Intel 80386, fue empleado como la unidad central de procesamiento de muchos


ordenadores personales desde mediados de los años 1980 hasta principios de los 90.
Fue lanzado en 1985 y fue la primera máquina de Intel con 32 bits.
Los Intel 80486 (i486, 486) son una familia de microprocesadores de 32 bits con
arquitectura x86 diseñados y fabricados por Intel Corporation y también fabricados
mediante licencia o ingeniería inversa por otras empresas como IBM, Texas
Instruments, AMD, Cyrix y Chips and Technologies con diseños distintos o clonados.

Los i486 son muy similares a sus predecesores, los Intel 80386. Las diferencias
principales son que los i486 tienen un conjunto de instrucciones optimizado, una unidad
de punto flotante y un caché unificado integrados en el propio circuito integrado del
microprocesador y una unidad de interfaz de bus mejorada.

Concepto de máquinas CISC y RISC.


Es una gran colección de instrucciones que van desde simples a muy complejas y
especializadas a nivel de lenguaje de ensamblador. CISC es un sistema de instrucciones
desarrollado por Intel que requieren de mucho tiempo para ser ejecutadas
completamente. 
CISC: Complex Instruction Set Computer

Este tipo de diseño es la base de los procesadores de Intel y de AMD, sin importar la
gama o la estructura interna. Cualquiera de los procesadores producidos por ambas
compañías se basa en la arquitectura CISC. 

Características de los procesadores CISC 

• El tamaño del código es pequeño, lo que implica una baja necesidad de


memoria RAM 

• Las instrucciones complejas suelen necesitar más de un ciclo de reloj para


ejecutar el código 

• Se requieren menos instrucciones para escribir un software 

• Ofrece programación más sencilla en lenguaje ensamblador 

• Soporte para una estructura de datos compleja y fácil de compilar en


lenguajes de alto nivel 

• Compuesto por menos registros y más nodos de direccionamiento,


habitualmente entre 5 y 20 

• Instrucciones pueden ser más grandes que una sola palabra 

• Se enfatiza la construcción de instrucciones en el hardware, ya que es más


rápido que crear el software 

Ventajas de los procesadores CISC 

• Para el compilador se requiere de poco esfuerzo para traducir programas de


alto nivel o lenguajes de instrucciones a lenguaje ensamblador o máquina 
• El tamaño del código es corto, reduciendo los requisitos de memoria 

• Almacenar las instrucciones CISC requieren de menos cantidad de memoria


RAM 

• Genera procesos de administración de uso de energía que permiten ajustar la


velocidad y el voltaje del reloj 

• Requiere de menos instrucciones configuradas para realizar la misma


instrucción que la arquitectura RISC 

Desventajas de los procesadores CISC 

• Pueden requerir de varios ciclos de reloj para completar una instrucción de


un software 

• El rendimiento del equipo sufre un descenso debido a la velocidad del reloj 

• La ejecución mediante canalización en procesadores CISC puede ser


realmente complicado 

• Este diseño de procesadores requiere muchos más transistores que la


arquitectura RISC 

• Utilizan sobre el 20% de las instrucciones existentes en un evento de


programación 

• Tienen un diseño mucho mayor que la arquitectura RISC, lo cual conlleva


más generación de temperatura, mayor consumo y requisito de espacio físico 

Qué es RISC 

Es una arquitectura de procesadores basada en una colección de instrucciones simples


y altamente personalizadas. RISC se construye para minimizar el tiempo de ejecución
de una instrucción, optimizando y limitando el número de instrucciones. 

RISC: Reduced Instruction Set Computer Processor  

La arquitectura RISC tiene la capacidad de por cada ciclo de instrucción se da


solo un ciclo de reloj. Cada ciclo debe contener estos tres parámetros: buscar,
decodificar y ejecutar. RISC también tiene la propiedad de ejecutar varias instrucciones
complejas cuando se combinan con otras más simples. Este diseño de procesadores
requiere menor cantidad de transistores, reduciendo costes y tiempos de fabricación. 

Características de RISC 

• Para ejecutar una instrucción en estos procesadores, en un procesador de


este tipo se requiere un ciclo de reloj. Cada ciclo de reloj incluye un método de
obtención, decodificación y ejecución de la instrucción 
• La técnica de canalización se usa en esta arquitectura para ejecutar múltiples
partes o etapas de instrucciones para obtener un funcionamiento más eficiente 

• Estos procesadores están optimizados basándose en múltiples registros que


se pueden usar para el almacenamiento de instrucciones y la respuesta rápida del
procesador y se minimicen las interacciones con la memoria del sistema 

• Soporta un modo de direccionamiento simple y que tiene una longitud de


instrucción fija para la ejecución de la canalización 

• Usan instrucciones LOAD y STORE para acceder a la memoria 

• Las instrucciones simples y limitadas permiten reducir los tiempos de


ejecución de un proceso 

Ventajas de los procesadores RISC 

• Tienen la capacidad de ofrecer un mejor rendimiento gracias al menor


número de instrucciones y la simplicidad de estas 

• Requieren de menos transistores, lo cual los hace más económicos de


diseñar y producir 

• Permiten crear procesadores con «espacio» libre para añadir otros circuitos o
reducir sencillamente el encapsulado 

• Este diseño requiere de menos consumo de energía y generan menos calor


que los procesadores RISC 

Desventajas de los procesadores RISC 

• El rendimiento del procesador puede variar dependiendo del código que se


ejecuta, ya que las instrucciones posteriores que se ejecuten pueden depender de
una instrucción anterior 

• Actualmente la mayoría de software y compiladores hacen uso de


instrucciones complejas 

• Necesitan de memorias muy rápidas para almacenar diferentes cantidades de


instrucciones, que requieren de una gran cantidad de memoria caché para
responder a la instrucción en el menor tiempo posible 

Diferencias entre procesadores CISC y RISC 

Vamos a ver las diferencias entre las arquitecturas de procesadores CISC y RISC en una
sencilla tabla para que se pueda ver de manera más clara 

RISC CISC
Es una arquitectura con conjunto de Es una arquitectura de conjunto de
instrucciones reducido  instrucciones complejas 

Hace hincapié en el software para Hace hincapié en el hardware para optimizar el


optimizar el conjunto de instrucciones  conjunto de instrucciones 

Es una unidad de programación Unidad de microprogramación en el


cableada en el procesador  procesador 

Requiere múltiples conjuntos de Requiere un único conjunto de registros para


registros para almacenar la instrucción  almacenar la instrucción 

Tiene una sencilla decodificación de las Tiene una compleja decodificación de las
instrucciones  instrucciones 

Los usos de la canalización son


Los usos de la canalización son difíciles 
simples 

Utiliza un número limitado de Utiliza una gran cantidad de instrucciones que


instrucciones que requiere menos requieren más tiempo para ejecutar las
tiempo para ejecutar las instrucciones  instrucciones 

Utiliza LOAD y STORE que son


Utiliza la instrucción LOAD y STORE en la
instrucciones independientes en el
interacción de memoria a memoria de un
registro para registrar la interacción de
programa 
un programa 

Tiene más transistores en registros de Tiene transistores para almacenar


memoria  instrucciones complejas 

El tiempo de ejecución es muy corto  El tiempo de ejecución es mayor 

Se puede utilizar con aplicaciones de Se puede utilizar con aplicaciones de alta gama
gama baja como domótica, sistema de como telecomunicaciones, procesamiento de
seguridad, etc.  imágenes, procesamiento de video, etc. 

Tiene instrucciones de formato fijo  Tiene instrucciones de formato variable 

El programa escrito para esta Los programas escritos para esta arquitectura
arquitectura necesita ocupar más tienden a ocupar menos espacio en la
espacio en la memoria  memoria 

 
¿Por qué CISC?

Hemos mencionado la tendencia hacia repertorios de instrucciones más ricos, que


incluyen un número mayor de instrucciones e instrucciones más complejas. esta
tendencia ha sido motivada por dos razones principales: el deseo de simplificar los
compiladores, y el deseo de mejorar las prestaciones.
Sirvió de base a estas razones el cambio de los programadores hacia los
lenguajes de alto nivel (HLL), que hizo que los arquitectos intentaran diseñar máquinas
que proporcionaran mejor soporte para los HLL. No es la intención de este capítulo decir
que los diseñadores de CISC tomaron la dirección equivocada. Verdaderamente, debido
a que la tecnología continúa evolucionando, y a que existen arquitecturas a lo largo de
todo un espectro en vez de en dos categorías puras, es poco probable que surja nunca
una valoración del tipo blanco o negro. Por tanto, los comentarios que siguen sólo
pretenden señalar algunos de los peligros potenciales de la aproximación CISC,
proporcionar cierta comprensión de la motivación de los partidarios de los RISC.

la primera de las razones citadas, la simplificación de los compiladores parece obvia. La


labor del escritor de compiladores es generar una secuencia de instrucciones máquina
para cada sentencia de HLL. Sí existen instrucciones máquina que se parezcan a
sentencias del HLL, la tarea se simplifica. este razonamiento ha sido puesto en duda
por los investigadores de los RISC. estos han encontrado que las instrucciones
máquina complejas son con frecuencia difíciles de aprovechar, ya que el compilador
debe descubrir aquellos casos que se ajustan perfectamente a la construcción. La tarea
de optimizar el código generado para minimizar su tamaño reducir el número de
instrucciones ejecutadas y mejorar la segmentación es mucho más difícil con un
repertorio complejo de instrucciones, como prueba de esto, los estudios citados antes
en este capítulo indican que la mayoría de las instrucciones de un programa compilado
son comparativamente las más sencillas.

La otra razón importante mencionada es la esperanza de que un CISC produzca


programas más pequeños y rápidos. examinemos los dos aspectos de esta afirmación:
que los programas sean más pequeños y que se ejecuten más rápido.

Los programas más pequeños tienen dos ventajas. En primer lugar, como el
programa ocupa menos memoria, hay un ahorro de este recurso. como la memoria hoy
día es tan barata la ventaja potencial ya no es primordial, tiene mayor importancia el
hecho de que programas más pequeños mejoren las prestaciones, lo que ocurre por
dos motivos. El primero es que el que haya menos instrucciones significa que hay que
captar menos bytes de instrucciones. El segundo es que, en un entorno paginado los
programas más pequeños ocupan menos páginas, reduciendo las faltas de páginas.

El problema de este razonamiento es que está lejos de ser cierto que un


programa para un CISC sea más pequeño que el correspondiente programa para un
RISC. En muchos casos, el programa para el CISC, expresado en lenguaje maquina
simbólico, puede ser más corto, tener menos instrucciones, pero el número de bits de
memoria que ocupa no tiene por qué ser más pequeño.
Los compiladores en los CISC tienden a elegir las instrucciones más sencillas, de
manera que la concisión de las instrucciones complejas raramente entra en juego.
también, debido a que hay más instrucciones en un CISC, son precisos códigos de
operación más largos, produciendo instrucciones más largas. Por último, los RISC,
tienden acentuar las referencias a registros en lugar de a memoria y las primeras
necesitan menos bits.

De este modo, las expectativas de que un CISC presente programas más


pequeños, con las ventajas que implicaría, pueden no llevarse a cabo.
El segundo factor que motiva repertorios de instrucciones cada vez más
complejos era que la ejecución de instrucciones fuera más rápida. Parece tener sentido
el que una operación compleja de un HLL se ejecute más rápido como una única
instrucción máquina, que como una sucesión de instrucciones más primitivas. Sin
embargo, debido a la propensión a usar las instrucciones más sencillas, esto puede no
ser así. La unidad de control completa debe hacerse más compleja, y/o la memoria de
control del microprograma ha de hacerse más grande, para proveer un repertorio de
instrucciones más rico. Cualquiera de los dos factores aumenta el tiempo de ejecución
de las instrucciones simples.

De hecho, algunos investigadores han encontrado que la aceleración en la


ejecución de funciones complejas se debe, no tanto a la potencia de las instrucciones
maquina complejas, como a su residencia en el rápido almacenamiento de control. En
realidad, el almacenamiento de control actúa como una cache de instrucciones. De este
modo, el arquitecto del hardware podría intentar determinar que subrutinas o funciones
se usarán con mayor frecuencia, y asignarlas al almacenamiento de control,
implementándolas en microcódigo. la realidad no es muy alentadora.

Por tanto, no es nada claro que la tendencia hacia repertorios de instrucciones


de complejidad creciente sea apropiada. Ello ha llevado a varios grupos a seguir el
camino opuesto.

Características de las arquitecturas de repertorio reducido de instrucciones


Aunque existen diferentes aproximaciones a la arquitectura de repertorio reducido de
instrucciones, hay ciertas características comunes a todas ellas:

 una instrucción por ciclo


 operaciones registro a registro

 modos de direccionamiento sencillo

 formatos de instrucción sencillos.

Ahora haremos una breve discusión de estas características.


La primera característica enumerada es que se ejecuta una instrucción máquina
cada ciclo máquina. Un ciclo máquina se define como el tiempo que se tarda en captar
dos operandos desde dos registros, realizar una operación de la alu y almacenar el
resultado en un registro. Así, las instrucciones máquina de un RISC no deberían ser
más complicadas que las microinstrucciones de las máquinas CISC, y deberían
ejecutarse más o menos igual de rápido. Con instrucciones sencillas y de un ciclo, hay
poca o ninguna necesidad de microcódigo; las instrucciones máquina pueden estar
cableadas. Tales instrucciones deben ejecutarse más rápido que las instrucciones
máquina comparables de otras máquinas, ya que no hay que acceder a la memoria de
control de microprograma durante la ejecución de la instrucción.

Una segunda característica es que la mayoría de la operación deben ser del tipo
registro a registro, con la excepción de sencillas operaciones load y store, para acceder
a memoria. esta forma simplifica el repertorio de instrucciones y, por tanto, la unidad
de control. Por ejemplo, un repertorio de instrucciones RISC puede incluir solo una o
dos instrucciones add, (por ejemplo, suma entera y suma con acarreo). Otra ventaja es
que tal arquitectura fomenta la optimización del uso de registros, ya que los operandos
accedidos frecuentemente, permanecen en el almacenamiento de alta velocidad.
Este énfasis en las operaciones registro a registro es único de los diseños RISC.
Otras máquinas contemporáneas tienen tales instrucciones, pero incluyen también
operaciones memoria a memoria y operaciones mixtas registro/memoria.

Una tercera característica es el uso de modos de direccionamiento sencillos. casi


todas las instrucciones RISC usan el sencillo direccionamiento a registro. se pueden
incluir varios modos adicionales, como el desplazamiento y el relativo al contador de
programa. otros modos más complejos se pueden sintetizar por software a partir de los
simples. nuevamente, esta característica de diseño simplifica el repertorio de
instrucciones y la unidad de control

Una última característica comunes el uso de formatos de instrucción sencillos.


generalmente, solo se usa un formato o unos pocos. La longitud de las instrucciones es
fija, y alineada en los límites de una palabra. Las posiciones de los campos,
especialmente la del código de operación, son fijas. Este tipo de diseño tiene varias
ventajas. Con campos fijos, en la decodificación del código de operación y el acceso a
los operandos en registros pueden tener lugar simultáneamente. Los formatos sencillos
simplifican la unidad de control. Se optimiza la captación de instrucciones ya que se
captan unidades de una palabra de longitud. El alineamiento en el límite de una palabra
significa también que una única instrucción no traspasa los límites de una página.

Estas características pueden evaluarse conjuntamente para determinar las


ventajas potenciales de la aproximación RISC. Las ventajas se pueden separar en dos
categorías: las relacionadas con las prestaciones y las relacionadas con la
implementación VLSI.

Respecto a las prestaciones, se puede representar cierta cantidad de pruebas


indiciarias. En primer lugar, se pueden desarrollar compiladores optimizadores más
eficaces. Con instrucciones más primitivas, hay más ocasiones de sacar funciones fuera
de bucles, reorganizar código buscando una mayor eficiencia, maximizar la utilización
de registros, etc. Es posible incluso calcular partes de instrucciones complejas en
tiempo de compilación.

Un segundo punto, es que la mayoría de las instrucciones generadas por un


compilador son, de todos modos, relativamente sencillas. Parece razonable que una
unidad de control, construida expresamente para estas instrucciones y que usará poco
o ningún microcódigo, podrá ejecutarlas más rápido que un CISC comparable.

Un tercer punto tiene que ver con el uso de segmentación de las instrucciones.
Los investigadores de RISC creen que la técnica de segmentación de las instrucciones
se puede aplicar mucho más eficazmente a un repertorio reducido de instrucciones.

Un último punto, algo menos importante es que los programas RISC deberían
ser más sensibles a las interrupciones, ya que estas se comprueban entre operaciones
bastante elementales. Las arquitecturas con instrucciones complejas, o bien restringen
las interrupciones a los límites de instrucción o bien tienen que definir puntos
interrumpibles específicos e implementar mecanismos para reanudar la ejecución de
una instrucción.

No está demostrado que aumenten las prestaciones con una arquitectura de


repertorio reducido de instrucciones. Se han hecho varios estudios, pero no con
máquinas de tecnología y potencia comparables. Además, la mayoría del estudio no
han intentado separar los efectos de un repertorio reducido de instrucciones de los de
un banco de registros extenso. La prueba indiciaria, sin embargo, es sugestiva.

La segunda área con una ventaja potencial es más evidente y tiene que ver con la
implementación VLSI. Cuando se usa VLSI, el diseño y la implementación del
procesador son esencialmente distintos. Los procesadores tradicionales, tales como el
IBM s/390 y el VAX, constan de una o más tarjetas de circuitos impresos, que contiene
chips SSI y MSI estandarizados. Con la llegada de LSI y VLSI es posible meter un
procesador complejo en un único chip. Con un procesador de un único chip hay dos
motivaciones para seguir una estrategia RISC. En primer lugar, está la cuestión de las
prestaciones. Los retardos dentro del chip son mucho menores que los retardos entre
chips, de modo que tienen sentido dedicar el escaso espacio del chip a aquellas
actividades que ocurren frecuentemente. Hemos visto que las instrucciones sencillas y
el acceso a datos escalares locales, son, las actividades más frecuentes. Los chips RISC
de berkeley se diseñaron con esta consideración en mente. Mientras que un
microprocesador de un único chip típico dedica aproximadamente la mitad de su área a
la memoria de control de microcódigo, el RISC 1 dedica solo el 6% de su área a la
unidad de control.
Un segundo asunto relacionado con VLSI es el tiempo de diseño e
implementación. Un procesador VLSI es difícil de desarrollar. En lugar de confiar en los
componentes SSI y MSI disponibles, el diseñador debe realizar el diseño, trazado y
modelado del circuito en el nivel de dispositivos. Con una arquitectura de repertorio
reducido de instrucciones, este proceso es mucho más fácil. Si además las prestaciones
del chip RISC son equivalentes a los microprocesadores CISC comparables, las ventajas
de la aproximación RISC se hacen evidentes.

Características CISC frente a RISC


Tras el entusiasmo inicial por las máquinas RISC, ha habido una creciente convicción de
que los diseños RISC pueden sacar provecho de la inclusión de algunas características
CISC y de que los diseños CISC pueden sacar provecho de la inclusión de algunas
características RISC. El resultado es que los diseños RISC más recientes especialmente
el PowerPC, no son ya RISC puros y que los diseños CISC más recientes
particularmente Pentium 2 incorporan ciertas características RISC.

Segmentación de cauce en RISC


Para aumentar las prestaciones se usa con frecuencia la segmentación de instrucciones.
Reconsideremos este asunto en el contexto de la arquitectura RISC. La mayoría de las
instrucciones son del tipo registro a registro y un ciclo de instrucción tiene las dos
siguientes fases:

I: captación de instrucción.

E: Ejecución. Realiza una operación de la ALU con registros como entrada y


salida.

Las operaciones de carga y almacenamiento requieren tres fases:

I: captación de instrucción.

E: ejecución. Calcula una dirección de memoria.

D: memoria. Operación registro a memoria o memoria a registro.

Representa la temporalización de una secuencia de instrucciones que no usan


segmentación. Sin duda se trata de un proceso dispendioso. Este esquema ofrece el
doble de velocidad de ejecución que un esquema serie. Hay dos problemas que impiden
que se consiga la máxima aceleración. El primero es que suponemos que se usa una
memoria de un único puerto, y que solo es posible un acceso a memoria en cada fase.
Esto requiere la inserción de un estado de espera en algunas instrucciones. El
segundo problema consiste en que una instrucción de bifurcación interrumpa el flujo
secuencial de ejecución. Para adaptarse a estos problemas con la mínima circuitería, el
compilador o ensamblador puede insertar una instrucción noop en el flujo de
instrucciones.

La segmentación puede ser mejorada permitiendo dos accesos a memoria por


fase. Así, hasta tres instrucciones pueden solaparse, y la mejora es como mucho un
factor de tres. Nuevamente, las instrucciones de bifurcación hacen que la aceleración
sea un poco menor que la máxima posible. Hay que advertir también, que las
dependencias de datos tienen su efecto. Si una instrucción necesita un operando que es
modificado por la instrucción precedente, se necesita un retardo. También esto puede
ser llevado a cabo por un NOOP.

La segmentación discutida hasta aquí funciona mejor si las tres fases son
aproximadamente de la misma duración. Como la fase E usualmente implica una
operación de la ALU, puede ser más larga. En ese caso, podemos dividirla en dos
subfases:
E1: lectura del banco de registros.
E2: operación de la alu y escritura en el registro.

Dada la simplicidad y regularidad del repertorio de instrucciones, el diseño de la


organización en tres o cuatro fases se realiza fácilmente. Hasta cuatro instrucciones
pueden estar en curso en un momento dado y la aceleración potencial máxima es un
factor de cuatro. Observe que de nuevo hay que usar NOOP para los retardos por
bifurcaciones y dependencias de datos.

Optimización de la segmentación
Dada la naturaleza sencilla y regular de las instrucciones RISC, los esquemas de
segmentación se pueden emplear eficientemente. Hay poca variación en la duración de
la ejecución de instrucciones, y el cauce puede adaptarse para reflejar este hecho. Sin
embargo, hemos visto que las dependencias de datos y bifurcaciones reducen la
velocidad de ejecución global.

Para compensar estas dependencias se han desarrollado técnicas de


reorganización del código. Consideremos primero las instrucciones de salto. El salto
retardado, que es una forma de incrementar la eficacia de la segmentación, utiliza un
salto que no tiene lugar hasta después de que se ejecute la siguiente instrucción, de ahí
que se llame retardado.

Un tipo de táctica similar llamada carga retardada, se puede usar con las instrucciones
load. En las instrucciones load, el procesador bloquea el registro destino de la carga.
Después el procesador continúa la ejecución del flujo de instrucciones hasta que
alcanza una instrucción que necesite ese registro, deteniéndose hasta que la carga
finalice. Si el compilador puede reorganizar las instrucciones de manera que se pueda
hacer un trabajo útil mientras la carga está en el cauce, la eficiencia aumentara.
Como nota final, hay que señalar que el diseño del cauce de instrucciones no
debe ser llevado a cabo independientemente de otras técnicas de optimización
aplicadas al sistema. Por ejemplo, muestra que la planificación de instrucciones para el
cauce y la asignación dinámica de registros tienen que considerarse conjuntamente
para lograr la mayor eficiencia.

Ejemplos procesadores RISC: MIPS R4000


Uno de los primeros conjuntos de chips RISC disponibles comercialmente, fue
desarrollado por MIPS Technology Inc. El sistema se inspiró en un sistema
experimental que también usaba el nombre MIPS, desarrollado en Standford.
El MIPS R4000 utiliza 64 en vez de 32 bits para los buses de datos internos y
externos y para las direcciones, los registros y la ALU. El uso de 64 bits tiene diversas
ventajas sobre una arquitectura de 32 bits. Permite un espacio de direccionamiento
más grande, y la capacidad de procesar datos tales como números en coma flotante
IEEE de simple precisión y cadenas de hasta 8 caracteres de una sola vez.
El procesador R4000 está dividido en dos secciones: una contiene la
CPU, y la otra contiene un procesador de gestión de memoria. El procesador tiene una
arquitectura muy sencilla. El propósito fue diseñar un sistema, en el cual la lógica que
aumentara las prestaciones (por ejemplo, la unidad de gestión de memoria completa).

Repertorio de instrucciones
Todas las operaciones con datos son del tipo registro a registro; las únicas referencias
a memoria son operaciones puras de carga/almacenamiento.
El R4000 no utiliza códigos de condición. Si una instrucción genera una
condición, los indicadores correspondientes se almacenan en un registro de uso
general. Esto elimina la necesidad de una lógica especial para tratar con códigos de
condición, ya que estos afectan al mecanismo de segmentación y a la reordenación de
instrucciones por el compilador. En lugar de eso, se emplea el mecanismo ya
implementado, que se ocupa de las dependencias de valores de registros. Además, las
condiciones asignadas en el banco de registros son propensas a las mismas
optimizaciones del compilador, en cuanto a asignación y reutilización, que cualquier
otro valor almacenado en un registro.
MIPS utiliza una longitud de instrucción fija de 32 bits. Está única longitud de
instrucción simplifica la captación y decodificación de instrucciones, y también
simplifica la interacción entre la captación de instrucciones y la unidad de gestión de
memoria virtual (o sea que las instrucciones no atraviesan los límites de una palabra o
una página). Los tres formatos de instrucción comparten un formato común para los
códigos de operación y las referencias a registros, lo que simplifica la decodificación de
instrucciones. La acción de instrucciones más complejas se puede sintetizar en tiempo
de compilación,
Solo se implementa en hardware el modo de direccionamiento a memoria que
se usa con más frecuencia. Todas las referencias a memoria consisten en un
desplazamiento de 16 bits y un registro de 32 bits. Por ejemplo, la instrucción load
word.
Cualquiera de los 32 registros de uso general puede utilizarse como registro
base.

Cauce de instrucciones
Gracias a su escritura de instrucciones simplificada (RISC), el MIPS puede lograr una
segmentación muy eficiente.
El MIPS R4000 es un ejemplo de una arquitectura RISC supersegmentada, pero
eso lo vamos a retomar en la unidad 5.

Interrupciones tratamiento general


Las interrupciones proporcionan una forma de mejorar la eficiencia del procesador. Por
ejemplo: la mayoría de los dispositivos externos son mucho más lentos que el
procesador. Supóngase que el procesador está transfiriendo datos a una impresora
utilizando el esquema de ciclo de instrucción (figura 3.3). Después de cada operación
de escritura el procesador tendrá que parar y permanecer ocioso hasta que la
impresora complete la escritura. La longitud de esta pausa puede ser del orden de
cientos o miles de ciclos de instrucción que no implican accesos a memoria. Esto
supone un derroche en el uso del procesador.
Las interrupciones y el ciclo de instrucción
Con el uso de interrupciones, el procesador puede dedicarse a ejecutar otras
instrucciones mientras una operación de E/S está en curso.
Para permitir el uso de interrupciones, se añade un ciclo de interrupción al ciclo
de instrucción. En el ciclo de interrupción el procesador comprueba si se ha generado
alguna interrupción, indicada por la presencia de una señal de interrupción. Si no hay
señales de interrupción pendientes el procesador continúa con el ciclo de captación y
accede a la siguiente instrucción del programa en curso. Si hay alguna interrupción
pendiente el procesador hace lo siguiente:
1.Suspende la ejecución del programa en curso y guarda su contexto. Esto
significa que almacena la dirección de la siguiente instrucción a ejecutar (contenido
actual del contador de programa) y cualquier otro dato relacionado con la actividad en
curso del procesador.
2.Carga el contador de programa con la dirección del comienzo de una rutina de
gestión de interrupción.

A continuación, el procesador prosigue con el ciclo de captación y accede a la primera


instrucción del programa de gestión de interrupción, que dará servicio a la
interrupción. Generalmente el programa de gestión de interrupción forma parte del
sistema operativo. Normalmente este programa determina el origen de la interrupción
y realiza todas las acciones que sean necesarias.

Es claro que este proceso supone una cierta penalización. Deben ejecutarse
instrucciones extra para determinar el origen de la interrupción, sin embargo, es la
mejor opción en la cual el procesador puede emplearse de manera mucho más
eficiente.

Interrupciones múltiples
Hasta ahora únicamente se ha discutido la existencia de una sola interrupción. Pero,
debemos saber que se puede producir más de una interrupción, por ejemplo: un
programa puede estar recibiendo datos a través de una línea de comunicación e
imprimiendo resultados. La impresora generará interrupciones cada vez que complete
una operación de escritura. El controlador de la línea de comunicación generará una
interrupción cada vez que llegue una unidad de datos. La unidad de datos puede ser un
carácter o un bloque, según el protocolo de comunicación. En cualquier caso, es posible
que se produzca una interrupción de comunicaciones mientras se está procesando la
interrupción de la impresora.
Se pueden seguir dos alternativas para tratar las interrupciones múltiples:
1.Desactivar las interrupciones mientras se está procesando una interrupción.
Una interrupción inhabilitada simplemente significa que el procesador puede y debe
ignorar la señal de petición de interrupción. Si se produce una interrupción en ese
momento, generalmente se mantiene pendiente, y será examinada por el procesador
una vez éste haya activado las interrupciones. Así, cuando un programa de usuario se
está ejecutando y se produce una interrupción, las interrupciones de inhabilitan
inmediatamente. Después de que la rutina de gestión de interrupción termine, las
interrupciones se habilitan antes de que el programa de usuario prosiga, y el
procesador compruebe si se han producido interrupciones adicionales. Con esta opción,
las interrupciones se manejan en un orden secuencial estricto.
El problema con la opción 1 es que no tiene en cuenta la prioridad relativa, ni
las solicitudes con un tiempo estricto. Por ejemplo: cuando llega una entrada desde la
línea de comunicaciones, ésta debe tramitarse rápidamente, para dejar espacio a los
datos siguientes. Si los primeros datos no se han procesado antes de que lleguen los
siguientes se pueden perder.

2.La segunda alternativa consiste en definir prioridades para las interrupciones,


y permitir que una interrupción de prioridad más alta pueda interrumpir a un gestor de
interrupción de prioridad menor. Por ejemplo: considérese un sistema con tres
dispositivos de E/S: una impresora, un disco y una línea de comunicaciones, con
prioridades crecientes de 2, 4 y 5 respectivamente. Ejemplo: un programa de usuario
comienza en t=0, una impresora produce una interrupción en t=10, la información del
programa de usuario se sitúa en la pila del sistema y la ejecución continúa con la rutina
de servicio de interrupción de la impresora. Mientras se está ejecutando esta rutina en
t=15, se produce una interrupción de comunicaciones. Como la línea de
comunicaciones tiene una prioridad mayor que la impresora, se acepta la interrupción.
La rutina de la impresora se interrumpe, su estado se introduce en la pila y la
ejecución continua con la rutina de comunicaciones. Mientras se está ejecutando esta
rutina, el disco ocasiona una interrupción (t=20). Puesto que esta interrupción tiene
una prioridad menor, simplemente se retiene, y la rutina de comunicaciones se ejecuta
hasta que termina.
Cuando la rutina de comunicaciones se termina (t=25), se restaura el estado
previo del procesador que corresponde a la ejecución de la rutina de la impresora. No
obstante, antes incluso de que pueda ejecutarse una sola instrucción de esa rutina, el
procesador acepta la interrupción de mayor prioridad, generada por el disco, y el
control se transfiere a la rutina de disco. Solo cuando esta rutina termina (t=35) la
rutina de la impresora puede reanudarse. Cuando termina esa rutina (t=40), el control
vuelve finalmente al programa de usuario.

Funcionamiento de las E/S


Hasta aquí, hemos discutido el funcionamiento del computador controlado por el
procesador, y nos hemos fijado esencialmente en la interacción del procesador y la
memoria. La discusión sólo ha aludido al papel de los componentes E/S.
Un módulo de E/S (por ejemplo, un controlador de disco) puede intercambiar
datos directamente con el procesador. Igual que el procesador puede iniciar una
lectura o escritura en memoria, especificando la dirección de una posición concreta de
la misma, el procesador también puede leer o escribir datos de, o en, un módulo de
E/S. En este caso, el procesador identifica un dispositivo específico controlado por un
módulo de E/S determinado. Por consiguiente, se puede producir una secuencia de
instrucciones, con instrucciones de E/S en lugar de las instrucciones de referencia a
memoria.
En algunos casos es deseable permitir que los intercambios de E/S se produzcan
directamente con la memoria. En ese caso el procesador cede a un módulo de E/S la
autoridad para leer de, o escribir en, memoria para que así la transferencia E/S-
memoria pueda producirse sin la intervención del procesador. Durante esas
transferencias, el módulo de E/S proporciona a la memoria las órdenes de lectura o
escritura, liberando al procesador de cualquier responsabilidad en el intercambio. Esta
operación se conoce con el nombre de acceso directo a memoria (DMA Direct Memory
Access).
Procesamiento de interrupciones
El procesamiento de las interrupciones dentro del procesador es un servicio que se
proporciona para apoyar al sistema operativo. Permite que un programa de aplicación
sea suspendido para que una gran variedad de causas de interrupción puedan
atenderse, y reanudarse más tarde.

Interrupciones y excepciones (Interrupciones por software y hardware)


Hay dos clases de eventos que provocan que el PentiumII Suspenda la ejecución del
flujo de instrucciones en curso y responda al evento: las interrupciones y las
excepciones. En los dos casos, el procesador guarda el contexto del proceso actual y
pasa a una rutina predefinida para atender la condición. Una interrupción se genera por
una señal del hardware, y puede ocurrir en momentos aleatorios durante la ejecución
de un programa. Una excepción se genera desde el software, y es provocada por la
ejecución de una instrucción. Hay dos fuentes de interrupciones, y dos fuentes de
excepciones:
1.Interrupciones (hardware)
• Interrupciones enmascarables: Las recibe el procesador por la
patilla INTR. El procesador no reconoce una interrupción
enmascarable a no ser que el indicador de habilitación de
interrupciones (IF) esté a uno.
• Interrupciones no enmascarables: Las recibe el procesador por la
patilla NMI. No se puede evitar el reconocimiento de tales
interrupciones.
2. Excepciones (software)
• Excepciones detectadas por el procesador: Se producen cuando el
procesador encuentra un error mientras intenta ejecutar una
instrucción.
• Excepciones programadas: Hay instrucciones que generan una
excepción (INTO, INT 3, INT y BOUND).

Tablas de vectores de interrupción


El procesamiento de las interrupciones en el PentiumII usa la tabla de vectores de
interrupción. Cada tipo de interrupción tiene asignado un número, que se usa para
indexar en la tabla de vectores de interrupción. La tabla contiene 256 vectores de
interrupción de 32 bits, cada uno de los cuales es la dirección (segmento y
desplazamiento) de la rutina de servicio de interrupción del número de interrupción
correspondiente.
Las interrupciones hardware INTR tienen asignados números en el rango 32 a
255; cuando se genera una interrupción INTR, debe venir acompañada ene l bus con el
número de vector de interrupción para esa interrupción. Los numero de vectores
restantes se usan para excepciones.
Si hay pendientes más de una excepción o interrupción, el procesador las
atiende en un orden previsible. La posición de los números de vector dentro de la tabla
no refleja ninguna prioridad. En lugar de eso, la prioridad entre las excepciones e
interrupciones se organiza en cinco clases. En orden decreciente de prioridad, son las
siguientes:
clase 1: Interrupción de la instrucción previa (vector numero 1).
clase 2: Interrupciones externas (2,32-255)
clase 3: Fallos captando la siguiente instrucción (3, 14)
clase 4: Fallos decodificando la siguiente instrucción (6,7)
clase 5: Fallos ejecutando una instrucción (0, 4, 5, 8, 10-15, 16, 17)

Gestión de interrupciones
Igual que las transferencias de ejecución que usan la instrucción CALL, una
transferencia a una rutina de gestión de interrupción usa la pila del sistema para
almacenar es estado del procesador. Cuando una interrupción tiene lugar y es
reconocida por el procesador, tiene lugar la siguiente secuencia de eventos:
1. Si la transferencia supone un cambio del nivel de privilegio, los contenidos
actuales del registro de segmento de pila y del registro puntero de pila ampliado (ESP)
se introducen en la pila.
2. El valor actual del registro EFLAGS se introduce en la pila.
3. Los indicadores de interrupciones (IF) y de trampa (TF) se ponen a cero. Ello
inhabilita las interrupciones INTR y la interceptación o modo paso a paso.
4. Los contenidos actuales del puntero de segmento de código (CS) y del
puntero de instrucción (IP o EIP) se introducen en la pila.
5. Si la interrupción viene acompañada por un código de error, éste se introduce
en la pila.
6. Los contenidos del vector de interrupción se captan y se cargan en los
registros CS e IP o EIP. La ejecución continúa por la rutina de servicio de interrupción.

Para retornar de una interrupción la rutina de servicio de interrupción ejecuta una


instrucción IRET. Ello provoca que todos los valores almacenados en la pila sean
restablecidos; la ejecución se reanuda a partir del punto de interrupción.

También podría gustarte