Un microprocesador moderno es una entidad tremendamente complicada, y miles de personas han necesitado décadas de trabajo para llegar a donde está ahora. Es casi imposible cubrir todas las bases aquí, pero haré un intento. Tenga listo un cubo de palomitas de maíz, porque esto va a ser largo.
Cualquier sistema moderno funciona sobre la base de buenas abstracciones , es decir, módulos más simples sobre los que se construyen elementos más complejos. En mi opinión, el procesador moderno se puede dividir en las siguientes capas muy amplias:
- Dispositivos (transistores)
- Circuitos
- Puertas lógicas
- Bloques lógicos simples
- Procesador
- Software
Para empezar, comencemos desde un “punto medio”, uno que no es ni demasiado complicado de entender ni demasiado lejos de un procesador real: la puerta lógica. Una puerta lógica tomará cierto número de entradas, todas las cuales son 0 o 1, y generará un bit que nuevamente es 0 o 1 de acuerdo con alguna regla. Por ejemplo, una puerta AND generará 1 solo si todas sus entradas son 1.
Ahora puede comenzar a preguntarme “¿Pero qué quiere decir con 0 y 1? ¿Qué significa eso en términos de electricidad?”. La respuesta es fantásticamente complicada. Puede significar un nivel de voltaje (0 es 0V, 1 es 1V), un pulso eléctrico (0 no es pulso, 1 es un pulso de 1V por 1 nanosegundo, una billonésima de segundo), un fotón (0 no es fotón , 1 es 1000 fotones), y así sucesivamente, todo dependiendo de cómo se diseñó el circuito. Este es el poder de las abstracciones. No necesita saber lo que significan 0 y 1 para diseñar cosas más arriba (pero tomará malas decisiones más arriba si no sabe esto, por lo que tal vez la abstracción no sea perfecta).
- Cómo averiguar si alguien ha accedido a mi PC en mi ausencia
- ¿Cuál es el propósito de las ranuras de expansión? ¿Cuál es un ejemplo de cómo podría usarlos?
- ¿Por qué las unidades de DVD son tan propensas al mal funcionamiento?
- ¿Qué sucede si inicia una computadora sin un sistema operativo?
- ¿Qué es una buena computadora portátil de 12 "para un viajero de negocios?
Ahora pensemos cómo podemos hacer algo con estas puertas muy simples. Permítanos pensar que está a punto de comenzar su propia compañía de procesadores y que desea hacer un bloque simple que agregue dos números usando estas puertas solo.
“Pero espera”, dices, “¿qué es un número en términos de 0 y 1? Solo conozco números como 57 y 42, que están hechos de dígitos del 0-9, no solo 0 y 1”. Es cierto, pero mira, 57 es solo una “representación” del número debajo, que en realidad es 5 * 10 + 7. También puede representar 57 como 1 * 2 ^ 5 + 1 * 2 ^ 4 + 1 * 2 ^ 3 + 0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0. Voila !! ahí lo tienes, 57 es lo mismo que 111001 en este nuevo sistema. Puede convencerse de que cualquier número puede representarse en este formulario.
Ahora, pensemos cómo vamos a construir un sumador. En primer lugar, intentemos construir un “medio sumador”, uno que tome dos bits y los agregue a la salida de dos bits. Entonces, si los dos bits son ambos 0, generará 00, si solo uno de ellos es 1, generará 01, y si ambos son 1 generará 10. Pensemos un bit a la vez y tomemos el primero mordió al principio. Después de un tiempo, descubrimos “¡Oh! Ese bit es 1 solo si ambos bits de entrada son 1. Para que podamos pasar por una puerta AND. ¡Impresionante!”. Ahora tenemos la mitad de nuestro trabajo hecho. Solo queda un poco.
Ahora nos sentamos a pensar de nuevo. Hmm, esta otra parte parece más difícil. Es casi como una puerta OR, pero no genera 1 si ambas entradas son 1. Ok, no pensemos más en esto y simplemente decidamos llamarlo un nuevo tipo de puerta, una puerta OR exclusiva.
“No se preocupe”, le digo, “contrataremos a algunos ingenieros de circuitos súper impresionantes que pueden diseñar una puerta de este tipo mientras duermen”. Ahora dibujamos una imagen de nuestro nuevo y sorprendente circuito: un medio sumador.
Pero, ahora dice, “podemos agregar solo números de 1 bit. Nuestra compañía rival puede agregar números de más de mil millones. ¿Cómo hacemos eso?”. La respuesta es sorpresa sorpresa, abstracciones. Verá, nuestro diseño actual solo puede agregar dos números de un bit, y la salida es una suma y un “carry”, que ahora debe agregarse al siguiente bit más alto. Esto necesita la adición de tres bits, que nuestro pequeño no puede hacer.
Entonces, después de otro día completo de pensar en esto, descubrimos que este será un buen circuito para hacer esto y lo llamaremos sumador “completo”.
Ahora tenemos todo el poder añadido del mundo en nuestras manos. Verán, ahora podemos encadenar a 32 de estos pequeños individuos como lo siguiente y tenemos en nuestras manos un monstruo que puede sumar números de más de mil millones, en un abrir y cerrar de ojos.
Y aquí están las maravillosas noticias: puedes seguir haciendo mejores y mejores puertas, y tu circuito será cada vez mejor. Ese es el poder de la abstracción.
Por supuesto, resulta que nuestra forma de agregar cosas no es realmente tan buena. Puedes hacerlo mejor … mucho mejor. Pero, debido a nuestra abstracción amiga, eso se puede hacer independientemente de las puertas. Si tu circuito más nuevo es 2 veces mejor que el anterior, Y tienes puertas 2 veces más rápidas, ¡tienes un circuito 4 veces mejor! Ese es uno de los principales contribuyentes a cómo mejoramos miles de veces en unas pocas décadas. Construimos puertas más pequeñas, más rápidas y que consumen menos energía. Y descubrimos mejores y mejores formas de hacer el mismo cálculo. Y luego nos unimos a ellos juntos. Funcionó como magia!
Ahora trabajamos durante un año en nuestro garaje y construimos circuitos que pueden multiplicar, sumar, restar, dividir, comparar y hacer todo tipo de operaciones aritméticas, todo dentro de 1 nanosegundo. Incluso hacemos un pequeño circuito que puede “almacenar” un valor, es decir, su salida dependerá del valor que se haya escrito anteriormente (alguien sugiere que lo llamemos flip-flop. Eso suena como un nombre gracioso, lo mantenemos ^ _ ^). Pero, verán, una cosa que todos nuestros circuitos tienen en común es que solo toman entradas y hacen la misma operación sobre ellas para dar la salida. ¿Qué pasa si quisiera a veces hacer una multiplicación, y en otras ocasiones una adición?
¡Ahora, tenemos una onda cerebral! Decimos, no consideremos los bits solo como números. Tratemos de representar las “acciones” en pedazos. Digamos que 0 significa “sumar”, 1 significa “multiplicar”. Ahora, construyamos un pequeño circuito que vea un bit como un “comando”, y seleccione entre dos entradas, I0 e I1, y las salidas I0 si el comando es 0, e I1 si es 1. Este es un multiplexor.
“¡Wow!”, Dices, “ahora solo necesitamos un multiplexor para elegir entre las salidas de un sumador y un multiplicador, ¡y tenemos nuestra solución! De hecho, ¿por qué no tener muchos de estos multiplexores para elegir? muchas salidas, y tenemos una máquina tan increíble. Puede realizar muchas operaciones aritméticas dependiendo de lo que le des como “comando”.
¡Ahora tenemos otra idea IMPRESIONANTE! ¿Recuerdas esas divertidas chanclas que construimos antes? Pensamos, ¿y si conectamos un multiplexor 1024-1 a la salida de 1024 flip-flops? ¡Ahora tenemos lo que se llama una memoria de 1 Kilobit! Podemos darle una “dirección”, y nos devolverá un poco, que era el bit almacenado en esa ubicación numerada. ¿No es genial? Además, estos bits ahora pueden ser “números” (datos) o “comandos” (instrucciones).
Sentémonos y pensemos qué tenemos hasta ahora: tenemos tantas funciones aritméticas, tenemos un multiplexor genial que selecciona qué salida elegir, y tenemos una memoria, que puede darnos un poco si le damos una “dirección” .
Aquí está lo asombroso ahora. Tenemos TODO lo que necesitamos para construir un procesador. Veamos cómo:
- En primer lugar, tenemos una matriz de memoria MEM que contiene todos los “comandos” (instrucciones) y “números” (datos).
- En segundo lugar, tenemos un número llamado “contador de programa”, uno que usamos para seleccionar qué instrucción ejecutar desde MEM. Normalmente solo aumenta en 1 en cada paso.
- Tercero, tenemos un bloque aritmético con multiplexores.
- Cuarto, generamos ambas entradas a nuestro bloque aritmético desde MEM.
- Finalmente, hay dos tipos de instrucciones: instrucciones de datos e instrucciones de control. Cada instrucción de datos contiene cuatro cosas: dos direcciones que especifican qué dos números elegir del MEM, un comando que indica qué operación realizar y otra ubicación que indica dónde devolver el resultado. Las instrucciones de control simplemente ponen otra dirección en el “contador de programa”.
Esta cosa que acabas de construir se llama máquina Von-Neumann (sí, locos como él descubrieron todo esto en 1945, no sé cómo). Hoy en día, las personas comienzan a preguntarse si esta es la mejor manera de construir cosas, pero esta es la forma estándar en que se construye cualquier procesador hoy en día.
Bueno, cuando dije antes que así es como se construyen todos los procesadores, quise decir “teóricamente”, y por “teóricamente”, quiero decir “consideremos que una vaca es una esfera” teóricamente. Verá, la CPU de su competidor puede recorrer círculos alrededor de su CPU básica Von-Neumann. Solo tiene 1000 Kilobits de memoria, su competidor puede manejar hasta miles de millones (Gb) o trillones (Tb) de bits de memoria. Pero ahora dices, de ninguna manera esos tipos pueden crear un multiplexor de mil millones a uno y tener sus datos dentro de 1 nanosegundo. Cierto. Su salsa secreta es algo llamado localidad .
Lo que esto significa es que su programa normalmente solo usa algunas ubicaciones de datos y memoria de instrucciones a la vez. Entonces, lo que debe hacer es tener una memoria grande que consista en GB de datos, luego trae una pequeña parte de ella, la parte que se está utilizando actualmente, en una matriz mucho más pequeña (quizás 1 MB) llamada caché . Por supuesto, ahora puede tener un caché aún más pequeño debajo de este caché, y así sucesivamente, hasta que pueda llegar a algo en lo que pueda leer o escribir en aproximadamente la misma cantidad de tiempo que puede hacer un cálculo aritmético.
Otra idea poderosa que puede hacer se llama procesamiento fuera de orden . El siguiente programa puede ilustrar el concepto detrás de esto que calcula X = (A + B) * (C + D)
- Agregue A y B y guárdelo en U
- Agregue C y D y guárdelo en V
- Multiplica U y V y guárdalo en X
De la manera normal, lo hará secuencialmente, siguiendo una instrucción tras otra y terminando la ejecución en 3 pasos. Pero, si tiene dos sumadores en su sistema, puede ejecutar las instrucciones 1 y 2 en paralelo, y luego hacerlo en 2 pasos. Entonces ejecuta tanto como sea posible en cada paso y termina su ejecución más rápido.
Ahora, piense en el tiempo en que todo lo que sabía era una simple puerta AND. Esta cosa que has construido parece muy ajena a eso. Pero en realidad son solo capas sobre capas de bloques, y reutilizando un bloque más simple para construir un bloque más complejo. Esta es la idea clave aquí. Una CPU se construye solo parcheando partes, que se construye parcheando partes más pequeñas. Al final, sin embargo, si solo miras la cosa, se ve así:
- Sumador (electrónica)
- Arquitectura von Neumann
- Caché de la CPU
- Ejecución fuera de orden
- ARCA | Procesador Intel® Core ™ i7-3960X Extreme Edition (caché de 15 M, hasta 3,90 GHz)
Editar: Hay muchos detalles que omití en la respuesta original. Esta respuesta será equivalente a responder a “¿Cómo funciona un auto F1?” con “Tiene ruedas, y una dirección que las guía, y un motor para correr las ruedas”. Verdaderamente, diseñar y construir una CPU es uno de los milagros de la tecnología moderna que involucra una gran cantidad de disciplinas de ingeniería (incluyendo, por ejemplo, física cuántica, metalurgia, fotónica, etc.). Intentaré abordar algunos problemas más a continuación.
Fabricación
Una de las increíbles hazañas de la tecnología ha sido la capacidad de crear y conectar miles de millones de pequeños transistores, cada uno de menos de 100 nm (sí, eso es nano , lo que significa una milmillonésima parte de un metro) de ancho, en un patrón preciso definido por los diseñadores de circuitos y el Arquitectos de CPU, y todavía lo hacen increíblemente barato. Está claro que crear y conectar una cantidad tan enorme de transistores uno por uno es imposible a mano o incluso por cualquier forma de mecánica.
El método para fabricar un chip se llama fotolitografía, y es la razón detrás del precio extremadamente bajo de los procesadores en comparación con su complejidad. La idea es similar a cómo una foto analógica solía ser “desarrollada” (si alguien recuerda eso). Primero describiré cómo crear un patrón de óxido de silicio sobre silicio (esto se usa en puertas de transistores). Primero se deposita una capa de óxido de silicio sobre el silicio. Luego se aplica una capa de material fotorresistente encima. Este material es sensible a la luz, pero es resistente al “grabado”. El inverso del patrón que se creará también se hace en forma de una “máscara” a través de la cual se ilumina la luz UV sobre la fotorresistencia. Sin embargo, esto plantea la pregunta de cómo se creó la máscara en primer lugar.
Aquí está la magia de la fotolitografía: la máscara es en realidad mucho más grande que el tamaño del patrón que se grabará. La luz que brilla a través de la máscara simplemente es enfocada por una lente para tener el tamaño correcto cuando cae sobre el silicio. Una vez que la luz cambia la fotorresistencia, es eliminada por una explosión de plasma, dejando solo el patrón deseado en el óxido de silicio.
Para crear una capa de metal, por otro lado, se sigue un procedimiento similar. Sin embargo, ahora el inverso del patrón está grabado en SiO2, y luego el metal se deposita en los “surcos” creados por el SiO2.
La razón por la que esto es tan económico es porque una vez que tiene la “máscara”, puede crear una gran cantidad de chips a partir de ella. Por lo tanto, aunque una máscara es bastante costosa (unos pocos millones de dólares), su costo se divide en muchos chips, lo que hace que cada chip sea muy barato (juego de palabras no previsto).
Tipos de recuerdos
Como dije antes, puedes construir una memoria conectando flip-flops a multiplexores. Sin embargo, esa no es una forma especialmente eficiente de hacer las cosas. Un flip-flop consume alrededor de 15-20 transistores. Sin embargo, en la práctica hay dos tipos de estructuras de memoria: RAM estática (o SRAM en resumen), que usa 6 transistores por bit, y RAM dinámica (o DRAM en resumen), que usa solo un transistor y un condensador por bit. Una RAM estática es esencialmente dos puertas NO conectadas en un bucle como este.
Claramente, hay dos estados posibles para A y B, A = 1, B = 0 o A = 0, B = 1. La idea es aplicar un voltaje externo para empujar el bucle a un estado u otro, que es entonces el bit “almacenado”, y luego simplemente lea el voltaje en A o B para “leer” el bit.
Por otro lado, la RAM o DRAM dinámica es aún más simplista y es más o menos así.
En este diseño, el transistor simplemente actúa como un interruptor para almacenar la carga en el condensador, en cuyo caso se lee como un 1, de lo contrario un 0. Sin embargo, la carga en el condensador se escapa del transistor de vez en cuando. Por lo tanto, debe leerse y reescribirse a intervalos fijos, y por eso se llama RAM dinámica.
Los cachés en un chip son generalmente SRAM, ya que son más rápidos. Sin embargo, las memorias principales en una computadora son generalmente DRAM, ya que son mucho más pequeñas en tamaño y, por lo tanto, una mayor cantidad de memoria puede caber en un solo chip.
- Fotolitografía
- Memoria estática de acceso aleatorio
- Memoria dinámica de acceso aleatorio
PD: He comenzado un blog sobre ideas básicas de arquitectura de CPU en CPU Architecture . En caso de que esta respuesta le interese, puede consultarla.