Una CPU lo que hace es ejecutar las instrucciones de un programa situado en una memoria. Pero, ¿sabíais que todos siguen las mismas normas generales? Todos siguen el mismo ciclo de instrucción, el cual se divide en tres etapas diferenciadas llamadas Fetch, Decode y Execute, las cuales se traducen como captación, descodificación y ejecución. Os explicamos cómo funcionan estas etapas y cómo se organizan.
Con tal de simplificar y hacer más entendible los conceptos explicados en este artículo hemos decidido describir un procesador sumamente simple para los tiempos que corren, por lo que en este artículo veréis una explicación de lo que son los ciclos de instrucción de manera generalizada que se puede aplicar desde los primeros procesadores de 8 bits a los más complejos que hay hoy en día.
Obviamente, los actuales procesadores, los más avanzados, cuentan con tecnologías mucho más complejas y avanzadas que imprimen más potencia que los modelos de hace algunas décadas pero que, en el fondo, su manera de trabajar está inspirada en lo que os contaremos a continuación. Y como hemos dicho, lo hemos simplificado al máximo para que sea más fácil de entender.
Así funciona el ciclo de instrucción del procesador
Los procesadores no son diferentes desde cierto punto de vista a un motor de combustión, los cuales siempre realizan un proceso continuo de explosión del combustible en diferentes etapas, ya sean de 2 tiempos o de 4 tiempos. El motivo de ello es que los procesadores funcionan en tres etapas distintas en su versión más simple que son las siguientes y que, de manera general, podemos entender que son invariables de cualquier modelo que se vende en el mercado.
- Fetch o Captación: En la que la instrucción es captada desde la memoria RAM y copiada a dentro del procesador.
- Decode o Descodificación: En la que la instrucción previamente captada es descodificada y enviada a las unidades de ejecución.
- Execute o Ejecución: Donde la instrucción es resuelta y el resultado escrito en los registros internos del procesador o en una dirección de memoria de la RAM.
Estas tres etapa se cumplen en todo procesador, existe una cuarta etapa que es la de Write-Back que es cuando las unidades de ejecución escriben el resultado, peor normalmente esto se cuenta dentro de la etapa de ejecución del ciclo de instrucción.
Primera etapa del ciclo de instrucción: Fetch
La primera etapa del ciclo de instrucción se encarga de captar las instrucciones que hay en la memoria RAM asignada al procesador a través de una serie de unidades y registros que son las siguientes. Es en esa memoria donde se encuentra la información que la CPU debe procesar por lo que ese primera paso tiene que ver con recolectarla, con leerla para comenzar las operaciones.
- Program Counter o Contador de Programa: El cual apunta a la siguiente línea de memoria donde se encuentra la siguiente instrucción del procesador. Se incrementa en 1 su valor cada vez que se termina un ciclo completo de instrucción o cuando una instrucción de salto cambia el valor del contador de programa.
- Memory Address Register o registro de direccionamiento de memoria: El MAR copia el contenido del PC y lo envía a la RAM a través de los pines de direccionamiento de la CPU, los cuales están cableados con los pines de direccionamiento de la propia memoria RAM.
- Memory Data Register o registro de datos a memoria : En el caso que la CPU tenga que realizar una lectura a memoria, lo que hace el MDR es copiar el contenido de esa dirección de memoria a un registro interno de la CPU, el cual es un registro temporal de paso antes de que su contenido sea copiado al Instruction Register. El MDR al contrario del MAR esta conectado a los pines de datos de la RAM y no a los de direccionamiento y en el caso de que se trate de una instrucción de escritura el contenido de lo que se quiere escribir en la RAM también se escribe en el MDR
- Instruction Register o Registro de Instrucción: La parte final de la etapa de captación o fetch es la escritura de la instrucción en el registro de instrucción, del cual la unidad de control del procesador copiará su contenido para la segunda etapa del ciclo de instrucción.
Estas 4 sub-etapas ocurren en todos los procesadores sea cual sea su utilidad, arquitectura y compatibilidad binaria o lo que llamamos ISA. Por lo que es aplicable a prácticamente cualquier modelo que os podáis encontrar en el mercado. Eso sí, en muchos casos variarán las tecnologías utilizadas u otros componentes que entran a formar parte de este proceso para agilizar trabajos mucho más específicos.
La unidad de control
La unidad de control es la pieza más compleja que existe en un procesador y sus tareas son las siguientes que os detallamos aquí debajo. Como en todos los casos, se trata de un conjunto de mínimos, que son esenciales:
- Se encarga de coordinar el movimiento y el orden en que de los datos que se mueven dentro y fuera del procesador, así de las diferentes subunidades que se encargan de ello.
- En general se considera que las unidades de la etapa de captación o Fetch forman parte del hardware que llamamos unidad de control y dicho hardware es llamado también el Front-End de un procesador.
- Interpreta las instrucciones y las envía a las diferentes unidades de ejecución a las que está conectado.
- Está comunicado a las las diferentes ALUs y unidades de ejecución del procesador que actúan
- Se encarga de captar y descodificar las instrucciones, sino también de escribir los resultados en los registros, caches o en la dirección correspondiente de la RAM.
La unidad de control lo que hace es descodificar las instrucciones y esto lo hace porque cada instrucción en realidad no deja de ser una especie de oración en donde primero va el verbo y luego el objeto directo u objeto sobre el que se hace la acción. El sujeto se acaba eliminando en este lenguaje interno de los ordenadores por el hecho que se sobrentiende que es el propio ordenador el que lo ejecuta, así pues cada cantidad de bits es una oración donde los primeros 1 y 0 corresponden a la acción y los que vienen a continuación es el dato o la localización del dato que se quiere manipular.
La segunda etapa: Decode
Hay diferentes tipos de instrucciones y no todas hacen lo mismo, por lo que dependiendo del tipo de instrucción necesitamos saber hacía que unidades de ejecución se van a enviar y la manera más clásica de hacerlo es a través de lo que llamamos un descodificador, el cual toma cada instrucción, la divide internamente según el opcode o instrucción y el dato o la dirección de memoria donde se encuentra este.
Por ejemplo en el diagrama de arriba tenemos el diagrama de un procesador de solo 8 instrucciones, las cuales se pueden codificar en solo 3 bits. Cada una de las instrucciones una vez descodificadas se envían a las diferentes unidades de ejecución que las resolverán.
Este ciclo de instrucción es el más complejo de todo y el que define el tipo de arquitectura. Dependiendo si tenemos un conjunto de instrucciones reducido o complejo esto afectará a la naturaleza de la unidad de control, dependiendo del formato de la instrucción o de cuantas se procesen al mismo tiempo la fase de descodificación y por tanto la unidad de control tendrá una naturaleza u otra.
La forma más fácil de visualizar lo que ocurre es pensar en las instrucciones como trenes circulando a través de una compleja red ferroviaria y la unidad de control dirigiéndolos a una estación termino, la cual es la unidad de ejecución que se encargará de resolver la instrucción.
Tercera etapa: Execute
La última etapa es la de la ejecución de las instrucciones, en esta etapa las instrucciones son resueltas, pero no todos los tipos de instrucción se resuelven de la misma forma, ya que la forma de utilizar el hardware dependerá de la función de cada una de ellas, en general tenemos cuatro tipos de instrucciones:
- Instrucciones de movimiento de bits: En el cual se manipula el orden de los bits que contienen el dato.
- Instrucciones aritméticas: Donde se realizan operaciones matemáticas y también lógicas, estas se solucionan en las llamadas ALU o unidades aritmético-lógicas.
- Instrucciones de salto: En la que se cambia la siguiente el valor del contador de programa, lo que permite utilizar el código de manera recursiva.
- Instrucciones a memoria: Son con las que el procesador lee y escribe la información de la memoria del sistema.
El otro punto son los formatos de la instrucción, ya que una instrucción se puede aplicar a un dato, escalar o a varios datos al mismo tiempo, lo que conocemos como SIMD. Para terminar y dependiendo del formato de los datos, hay diferentes tipos de ALU para la ejecución de las instrucciones aritméticas, por ejemplo tenemos unidades de enteros y en coma flotante como unidades diferenciadas a día de hoy.
Una vez la instrucción ha sido terminada se escribe el resultado sobre una dirección de memoria en concreto y se pasa a ejecutar la siguiente, algunas instrucciones no manipulan los valores de memoria sino ciertos registros. Así pues el registro del contador de programa es modificado por las instrucciones de salto, si queremos leer o escribir un dato entonces se manipulan los registros MAR y MDR.
¿Todos los procesadores funcionan de la misma manera?
La respuesta corta a esta pregunta es que sí, pero cuando hablamos de procesadores de PC. Existen otros tipos de procesadores, como los RISC-V y ARM que utilizan sus propios métodos para ejecutar las instrucciones que les llegan de los programas, pero en líneas generales, cuando hablamos de procesadores de PC –AMD o Intel–, funcionan de la manera que os hemos contado aquí, siempre.
Con ligeras excepciones pero como norma general, todo lo que tenéis en este artículo os servirá para comprender mejor cuál es el flujo de la información y cómo se procesa la información y los datos cada vez que hacéis uso de un componente que es el cerebro de todo el sistema. Ahora pensad a la velocidad que lo hace todo y cómo de increíble es que hayamos alcanzo los niveles de computación en los que nos movemos ahora mismo y que eran impensables hace apenas 20 años.
Y es que en líneas generales, los procesadores no han evolucionado tanto en las últimas décadas. Sí, se ha mejorado la litografía para hacer que los transistores sean cada vez más pequeños, lo que permite meter una mayor cantidad de ellos en el mismo espacio y eso ha mejorado tanto la capacidad de cómputo como la eficiencia energética, y sí, se ha mejorado notablemente la velocidad de funcionamiento, pero en general los procesadores llevan funcionando igual décadas, y no pinta que esto vaya a cambiar.
Últimamente sí que han surgido nuevos procesadores que cambian las reglas del juego, como hemos comentado antes los procesadores RISC-V y ARM funcionan de manera un poco diferente, aunque en esencia el flujo de trabajo sigue siendo bastante parecido: reciben la instrucción, la procesan y la ejecutan.