Porfavor antes de continuar da clic en la imagen, como agradecimiento al aporte ...por favor..
atte. el autor
Al parecer ay un gran parecido entre la computadora con el ser Humano dentro del Tema del Hardware
Elige el tema que te inresese...speramos te sea util la informacion..y nos esforzaremos para mantener al blog actualizados, con las noticias sobre tecnoligias y software.
Sin ninguna duda, el elemento estrella de un ordenador personal es la unidad central de proceso (CPU). Tanto es así, que la primera característica que se tiende a emplear para comparar ordenadores, es el modelo de CPU y la frecuencia de reloj (MHz) a la que es capaz de trabajar. Sin embargo, si se acude a las fuentes de información habituales (comparativas, información proporcionada por los fabricantes, etc.), se aprecia la existencia de multitud de términos profundamente técnicos. Dichos conceptos son los que realmente permiten comparar procesadores, o determinar si un procesador es adecuado para una aplicación específica, y requieren de un conocimiento básico acerca de lo que ocurre en el interior de la CPU. Por ello, este capítulo inicia un recorrido a través del interior de los procesadores, mostrando los componentes fundamentales, su funcionamiento y los conceptos más importantes a tener en cuenta.Estructura de un procesador sencillo. Se pueden apreciar los componentes básicos de cualquier procesador
Estructura básica de la CPU
La Figura muestra la estructura interna de un procesador sencillo con arquitectura
Von Neumann. El diseño es básico (se corresponde con el presentado por algunos procesadores sencillos de 8 bits) pero su comprensión permitirá entender el funcionamiento de procesadores más complejos, que amplían la estructura presentada.
Se pueden apreciar los siguientes elementos:
Bus de direcciones. Permite enviar direcciones a la memoria y periféricos. Las direcciones son números que indican la posición de memoria donde se desea escribir un dato, o de donde se desea leerlo. La memoria se abordará con detalle en próximos capítulos, al igual que los periféricos.
Bus de datos. Permite al procesador enviar datos a la memoria y periféricos.
De la misma forma, permite que el procesador reciba datos de dichos elementos.
Para escribir (o leer) un dato, primero es necesario colocar la dirección donde escribirlo (o de donde leerlo) en el bus de direcciones.
Registro de instrucción. En cada momento, este registro almacena la instrucción que está siendo ejecutada por la CPU.
Archivo de registros. Son almacenes temporales de datos, de acceso muy rápido.
En general, almacenan los operandos sobre los que actúan las instrucciones, y también los resultados de éstas (para un futuro uso). También existen registros de aplicación específica, como se verá más adelante.
Unidad Aritmético-Lógica. Más conocida por el acrónimo inglés ALU (Arithmetic-
Logic Unit). La ALU es el motor de cálculo del procesador, ya que se encarga de realizar las operaciones para las que está capacitado. Como se aprecia en la Figura 1, la ALU es capaz de tomar 2 datos como operandos y producir una salida, resultado de aplicar una operación (seleccionable mediante unas líneas de control). Las operaciones soportadas pueden ser aritméticas (suma, resta, etc.), lógicas (and, or, etc.) y otras operaciones como desplazamientos de bits. Sin duda, la ALU es un elemento muy importante, ya que define las operaciones de cálculo que la CPU puede realizar.
Contador de programa. Se trata de un registro especial, al que se denomina normalmente PC (del inglés Program Counter). El PC contiene, en cada momento, la dirección de memoria en la que se encuentra la siguiente instrucción a ejecutar. Cada vez que se obtiene una nueva instrucción de la memoria, el PC se actualiza para apuntar a la próxima instrucción a ejecutar. Normalmente, dicha actualización consiste en un simple incremento, para apuntar a la celda de memoria siguiente (téngase en cuenta que, en general, las instrucciones de un programa se almacenan en posiciones de memoria consecutivas). Este comportamiento cambia cuando se ejecuta una instrucción de salto. En ese caso, el PC se actualiza con la dirección de destino del salto, donde se encuentra la siguiente instrucción a ejecutar.
Registro de direcciones de memoria. También denominado MAR (Memory Address
Register). Este registro almacena la próxima dirección de memoria de la que leer (o en la que escribir) un dato. Se trata de un registro que complementa al PC: mientras que este último apunta a instrucciones, el MAR apunta a datos.
Multiplexor. No se trata de un elemento exclusivo de las CPU, sino de una pieza fundamental del diseño de sistemas digitales. En el esquema de la Figura 1, el multiplexor actúa como una especie de conmutador, transporta el contenido del PC o del MAR hacia el bus de direcciones. La línea roja de la parte izquierda es el terminal que permite seleccionar si es el contenido del PC o el del MAR el que llegará al bus (colocando en él un 1 o un 0 lógico).
Reloj. En la actualidad, prácticamente todos los procesadores son sistemas digitales síncronos. Esto significa que trabajan al ritmo marcado por una señal de reloj. Dicha señal no es más que un conjunto de pulsos distanciados por igual en el tiempo. Más adelante se comprobará que una mayor velocidad de reloj no siempre implica un mayor rendimiento del procesador.
Unidad de control. Es el bloque encargado de coordinar el funcionamiento interno de la CPU. Indica a cada componente interno cómo debe funcionar y cuándo tiene permiso para entrar en acción. En otras palabras, la unidad de control se puede entender como el director de orquesta de la CPU.
Funcionamiento
Considere una posible instrucción a ejecutar por el procesador (denominada, por ejemplo, "ADD Rl, R2, R3"). Suponga que dicha instrucción toma los datos almacenados en los registros denominados R 1 y R2, realiza la suma, y almacena el resultado en el registro R3. Como ya habrá intuido, R 1, R2 y R3 se encuentran en el archivo de registros. El proceso completo para ejecutar dicha instrucción es el siguiente:
1. El PC se actualiza con la dirección de memoria donde se halla la siguiente instrucción a ejecutar ("ADD R1, R2, R3").
2. La unidad de control (UC) modifica el estado del multiplexor, de forma que el contenido del PC se dirija hacia el bus de direcciones.
3. La memoria recibe la dirección contenida en el PC, y responde devolviendo el dato contenido en dicha celda a través del bus de datos. Dicho dato representa a la instrucción "ADD R1, R2, R3" mediante un valor numérico binario.
4. La instrucción recibida se almacena en el registro de instrucción.
5. La UC descodifica la instrucción. Es decir, averigua cuál es la instrucción (ADD) y cuáles son los operandos sobre los que ésta trabaja (Rl, R2 y R3).
Se debe tener presente que una instrucción se representa por un número binario, que ofrece información sobre la operación a realizar (mediante un un grupo de bits), y los operandos sobre los que trabajar (en otros grupos de bits). Para facilitar su comprensión, las instrucciones se suelen etiquetar mediante mnemónicos (por ejemplo, "ADD"), formando lo que se denomina "lenguaje ensamblador", propio de cada procesador.
6. La UC se comunica con el archivo de registros (véase la conexión en rojo), hace que el contenido de los registros R1 y R2 vaya a parar a las 2 entradasde la ALU.
7. La UC configura la ALU (mediante la línea de control en rojo, que realmente son varias líneas) indicando que se desea realizar la operación suma.
8. La UC configura el archivo de registros, de forma que el resultado de la suma se conduzca hacia el registro R3.
9. La UC ordena a la ALU que realice la operación actualmente configurada. Tal y como se pretendía, en el registro R3 se dispone de la suma de los valores contenidos en Rl y R2, con lo que la instrucción ha sido completada. Como conclusión importante del ejemplo, conviene remarcar que la ejecución de una instrucción sencilla se compone de una serie de operaciones internas a la CPU, todas controladas por la UC. Esta última sabe cuál es la secuencia de tareas a aplicar para cada instrucción, tras la etapa de descodificación. Como imaginará, las operaciones a realizar para ejecutar una misma instrucción dependen de la arquitectura de la CPU en uso. Imagine dos CPU con diferente diseño, pero que soportan el mismo juego de instrucciones. En ese caso, un mismo programa sería válido para ambas, y daría lugar a los mismos resultados. Pero es importante notar que el rendimiento del programa podría ser diferente en cada CPU, ya que el hardware es diferente (por ejemplo, el número de tareas internas a realizar y la duración de las mismas puede ser diferente). En otras palabras: el juego de instrucciones condiciona la compatibilidad de los programas, pero el diseño de la CPU decide el rendimiento.
En este punto, ya se han introducido los componentes fundamentales de la CPU.
Los siguientes apartados muestran con mayor detalle dos elementos destacados:
la ALU y los registros.
La Unidad Aritmético-Lógica
La ALU constituye el motor de cálculo de la CPU. El conjunto de operaciones que la ALU es capaz de efectuar, y la rapidez con la que puede realizarlas, influyen en gran medida en el rendimiento final del microprocesador. Por ello, el diseño de la ALU es crucial en el diseño de un procesador y merece una atención especial.
La Figura muestra el esquema general de una ALU. Los terminales A y B son en realidad puertos de entrada (compuestos por varias líneas, formando sendas palabras binarias). Los datos introducidos en A y B son los operandos con los que la ALU realizará la siguiente operación. Dicha operación se selecciona mediante las líneas del puerto denominado OPERACION. Cada posible operación a realizar tiene asociado un número binario, que es el que se introduce en dicho puerto. Cuando la ALU realiza la operación matemática o lógica seleccionada, devuelve el resultado empleando el puerto &. El resto de líneas de salida son bits (comúnmente denominados banderas o flags) que indican el estado de la última operación.
En la Figura indica los flags & (se ha producido acarreo), 1 (resultado negativo), = (el resultado es cero) y 9 (se ha producido un desbordamiento, es decir, se ha superado el valor más alto que es posible representar).
En el diseño de una CPU, es muy importante considerar la complejidad que se va a asignar a la ALU. Algunos procesadores contienen una ALU que soporta operaciones como la multiplicación y división, e incluso funciones matemáticas como el seno, lo que consigue acelerar notablemente la ejecución de los programas.
Como era de esperar, a mayor complejidad, mayores dimensiones presenta la ALU, dejando menos espacio útil para otras partes de la CPU.
Realmente, si en la aplicación final las operaciones van a ser sencillas, conviene implementar una ALU también sencilla, que dejará más espacio para otros bloques importantes de la CPU. Por ejemplo, se puede prescindir de la multiplicación, realizándola por software como una sucesión de sumas (lo que resulta lento, pero si no es frecuente, no tiene un gran impacto en el rendimiento general).
Los registros
Como ya se ha introducido, los registros son celdas capaces de almacenar un dato temporalmente. Pero, ¿cuál es el motivo de su existencia? Si la CPU tuviera que trabajar directamente con los datos almacenados en la memoria principal, el funcionamiento se haría más lento de lo necesario (son necesarios varios ciclos de reloj para recuperar o escribir un dato). Hay que tener en cuenta que la memoria es un elemento externo, y, por tanto, requiere un tiempo de acceso que resulta elevado. En cambio, el acceso a los registros es muy rápido, ya que se encuentran en el interior del procesador y su diseño los hace rápidos (se accede en un ciclo de reloj). Por ello, el procedimiento general consiste en escribir los datos (bien desde la memoria o de forma directa) en los registros, operar con ellos, y almacenar los resultados también en los registros.
Cuando se obtiene un resultado que se desea almacenar, se copia desde los registros hasta la memoria principal. El archivo de registros es una memoria de tipo multipuerto, ya que puede direccionar para que devuelva el contenido de dos celdas de memoria simultáneamente. Gracias a ello la ALU puede acceder simultáneamente al contenido de dos registros.
La Figura muestra la estructura de un archivo de registros. Además de los registros de propósito general, existen algunos con misiones específicas. Uno de los más conocidos es el denominado acumulador. Se encarga de sumar valores a su contenido, y actualizarse con el resultado. Tal es su importancia, que existen procesadores muy simples que son capaces de funcionar con este registro únicamente. Otro registro especial es el contador de programa, que se ha comentado anteriormente. También existen registros que se utilizan como indicadores, donde cada bit de su contenido es un flag que indica el estado de un aspecto concreto de la máquina. Por ejemplo, se suele indicar la existencia de acarreos, resultados nulos, desbordamientos, etc. También es usual disponer de registros tipo pila, usualmente LIFO (Last In – First Out, el último en entrar es el primero en salir). Al introducir datos, estos se "apilan" uno sobre el otro, y se recuperan en orden inverso al empleado al introducirlos.
La Figura muestra el funcionamiento de dicho tipo de registros. Su utilidad es vital en las llamadas a subrutinas: fragmentos de programa a los que se salta, son ejecutados y, tras ello, se continúa la ejecución en el punto donde se produjo el salto. Cada vez que se produce un salto a una subrutina, se introduce el valor del PC en la pila (esto es, la dirección a la que retornar). Al finalizar la ejecución de la subrutina, se extrae de la pila la dirección a la que retornar y se coloca en el registro PC. Si dentro de una subrutina se llama a otra, no hay problema, ya que las direcciones de retorno se sacarán de la pila en orden inverso al que entraron.
Estructura típica de un archivo de registros. Básicamente, es una matriz de celdas de
memoria capaces de almacenar un bit (valor 0 o 1). Cada fila de la matriz forma un registro, y
puede almacenar 32 bits (columnas). Cada dato a almacenar se introduce mediante los terminales C0, C1, …, C31. Los terminales A0, …, A31 y B0, …, B31 permiten leer el contenido de
dos registros simultáneamente (de acuerdo con las necesidades de la ALU)
Arquitecturas RISC y CISC
Basándose en el juego de instrucciones soportado, los procesadores se clasifican en dos grandes grupos:
Procesadores RISC (Reduced Instruction Set Computers). Este tipo de procesadores presenta un juego de instrucciones reducido, y en el que cada instrucción realiza una tarea sencilla. La ejecución de una instrucción de alto nivel de complejidad se puede llevar a cabo a partir de una secuencia de las sencillas instrucciones disponibles.
Procesadores CISC (Complex Instruction Set Computers). Ofrecen un juego de instrucciones extenso y complejo. En muchos de ellos, cada instrucción compleja se ejecuta internamente mediante un microprograma, compuesto por instrucciones que operan sobre los elementos internos del procesador. Por ejemplo, operaciones como "decrementar un registro y efectuar un salto si el resultado es cero", se encuentran englobadas bajo una única instrucción en los procesadores CISC. Los procesadores Intel Pentium y Motorola 680X0 son ejemplos de procesador CISC.
Funcionamiento de un pila FIFO. En la parte superior se
ilustra el proceso de introducción de un nuevo dato en la pila (operación
denominada PUSH). En la parte inferior se muestra el proceso
de extracción de un dato de la pila ( operación POP )
En primer lugar, se debe tener en cuenta que cada nueva instrucción añadida a una CPU implica añadir circuitería adicional, y, por tanto, se requiere de mayor espacio a ocupar en el chip. Una circuitería más compleja hace que el procesador trabaje con mayor lentitud. Por supuesto, el aumento de la complejidad de las instrucciones empeora aún más la velocidad de ejecución (ya que cada tarea se compone de multitud de tareas de bajo nivel) y aumenta la circuitería necesaria.
Por tanto, soportar una gran cantidad de complejas instrucciones se paga con un procesador mayor y más lento. Todo esto parece, pues, indicar que es preferible optar por los procesadores RISC, ya que al soportar menor número de instrucciones y ser éstas más simples, se conseguirá un mayor rendimiento con menor espacio. Si se trabaja con un lenguaje de alto nivel (por ejemplo, C++), el compilador se encargará de traducir las complejas instrucciones de dicho lenguaje, en una secuencia de sencillas instrucciones soportadas por el procesado, que se ejecutarán de forma eficiente.
Entonces, ¿por qué existen los procesadores CISC? Estas CPU tenían un gran sentido en los años 70 y 80, cuando las memorias eran lentas y ofrecían poco espacio de almacenamiento. Con una máquina CISC, era posible emplear instrucciones que englobaban multitud de tareas, con lo que los programas se almacenaban en un reducido espacio de memoria. Actualmente, ambos conceptos se hallan cada vez más solapados. La realidad es que muchos de los procesadores RISC actuales soportan tantas instrucciones como los antiguos procesadores CISC. Por otra parte, los procesadores CISC actuales usan multitud de técnicas, que más bien pertenecen a los procesadores RISC.
Pipelining o pipeline, es una técnica para mejorar el rendimiento de una CPU. Su implementación supone un enfrentamiento con multitud de problemas que es importante conocer. El conocimiento de esta técnica permite comprender mejor cuáles son los factores que definen la potencia real de una CPU, y aporta un arma importante a la hora de evaluar procesadores.
La CPU realiza una sucesión de tareas para ejecutar cada instrucción. En principio, se puede entender que la CPU realiza toda la secuencia de tareas para cada instrucción, antes de pasar a repetir el proceso completo con la instrucción siguiente. Pero, ¿no sería posible la aplicación de cierto paralelismo (funcionamiento simultáneo de algunas o todas las etapas del sistema), de forma que aumente el rendimiento? En efecto, esto se aplica en las CPU mediante la técnica denominada pipelining.
Estructura de una pipeline
El primer paso que aplica dicha técnica es justamente lo que se ha introducido: desglosar el funcionamiento de la CPU en diversas etapas, a las que se asignan unidades de procesamiento independientes. Dichas etapas se ejecutan de forma secuencial, y siguiendo un orden fijo. De esta forma, se obtiene lo que se denomina "pipeline" (tubería). Este planteamiento no deja de ser una aplicación del famoso principio "divide y vencerás", y por tanto sugiere que el rendimiento de la CPU se puede mejorar de esta forma.
Tras aplicar la última de las etapas, la instrucción en curso habrá sido ejecutada por completo. El paso de una etapa a la siguiente lo controla la señal de reloj de la CPU. La Figura ilustra la estructura de una pipeline. Se aprecia la existencia de registros entre las distintas etapas. A través de estos, cada etapa puede enviar información a la siguiente.
Un símil interesante es una cadena de ensamblaje de vehículos, donde cada etapa realiza una tarea diferente (colocar ruedas, fijar el chasis, aplicar pintura, etc.), obteniendo un vehículo completo tras la última etapa. Continuando con la cadena de ensamblaje, imagine que un vehículo no entra en la cadena hasta que el vehículo anterior ha abandonado la última etapa. En ese caso, el rendimiento no será óptimo en absoluto (piense que los operarios de cada etapa tendrán un generoso periodo de descanso hasta recibir el próximo vehículo, y por tanto no están trabajando todo lo que sería deseable).
Este comportamiento no es más que el presentado hasta el momento, y es propio de los procesadores que no emplean pipelines. El pipelining se alcanza aportando un ingrediente más a la cadena de ensamblaje: se introducirá un nuevo vehículo en la primera etapa cada vez que ésta quede libre. Lo mismo se hará en el resto de las etapas: de forma simultánea, cada vehículo pasa de una etapa a la posterior. Por lo tanto, tras un llenado inicial, la cadena siempre contiene vehículos en todas las etapas, y se produce un desplazamiento continuo desde la entrada hacia la salida. Cada vez que entra un nuevo vehículo sin montar en la cadena, aparece un nuevo vehículo montado en la etapa de salida.
Funcionamiento de un procesador sin pipelining
Suponga que hay N etapas en la cadena, y cada etapa toma 1 segundo en completarse. Si no se emplea la técnica de pipelining, se tarda N segundos en producir cada vehículo. En cambio, si se trabaja con pipelining, se tardará N-1segundos en llenar las N etapas, pero a partir de ahí cada segundo se obtendrá un coche completo a la salida.
El caso de una CPU es totalmente análogo, teniendo en cuenta que las etapas de la cadena son las etapas de la ejecución de una instrucción. Las Figuras 2 y 3 ilustran el funcionamiento de un procesador con y sin pipelining, empleando 3 etapas de 1 segundo de duración (y, por tanto, trabajando con una frecuencia de reloj de 1 Hz).
Funcionamiento de un procesador con pipelining
Cuando no se emplea pipelining (Figura 2), se utilizan 3 ciclos de reloj para ejecutar cada instrucción. Si se emplea pipelining (Figura 3), se toman 2 ciclos de reloj para llenar la pipeline, pero a partir de ahí, se ejecuta una instrucción por ciclo de reloj, lo que convierte al procesador en 3 veces más rápido.
La velocidad de la CPU y la frecuencia de reloj
Conviene hacer un inciso para aclarar un concepto muy importante: ¿cómo comparar la velocidad de dos CPU? La velocidad de ejecución de instrucciones, que se mide en MIPS (millones de instrucciones ejecutadas por segundo), es la cantidad con mayor significado. Nótese que la velocidad de reloj no se ha nombrado para nada. La frecuencia de reloj relaciona las MIPS y otra cantidad auxiliar: las IPC (número de instrucciones por ciclo de reloj). La operación a efectuar es la siguiente: frecuencia de reloj (MHz)=MIPS/IPC. Por ejemplo, un procesador capaz de ofrecer 100 MIPS y 10 IPC, precisará de una frecuencia de reloj de 100/ 10=10 MHz. En resumen, debe recordar que la velocidad real del procesador la dan las MIPS, y no la frecuencia de reloj.
Dos procesadores con idéntica velocidad de procesamiento,pero diferente frecuencia de reloj. La frecuencia de reloj no siempre es un buen parámetro para medir la velocidad de una CPU
Para poner un ejemplo práctico (Figura 4), considere un procesador sin pipelining de tres etapas (procesador 1), donde cada etapa emplea 1/3 segundos en su ejecución. Dicho procesador emplearía 1 segundo (3 etapas x 1/3 segundos cada etapa) en ejecutar cada instrucción, lo que se traduce en 1 instrucción por segundo (1 IPS). Como cada instrucción toma 3 ciclos de reloj, se tiene 1/3 IPC. Por tanto, la frecuencia de reloj necesaria es f reloj=1 IPS/(1/3 IPC)=3 Hz. Ahora imagine que otro fabricante desglosa cada etapa de la pipeline en 2 nuevas etapas, obteniendo un total de 6 etapas, de 1 / 6 segundos de duración cada una (procesador 2). En este caso, se sigue teniendo 1 IPS pero, en cambio, se obtienen 1/6 IPC. Esto resulta en una frecuencia de reloj de 1 IPS/ (1 / 6 IPC)=6 Hz.
La conclusión es la siguiente: los dos procesadores presentan la misma velocidad de procesamiento (1 IPS), pero la frecuencia de reloj en el segundo caso vale el doble Por ello, siempre debe recordar la siguiente regla de oro: nunca evalúe ni compare procesadores por su frecuencia de reloj, la cantidad que debe tener en cuenta son las MIPS. Un procesador que trabaja a 200 MHz no tiene por qué ser más potente que otro que trabaja a 100 MHz. En el caso de emplear pipelining, las velocidades se incrementan, pero el concepto presentado es el mismo. La velocidad sólo es útil cuando es la única característica que varía entre dos versiones de un mismo procesador.
Las etapas de la pipeline
Como ya se ha introducido, el pipelining comienza con el desglose en etapas del trabajo de la CPU. La división más básica se reduce a cuatro fases:
Búsqueda de instrucción (Instruction Fetch) Se accede a la memoria para obtener la instrucción a ejecutar.
Decodificación. Se interpreta la instrucción, es decir, se extrae cuál es la operación a realizar y cómo obtener los operandos sobre los que trabajar.
Ejecución. Se buscan los operandos y se realiza la operación indicada por la instrucción.
Almacenamiento de resultados o Write-Back. Se almacena el resultado de la operación en un registro (que posteriormente se puede volcar a la memoria principal). Las CPU actuales implementan muchas más etapas. Por ejemplo, los procesadores Pentium III y los actuales Athlon utilizan del orden de 10 fases.
El procesador Pentium 4, en cambio, emplea una pipeline de 20 etapas. Por simplicidad, el resto del capítulo tomará la división en cuatro etapas presentada, ya que representa adecuadamente el funcionamiento de la CPU.
Los siguientes apartados presentan una serie de problemas que rompen con el concepto ideal de pipeline y que, por tanto, perjudican al resultado. Como se podrá comprobar, una pipeline de N etapas incrementa notablemente el rendimiento, pero siempre en un factor menor que N.