La arquitectura de von Neumann es uno de los modelos fundamentales de la
informática moderna. Formalizada a mediados de la década de 1940, en el
contexto del desarrollo de los primeros ordenadores electrónicos, se
basa en una idea que hoy parece casi evidente: las instrucciones de un
programa pueden almacenarse en memoria, al igual que los datos sobre los
que operan.
Este principio del programa almacenado transformó profundamente el
diseño de los ordenadores. Una misma máquina podía realizar tareas muy
diferentes simplemente cargando un nuevo programa, sin necesidad de
modificar físicamente su cableado.
Más de ochenta años después de los primeros trabajos sobre el EDVAC, los
procesadores se han vuelto infinitamente más complejos. Sin embargo, las
nociones de memoria, cálculo, control y entrada/salida siguen estando en
el centro de su funcionamiento.
Antes del programa almacenado
Las primeras máquinas de cálculo automático no se programaban
necesariamente como nuestros ordenadores actuales.
En algunas máquinas, cambiar el cálculo que debía realizarse implicaba
modificar conexiones, mover cables, ajustar interruptores o preparar
nuevos soportes físicos. El ENIAC, desarrollado en Estados Unidos
durante la Segunda Guerra Mundial, es un ejemplo célebre: su
configuración inicial requería un importante trabajo manual.
Estas máquinas podían efectuar cálculos extraordinariamente rápidos para
su época, pero pasar de un problema a otro seguía siendo complicado.
Entonces surgió una pregunta esencial:
¿Y si las instrucciones que indican a la máquina qué debe hacer se
almacenaran también en su memoria?
El programa dejaría de estar representado únicamente por la
configuración física de la máquina. Se convertiría en información que el
ordenador podría cargar y leer.
Esta idea constituye el núcleo del concepto de programa almacenado.
El proyecto EDVAC y el informe de 1945
En 1945, cuando el ENIAC todavía no había sido presentado oficialmente
al público, sus diseñadores ya trabajaban en su sucesor: el EDVAC,
siglas de Electronic Discrete Variable Automatic Computer.
John von Neumann se incorporó a las
conversaciones en torno al proyecto y redactó un documento que se haría
famoso: el First Draft of a Report on the EDVAC.
El informe describía una máquina electrónica organizada alrededor de
varias funciones principales: cálculo, control, memoria y comunicación
con el exterior. Sobre todo, exponía el principio según el cual las
instrucciones podían representarse de forma numérica y conservarse en
memoria.
El documento circuló ampliamente y contribuyó de manera decisiva a
difundir esta nueva forma de concebir un ordenador.
Esta es una de las principales razones por las que la expresión
«arquitectura de von Neumann» acabó imponiéndose.
Sin embargo, esta denominación requiere una importante precisión
histórica.
Una invención que no fue obra de una sola persona
Presentar a John von Neumann como el único inventor de esta arquitectura
sería engañoso.
Las ideas relacionadas con el programa almacenado surgieron en un
entorno científico y técnico mucho más amplio. Los ingenieros J.
Presper Eckert y John Mauchly, que trabajaron en el ENIAC y
posteriormente en el EDVAC, participaron directamente en el diseño de
estas nuevas máquinas.
Otros investigadores también contribuyeron a la evolución de las ideas
sobre los ordenadores electrónicos y programables.
No obstante, von Neumann desempeñó un papel decisivo en su formalización
y, sobre todo, en su difusión. El First Draft llevaba su nombre y
circuló ampliamente entre los investigadores que trabajaban en los
futuros ordenadores.
Por ello, el término histórico perduró.
Hablar hoy de arquitectura de von Neumann sigue siendo perfectamente
legítimo, siempre que recordemos que el nacimiento del ordenador moderno
fue el resultado de un trabajo colectivo.
Las cinco grandes funciones de un ordenador
En una representación simplificada, una máquina de tipo von Neumann
incluye varios elementos esenciales:
una unidad aritmético-lógica;
una unidad de control;
una memoria;
dispositivos de entrada;
dispositivos de salida.
La unidad aritmético-lógica, habitualmente denominada ALU, realiza
las operaciones solicitadas: sumas, restas, comparaciones y operaciones
lógicas.
La unidad de control coordina el funcionamiento de la máquina. Determina
qué instrucción debe ejecutarse y dirige los demás componentes.
En los ordenadores modernos, estas dos funciones forman parte del
procesador, o CPU.
La memoria conserva la información que necesita la máquina. Puede
contener tanto los datos que se están procesando como las instrucciones
del programa.
Por último, las entradas y salidas permiten al ordenador comunicarse con
el mundo exterior mediante teclados, pantallas, dispositivos de
almacenamiento, redes, sensores y muchos otros periféricos.
Esta representación está deliberadamente simplificada, pero sigue
proporcionando una excelente base para comprender cómo funciona un
ordenador.
La idea decisiva: instrucciones y datos en memoria
La característica más conocida del modelo reside en la forma de utilizar
la memoria.
En una arquitectura de von Neumann clásica, los datos y las
instrucciones pueden almacenarse en la misma memoria.
Imaginemos un programa extremadamente sencillo encargado de sumar dos
números.
La memoria podría contener:
los dos números que deben sumarse;
la instrucción que solicita la suma;
la instrucción que indica dónde guardar el resultado;
y, posteriormente, el propio resultado.
Para la máquina, una instrucción también está representada mediante
información numérica.
Esta idea abre enormes posibilidades.
Cambiar de programa ya no exige necesariamente reconstruir o recablear
el ordenador. Basta con colocar nuevas instrucciones en la memoria.
Una misma máquina física puede así realizar tareas de contabilidad,
cálculos científicos, ejecutar un videojuego o funcionar como editor de
texto simplemente utilizando programas diferentes.
Este es uno de los principios que hacen posible el ordenador de
propósito general.
¿Cómo ejecuta un programa el procesador?
El funcionamiento puede representarse mediante un ciclo conocido
habitualmente como fetch-decode-execute, es decir, búsqueda,
decodificación y ejecución.
Imaginemos que un programa ya está cargado en memoria.
1. Buscar la instrucción
El procesador debe saber primero qué instrucción tiene que ejecutar.
Un registro especial, denominado generalmente contador de programa o
program counter, contiene la dirección de la siguiente instrucción.
El procesador obtiene esa instrucción de la memoria.
2. Decodificar la instrucción
Una vez cargada, la instrucción debe interpretarse.
La unidad de control determina la operación solicitada: realizar una
suma, comparar dos valores, mover un dato, leer una posición de memoria
o modificar el flujo de ejecución del programa.
3. Ejecutar la operación
A continuación se realiza la operación.
Si se necesita un cálculo, puede intervenir la unidad aritmético-lógica.
Si la instrucción necesita un dato, el procesador puede recuperarlo de
la memoria.
4. Guardar el resultado
El resultado puede colocarse en un registro, escribirse en memoria o
enviarse a otro componente.
Después, el procesador pasa a la siguiente instrucción.
Con algunos procesadores actuales funcionando a miles de millones de
ciclos por segundo, esta sucesión de operaciones resulta invisible para
el usuario.
Los registros: memoria lo más cerca posible del cálculo
La memoria principal no es el único lugar donde el procesador conserva
información.
También dispone de pequeñas zonas de almacenamiento extremadamente
rápidas denominadas registros.
Pueden contener temporalmente:
valores utilizados en cálculos;
direcciones de memoria;
resultados intermedios;
la instrucción actual;
la dirección de la siguiente instrucción.
Su capacidad es minúscula en comparación con la memoria principal, pero
su proximidad a las unidades de procesamiento hace que sean mucho más
rápidos.
Esta diferencia ilustra un problema que adquiere cada vez más
importancia a medida que los procesadores aceleran: el cálculo puede
llegar a ser más rápido que el acceso a los datos que necesita.
El cuello de botella de von Neumann
En el modelo clásico, las instrucciones y los datos comparten la memoria
y las vías de comunicación con el procesador.
Por tanto, el procesador debe recuperar continuamente nuevas
instrucciones y los datos necesarios para ejecutarlas, y puede tener que
devolver después los resultados a la memoria.
Aunque el procesador sea extremadamente rápido, su rendimiento puede
verse limitado por la velocidad a la que circula la información entre la
memoria y las unidades de procesamiento.
Este fenómeno se conoce como cuello de botella de von Neumann.
La expresión fue popularizada especialmente por el informático John
Backus en la década de 1970.
El problema no ha desaparecido en los ordenadores modernos. La
diferencia de rendimiento entre los procesadores y la memoria ha sido
durante mucho tiempo uno de los grandes desafíos de la arquitectura
informática.
Las memorias caché acercan los datos al procesador
Una de las respuestas a este problema consiste en añadir varios niveles
de memoria caché.
Una caché es mucho más pequeña que la memoria principal, pero también
mucho más rápida.
El procesador intenta conservar en ella las instrucciones y los datos
que considera que probablemente utilizará próximamente.
Los procesadores modernos suelen disponer de varios niveles:
caché L1, muy pequeña y extremadamente rápida;
caché L2, de mayor capacidad;
caché L3, todavía mayor y a menudo compartida entre varios núcleos.
El objetivo es sencillo: evitar en la medida de lo posible tener que
esperar a la memoria principal.
Esta jerarquía muestra hasta qué punto las máquinas modernas se han
alejado de los esquemas elementales de la década de 1940, al mismo
tiempo que intentan resolver una dificultad directamente relacionada con
el modelo original.
Arquitectura von Neumann y arquitectura Harvard
Otra organización importante es la arquitectura Harvard.
En una arquitectura Harvard estricta, las instrucciones y los datos
utilizan memorias separadas y pueden disponer de vías de comunicación
independientes.
Esto permite, entre otras cosas, obtener simultáneamente una instrucción
y un dato.
La diferencia teórica puede resumirse así:
von Neumann: las instrucciones y los datos comparten un espacio de
memoria.
Harvard: las instrucciones y los datos están separados.
En la práctica, los ordenadores modernos difuminan considerablemente
esta distinción.
Un procesador puede presentar al programador un espacio de memoria
unificado correspondiente al modelo de von Neumann y, al mismo tiempo,
utilizar internamente cachés separadas para instrucciones y datos.
En ocasiones se habla de arquitectura Harvard modificada.
Muchos microcontroladores y procesadores especializados también utilizan
distintas variantes de esta organización.
Por tanto, sería incorrecto imaginar que todos los ordenadores actuales
encajan perfectamente en uno u otro modelo.
Los procesadores modernos ya no trabajan estrictamente instrucción por instrucción
El ciclo de búsqueda, decodificación y ejecución es un excelente modelo
pedagógico, pero un procesador moderno es mucho más sofisticado.
Para mejorar el rendimiento, puede empezar a procesar una nueva
instrucción antes de que la anterior haya terminado por completo. Este
es el principio del pipeline de instrucciones.
También puede disponer de varias unidades de ejecución capaces de
realizar distintas operaciones simultáneamente.
Algunos procesadores incluso reorganizan el orden de ejecución de las
instrucciones cuando esto permite utilizar sus recursos de forma más
eficiente, asegurándose al mismo tiempo de que el programa produzca el
resultado esperado.
La ejecución especulativa permite anticipar el camino que
probablemente seguirá un programa y comenzar ciertos cálculos antes
incluso de saber si serán necesarios.
Además, los procesadores actuales suelen disponer de varios núcleos,
cada uno capaz de ejecutar sus propios flujos de instrucciones.
Por tanto, un ordenador moderno está muy lejos del esquema elemental
procesador-memoria-entrada/salida.
Sin embargo, a nivel de software seguimos encontrando una idea
fundamental: unas instrucciones almacenadas dirigen una máquina de
propósito general que manipula datos.
Un programa puede convertirse a su vez en un dato
El principio del programa almacenado tiene una consecuencia
especialmente importante: dado que un programa se representa
numéricamente en memoria, un programa puede manipular otro programa.
Un compilador, por ejemplo, puede leer código fuente y producir un
programa ejecutable.
Un sistema operativo puede cargar un programa desde un dispositivo de
almacenamiento hasta la memoria.
Un editor puede modificar un archivo que contiene código.
Un programa puede incluso generar automáticamente nuevas instrucciones.
La frontera entre «programa» y «dato» depende, por tanto, en parte de
cómo se interprete la información.
Esta propiedad se volvió esencial para el desarrollo de los sistemas
operativos, los compiladores, los lenguajes de programación y, de manera
más general, de la industria del software.
Del hardware especializado a la máquina universal
El concepto de programa almacenado contribuyó a una transformación
fundamental.
En lugar de construir una máquina diferente para cada problema, se hizo
posible construir una máquina de propósito general y modificar su
comportamiento mediante software.
Esta idea mantiene una estrecha relación conceptual con los trabajos de
Alan Turing.
En 1936, varios años antes del EDVAC, Turing describió una máquina
abstracta capaz de realizar operaciones definidas simbólicamente.
Demostró, entre otras cosas, que una máquina universal podía simular el
funcionamiento de muchas otras máquinas si recibía sus descripciones.
La máquina de Turing es un modelo
matemático, mientras que la arquitectura de von Neumann se refiere a la
organización práctica de los ordenadores electrónicos.
Por tanto, ambos conceptos no deben confundirse.
Sin embargo, forman parte de la misma revolución intelectual: una
máquina no tiene por qué construirse para una única tarea; su
comportamiento puede estar determinado por la información que recibe.
¿Por qué sigue siendo importante la arquitectura de von Neumann?
Los ordenadores actuales incluyen GPU, múltiples núcleos, complejas
jerarquías de caché, controladores especializados, aceleradores de
inteligencia artificial y numerosos mecanismos que no existían en la
década de 1940.
Por ello, decir que un ordenador moderno es simplemente «una máquina de
von Neumann» sería muy reduccionista.
Pero el modelo sigue siendo extremadamente útil.
Permite comprender por qué un ordenador dispone de memoria y procesador,
cómo se ejecuta un programa, por qué los datos deben circular entre
distintos componentes y por qué la velocidad de la memoria influye en el
rendimiento.
También representa una etapa fundamental de la historia de la
informática: aquella en la que el programa pasó a convertirse en
información almacenable y modificable, en lugar de ser únicamente una
configuración física del hardware.
Esta idea parece hoy tan natural que resulta fácil olvidar hasta qué
punto fue decisiva.
Cada vez que instalamos una aplicación, iniciamos un videojuego,
cargamos una página web o ejecutamos unas líneas de código, seguimos
utilizando esta propiedad fundamental: una misma máquina puede
convertirse en algo diferente simplemente porque le proporcionamos
nuevas instrucciones.
Lo esencial
La arquitectura de von Neumann no es un plano exacto de los ordenadores
modernos. Es, ante todo, un modelo histórico y conceptual.
Sin embargo, sus principios esenciales siguen siendo fundamentales:
una máquina dispone de unidades de cálculo y control;
utiliza memoria para almacenar información;
las instrucciones de un programa pueden almacenarse en memoria;
esas instrucciones dirigen las operaciones realizadas sobre los
datos;
una misma máquina puede, por tanto, ejecutar programas muy
diferentes.
Su influencia va mucho más allá del esquema clásico de un procesador
conectado a una memoria.
El concepto de programa almacenado contribuyó a convertir el ordenador
en una máquina versátil definida tanto por su software como por su
hardware.
Preguntas frecuentes
¿John von Neumann inventó esta arquitectura él solo?
No. Von Neumann desempeñó un papel fundamental en la formalización y
difusión del concepto, especialmente a través del First Draft of a
Report on the EDVAC de 1945. Sin embargo, las ideas asociadas al EDVAC
surgieron de un trabajo colectivo en el que participaron, entre otros,
J. Presper Eckert y John Mauchly.
¿Cuál es la idea principal de la arquitectura de von Neumann?
El principio esencial es el programa almacenado: las instrucciones
pueden representarse numéricamente y conservarse en memoria, lo que
permite que una misma máquina ejecute programas diferentes.
¿Cuál es la diferencia entre la arquitectura von Neumann y la arquitectura Harvard?
En el modelo clásico de von Neumann, las instrucciones y los datos
comparten la memoria. En una arquitectura Harvard, utilizan memorias o
vías separadas. Muchos procesadores modernos emplean una organización
híbrida.
¿Qué es el cuello de botella de von Neumann?
Es la limitación de rendimiento provocada por la comunicación entre el
procesador y la memoria. Un procesador muy rápido puede tener que
esperar a recibir las instrucciones o los datos necesarios para realizar
sus cálculos.
¿Los ordenadores modernos siguen utilizando la arquitectura de von Neumann?
Conservan varios de sus principios fundamentales, especialmente el
concepto de programa almacenado, pero incorporan numerosas
optimizaciones adicionales, como memorias caché, pipelines, ejecución
paralela, múltiples núcleos y, en algunos casos, separación interna
entre instrucciones y datos.