CPU en un ordenador: ¿Qué es y cómo funciona de forma simple?
![CPU](https://disruptiveludens.net/wp-content/uploads/2024/05/Portada-CPU-1024x538.jpg)
En el presente artículo os relatamos el funcionamiento de una CPU o microprocesador, uno de los componentes clave de todo ordenador, de forma simple y directa, sin entrar en detalles complejos y dejando de lado ciertos elementos, los cuales tendrán sus artículos correspondientes en esta serie de conceptos básicos. Para ello vamos a describir un microprocesador muy simple, tanto, que solo puede realizar 4 instrucciones. No obstante, os servirá de forma directa para entender cómo funciona el corazón de vuestro ordenador sin excesiva complicación.
Índice de contenidos
¿Cuáles son los componentes de una CPU?
Todas las CPU están compuestas por una serie de elementos en común, no en vano, originalmente, los microprocesadores no estaban construidos en un solo chip, sino en un conjunto de estos, pero fue a partir de 1971, con la invención del Intel 4004, que apareció la primera unidad de proceso moderna totalmente integrada en una sola unidad. No obstante, hay una serie de componentes en común que tienen todos los microprocesadores modernos y los vamos a ir relatando uno por uno.
![Diagrama CPU](https://disruptiveludens.net/wp-content/uploads/2024/05/Diagrama-CPU.jpg)
Si bien la simplificación típica es la de dividir una CPU en la unidad de control y la ALU, dicho modelo nos parece, desde el punto de vista práctico, incompleto y cuando menos confuso, pese a aparecer en multitud de libros de texto y documentación pedagógica sobre el tema. Y es que no existe algo llamado unidad de control, tampoco lo que llamamos la ALU, sino una serie de unidades que se categorizan en dichos conjuntos. Es decir, la simpleza en exceso del mal llamado diagrama Von Neumann trae problemas de concepto.
Desde cierto punto de vista es como la falsa pirámide alimenticia de Kellogg’s que todo el mundo ha ido copiando a lo largo del tiempo. Es por ello que hemos decidido romper por completo con dicho modelo en este artículo, y con ello volcar la mesa. No para inventarnos cómo funciona una CPU, sino para no usar un modelo inexacto con la realidad.
El ciclo de una instrucción en una CPU
Una CPU lo que hace es procesar un programa informático, el cual son una serie de instrucciones en forma secuencial con un inicio y un final. Cada instrucción se compone de un opcode que es el verbo y un dato, el cual puede ser el valor con el que ha de operar la instrucción o la dirección de memoria dónde se encuentra dicho dato.
![Fetch Decode Execute](https://disruptiveludens.net/wp-content/uploads/2024/05/Fetch-Decode-Execute.png)
Por lo que al igual que cuando se explica el funcionamiento de un motor se relata todo el proceso por pasos o cuando se explica el aparato digestivo se empieza por la boca y se termina por… ya sabéis. Pues hemos decidido explicar el ciclo de una instrucción para explicar cómo funciona un microprocesador. Dicho proceso se divide en tres partes:
- Captación de la instrucción desde memoria. (Fetch)
- Decodificación de la instrucción captada. (Decode)
- Ejecución de la instrucción decodificada (Execute)
Cada una de estas etapas se puede dividir en varias subetapas y tardar más o menos ciclos de reloj dependiendo del procesador del que estemos hablando. Sin embargo, en este artículo no nos vamos a centrar en microprocesadores muy complejos, sino para explicaros los conceptos básicos y no complicar las cosas en exceso. Por lo que dentro de este artículo dejaremos de lado cosas como la ejecución fuera de orden, la predicción especulativa, la fusión de instrucciones y demás elementos que tienen las CPU contemporáneas para aumentar su rendimiento, pero que no son esenciales para explicar su funcionamiento.
Captación de instrucciones (Fetch)
Lo primero de todo es entender lo que son los registros, y es que se trata de memorias muy pequeñas que se encuentran dentro de la CPU y que son clave para realizar tareas concretas. Pese a ser volátiles y de lectura y escritura, no podemos acceder a las mismas, ya que se encuentran fuera del espacio de memoria del sistema por ser esenciales para ejecutar las diferentes etapas del ciclo de instrucción.
![](https://disruptiveludens.net/wp-content/uploads/2024/05/FetchProcess.jpg)
Por lo que empezaremos con el contador de programa, un registro que almacena la siguiente dirección de memoria de la que leerá la CPU, y que con cada instrucción ejecutada incrementará en +1 su valor. Dicha dirección se copiará a otro registro, llamado registro de dirección de memoria, el cual será enviado al controlador de memoria, una pieza externa al microprocesador encargado de acceder a la memoria correspondiente para que devuelva la información. Una vez se haya completado el proceso, el contenido de dicha dirección de memoria (y las colindantes) se copiará a un registro búfer que será utilizado posteriormente por el decodificador para interpretar la instrucción.
En el caso de que se trate de cambiar un dato en memoria, existe otro registro, el registro de escritura en memoria, el cual almacenará temporalmente el dato que queremos escribir. Sin embargo, aquí no actúa el registro búfer.
FLAGS en la captación de datos
Un FLAG es un registro que se compone de un solo bit, normalmente agrupado en varios y que indican a la CPU ciertas condiciones que se dan de forma generalizada. En los primeros microprocesadores solía haber una serie de FLAGS que se activaban cuando se realizaba un acceso a memoria, dado que era la única a la que podían acceder y solo admitía un acceso. Por lo que cuando la RAM era accedida, dicho bit se activaba, indicándole a la CPU que esperase a la hora de acceder a los datos.
Los FLAGS de captación de datos se utilizan para comunicarle al controlador de memoria no solo un acceso a la misma, sino también para decirle si el acceso es para lectura o escritura, ya que el funcionamiento de la memoria varía según cuál sea la operación a memoria que se está haciendo.
Decodificación de instrucciones (Decode)
La segunda parte del Frontend de la CPU es el decodificador de instrucciones, el cual se suele llamar unidad de control o control unit. Su trabajo no es otro que leer el contenido del registro búfer y desglosar cada una de las instrucciones, por tanto, ha de tener la capacidad de separar lo que es el opcode, que indica la acción que hará la CPU, de los datos, que es el resto de la instrucción.
![Decodificador Instrucciones CPU](https://disruptiveludens.net/wp-content/uploads/2024/05/Decodificador-2-4.jpg)
Nuestra excesivamente simple CPU tendrá un set de solo 4 instrucciones:
- LOAD para cargar desde memoria una información de una dirección concreta.
- STORE para copiar los datos del registro acumulador.
- ADD para sumar el valor incluido en el registro búfer con el almacenado en el acumulador.
- JUMP para cambiar el valor del contador de programa.
Dado que no siempre se almacenan instrucciones y puede que tengamos grandes cantidades de datos de forma secuencial, usaremos el primer bit para indicar si son datos puros o instrucciones. Por lo que si este es 0, inmediatamente se incrementará el contador de programa en +1 hasta encontrar una instrucción, la cual se indicará con un 1 en el código. De ahí los siguientes 2 bits (00, 01, 10, 11) indicarán que instrucción se ejecutará. Para ello se utiliza un decodificador binario, una pieza en la que tenemos n entradas en forma de bits, en este caso 2, y acabamos con 2n salidas, y en consecuencia, en este caso tendremos 4 caminos distintos.
Ejecución de instrucciones (Execute)
Llegamos a la parte final y dependiendo del tipo de instrucción de la que hablemos estás se ejecutarán de una forma u otra, aunque aquí es importante hablar del registro acumulador, el único al que tiene acceso el programa y también el que es un poco chico para todo, dado que nos será imprescindible para ejecutar cualquiera de las 4 instrucciones de nuestra CPU de ejemplo.
![Motherboard CPU BIOS](https://disruptiveludens.net/wp-content/uploads/2024/05/motherboard-cpu-bios.jpg)
Y es que una vez se haya hecho la decodificación, la instrucción seguirá un camino u otro.
- La instrucción LOAD copiará el valor de la dirección de memoria a la que quiere acceder al registro de acceso a memoria que hemos visto durante la fase de captación (Fetch).
- La instrucción STORE copiará el valor desde el registro acumulador al registro de escritura en memoria junto a la dirección de memoria correspondiente en el registro de acceso a memoria.
- JUMP, en cambio, solo copiará del registro acumulador al contador de programa para cambiar su valor.
- Y para terminar tenemos ADD, cuya operación requiere el uso de la unidad aritmético-lógica o ALU, la cual se encargará de realizar la operación de suma en nuestro caso.
- Se ha de tener en cuenta que una CPU no existe solo una ALU sino varias, ya que dependiendo del tipo de operación varía su funcionamiento y esta puede ser más o menos compleja.
- Debido a que nuestro sistema no puede restar, para hacer comparaciones usaremos el valor contrario para que al sumarse de 0.
Las ALU dentro de la CPU
![](https://disruptiveludens.net/wp-content/uploads/2024/05/CPU-ALU-1024x758.jpg)
En la mayoría de documentación se suele confundir las unidades de ejecución con la ALU, sin embargo, esto no es del todo así, ya que hay muchas instrucciones que se solucionan sin pasar por esta unidad, la cual está compuesta por los siguientes elementos:
- El circuito operacional se encarga de realizar la instrucción correspondiente, cada ALU en una CPU tiene su propio circuito operacional y no solo varía según el tipo, sino también según el tipo de dato con el que estemos tratando, ya sea en enteros, coma flotante, decimal, booleano.
- En nuestro ejemplo la CPU solo ejecuta en enteros, se ha de entender que sería necesaria una instrucción de suma distinta por cada tipo de dato.
- En su versión más simple son puertas lógicas, por ejemplo, OR se puede utilizar para sumar 2 valores en binario.
- El registro de entrada es un registro temporal, el cual almacena solo el dato de la instrucción a operar. En nuestro caso, su valor se sumará al del valor almacenado en el acumulador, para que el resultado obtenido se vuelva a almacenar de nuevo en dicho registro, desplazando el valor original.
- Los registros de estado son una serie de FLAGS que nos indican cuando ocurren ciertas condiciones, por lo que se activará cada uno de ellos cuando:
- Necesitamos indicar que en la suma hay acarreo.
- El valor comparativo de dos números es 0.
- La cifra obtenida es más alta que los registros pueden almacenar.
- Etc.
Y con esto hemos terminado, y podéis haceros una idea, de manera muy simplificada, de cómo funciona una CPU.
[…] el artículo de qué es y cómo funciona una CPU de forma simple no lo tuvimos en cuenta, pero podemos tener una copia distinta de cada […]