Arquitectura von Neumann

Ajustar Compartir Imprimir Citar
Arquitectura informática donde código y datos comparten un bus común
Un esquema de arquitectura de von Neumann

La arquitectura de von Neumann, también conocida como modelo de von Neumann o arquitectura de Princeton, es una arquitectura informática basada en una descripción de 1945 de John von Neumann, y por otros, en el Primer borrador de un informe sobre el EDVAC. El documento describe una arquitectura de diseño para una computadora digital electrónica con estos componentes:

El término "arquitectura von Neumann" ha evolucionado para referirse a cualquier computadora con programa almacenado en la que una búsqueda de instrucciones y una operación de datos no pueden ocurrir al mismo tiempo (ya que comparten un bus común). Esto se conoce como cuello de botella de von Neumann y, a menudo, limita el rendimiento del sistema correspondiente.

El diseño de una máquina de arquitectura von Neumann es más simple que el de una máquina de arquitectura Harvard, que también es un sistema de programa almacenado, pero tiene un conjunto dedicado de buses de direcciones y datos para leer y escribir en la memoria, y otro conjunto de buses de direcciones y datos para obtener instrucciones.

Una computadora con programa almacenado utiliza el mismo mecanismo subyacente para codificar tanto las instrucciones como los datos del programa, a diferencia de los diseños que utilizan un mecanismo como cableado de tablero discreto o circuitos de control fijos para la implementación de instrucciones. Las computadoras con programa almacenado fueron un avance con respecto a las computadoras de función fija o reconfiguradas manualmente de la década de 1940, como la Colossus y la ENIAC. Estos se programaron configurando interruptores e insertando cables de conexión para enrutar datos y señales de control entre varias unidades funcionales.

La gran mayoría de las computadoras modernas utilizan el mismo mecanismo de hardware para codificar y almacenar datos e instrucciones de programas, pero tienen cachés entre la CPU y la memoria y, para los cachés más cercanos a la CPU, tienen cachés separados para instrucciones y datos., de modo que la mayoría de las recuperaciones de instrucciones y datos utilizan buses separados (arquitectura de caché dividida).

Historia

Las primeras computadoras tenían programas fijos. Algunas computadoras muy simples todavía usan este diseño, ya sea por simplicidad o con fines de capacitación. Por ejemplo, una calculadora de escritorio (en principio) es una computadora de programa fijo. Puede hacer matemáticas básicas, pero no puede ejecutar un procesador de textos ni juegos. Cambiar el programa de una máquina de programa fijo requiere recablear, reestructurar o rediseñar la máquina. Las primeras computadoras no estaban tanto "programadas" sino más bien "programadas". según lo "diseñado" para una tarea particular. La "reprogramación", cuando era posible, era un proceso laborioso que comenzaba con diagramas de flujo y notas en papel, seguido de diseños de ingeniería detallados y luego el proceso, a menudo arduo, de recablear y reconstruir físicamente la máquina. Configurar y depurar un programa en ENIAC podría llevar tres semanas.

Con la propuesta de la computadora con programas almacenados, esto cambió. Una computadora con programa almacenado incluye, por diseño, un conjunto de instrucciones y puede almacenar en la memoria un conjunto de instrucciones (un programa) que detalla el cálculo.

Un diseño de programa almacenado también permite la modificación automática del código. Una de las primeras motivaciones para una instalación de este tipo fue la necesidad de un programa para incrementar o modificar la parte de dirección de las instrucciones, lo que los operadores tenían que hacer manualmente en los primeros diseños. Esto se volvió menos importante cuando los registros de índice y el direccionamiento indirecto se convirtieron en características habituales de la arquitectura de las máquinas. Otro uso fue incorporar datos de uso frecuente en el flujo de instrucciones mediante direccionamiento inmediato.

Capacidades

A gran escala, la capacidad de tratar instrucciones como datos es lo que hace posibles los ensambladores, compiladores, enlazadores, cargadores y otras herramientas de programación automatizadas. Hace que "programas que escriben programas" posible. Esto ha hecho florecer un sofisticado ecosistema informático autohospedado en torno a máquinas de arquitectura von Neumann.

Algunos lenguajes de alto nivel aprovechan la arquitectura de von Neumann proporcionando una forma abstracta e independiente de la máquina para manipular el código ejecutable en tiempo de ejecución (p. ej., LISP) o utilizando información de tiempo de ejecución para ajustar la compilación justo a tiempo (p. ej., lenguajes alojados en la máquina virtual Java o lenguajes integrados en los navegadores web).

A menor escala, algunas operaciones repetitivas como BITBLT o sombreadores de píxeles y vértices se pueden acelerar en procesadores de uso general con técnicas de compilación justo a tiempo. Este es un uso del código automodificable que sigue siendo popular.

Desarrollo del concepto de programa almacenado

El matemático Alan Turing, que había sido alertado sobre un problema de lógica matemática gracias a las conferencias de Max Newman en la Universidad de Cambridge, escribió un artículo en 1936 titulado Sobre números computables, con una aplicación al problema de Entscheidungs, que se publicó en las Proceedings of the London Mathematical Society. En él describía una máquina hipotética a la que llamó máquina informática universal, ahora conocida como "máquina universal de Turing". La máquina hipotética tenía un almacén infinito (memoria en la terminología actual) que contenía tanto instrucciones como datos. John von Neumann conoció a Turing mientras era profesor invitado en Cambridge en 1935, y también durante el año de doctorado de Turing en el Instituto de Estudios Avanzados de Princeton, Nueva Jersey, durante 1936-1937. No está claro si conocía el artículo de Turing de 1936 en ese momento.

En 1936, Konrad Zuse también anticipó, en dos solicitudes de patente, que las instrucciones de las máquinas podrían almacenarse en el mismo almacenamiento que se utiliza para los datos.

De forma independiente, J. Presper Eckert y John Mauchly, que estaban desarrollando el ENIAC en la Escuela Moore de Ingeniería Eléctrica de la Universidad de Pensilvania, escribieron sobre el concepto de programa almacenado en diciembre de 1943. Al planificar una nueva máquina, EDVAC, Eckert escribió en enero de 1944 que almacenarían datos y programas en un nuevo dispositivo de memoria direccionable, una memoria de línea de retardo de mercurio metálico. Esta fue la primera vez que se propuso la construcción de una máquina práctica de programa almacenado. En ese momento, él y Mauchly no conocían el trabajo de Turing.

Von Neumann participó en el Proyecto Manhattan en el Laboratorio Nacional de Los Álamos. Requirió enormes cantidades de cálculos y, por lo tanto, lo atrajo al proyecto ENIAC durante el verano de 1944. Allí se unió a las discusiones en curso sobre el diseño de esta computadora de programa almacenado, la EDVAC. Como parte de ese grupo, redactó una descripción titulada Primer borrador de un informe sobre el EDVAC basado en el trabajo de Eckert y Mauchly. Estaba inacabado cuando su colega Herman Goldstine lo hizo circular y sólo llevaba el nombre de von Neumann (para consternación de Eckert y Mauchly). El artículo fue leído por docenas de colegas de von Neumann en Estados Unidos y Europa e influyó en la siguiente ronda de diseños de computadoras.

Jack Copeland considera que es "históricamente inapropiado referirse a las computadoras digitales con programas electrónicos almacenados como 'máquinas de von Neumann' ". Su colega de Los Álamos, Stan Frankel, dijo sobre el respeto de von Neumann por las ideas de Turing.

Sé que en o alrededor de 1943 o '44 von Neumann era muy consciente de la importancia fundamental del papel de Turing de 1936.... Von Neumann me presentó a ese periódico y a su petición lo estudié con cuidado. Muchas personas han aclamado a von Neumann como el "padre de la computadora" (en un sentido moderno del término) pero estoy seguro de que nunca habría cometido ese error él mismo. Puede que se le llame la partera, quizás, pero me enfatizó firmemente, y a otros estoy seguro, que la concepción fundamental se debe a Turing, en la medida en que no se prevea por Babbage.... Turing y von Neumann, por supuesto, también hicieron contribuciones sustanciales a la "reducción a la práctica" de estos conceptos, pero no consideraría éstos como comparables en importancia con la introducción y explicación del concepto de una computadora capaz de almacenar en su memoria su programa de actividades y de modificar ese programa en el curso de estas actividades.

En el momento en que se publicó el "Primer Borrador" Cuando se distribuyó el informe, Turing estaba elaborando un informe titulado Calculadora electrónica propuesta. Describió con detalle de ingeniería y programación su idea de una máquina a la que llamó motor de computación automática (ACE). Lo presentó al comité ejecutivo del Laboratorio Nacional de Física Británico el 19 de febrero de 1946. Aunque Turing sabía por su experiencia en tiempos de guerra en Bletchley Park que lo que proponía era factible, el secreto que rodeó a Colossus, que se mantuvo posteriormente durante varias décadas, impidió que lo diga. Se produjeron varias implementaciones exitosas del diseño ACE.

Tanto el artículo de von Neumann como el de Turing describían computadoras con programas almacenados, pero el artículo anterior de von Neumann logró una mayor circulación y la arquitectura de computadora que describió se conoció como "von Arquitectura Neumann". En la publicación de 1953 Más rápido que el pensamiento: un simposio sobre máquinas de computación digital (editado por B. V. Bowden), una sección en el capítulo sobre Computadoras en Estados Unidos dice lo siguiente:

La máquina del Instituto de Estudios Avanzados, Princeton

En 1945, el profesor J. von Neumann, que entonces trabajaba en la Escuela de Ingeniería Moore de Filadelfia, donde se había construido el E.N.I.A.C., emitido en nombre de un grupo de sus colaboradores, un informe sobre el diseño lógico de las computadoras digitales. El informe contenía una propuesta detallada para el diseño de la máquina que desde entonces se conoce como el E.D.V.A.C. (computador automático variable discreto electrónico). Esta máquina se ha completado recientemente en Estados Unidos, pero el informe de von Neumann inspiró la construcción de la E.D.S.A.C. (Cálculo automático de demora eléctrica de almacenamiento) en Cambridge (véase p. 130).

En 1947, Burks, Goldstine y von Neumann publicaron otro informe que esbozaba el diseño de otro tipo de máquina (una máquina paralela esta vez) que sería extremadamente rápido, capaz quizás de 20.000 operaciones por segundo. They pointed out that the outstanding problem in constructing such a machine was the development of suitable memory with instantaneously accessible contents. Al principio sugirieron utilizar un tubo de vacío especial llamado "Selectron" que habían inventado los Laboratorios de Princeton de RCA. Estos tubos eran caros y difíciles de hacer, así que von Neumann decidió posteriormente construir una máquina basada en la memoria de Williams. Esta máquina, completada en junio de 1952 en Princeton, se ha convertido en popularmente conocida como Maniac. El diseño de esta máquina inspiró al menos media docena de máquinas que ahora se construyen en América, todas conocidas cariñosamente como "Johniacs".

En el mismo libro, los dos primeros párrafos de un capítulo sobre ACE dicen lo siguiente:

Computación automática en el Laboratorio Físico Nacional

Una de las computadoras digitales más modernas que incorporan desarrollos y mejoras en la técnica de computación electrónica automática fue recientemente demostrada en el Laboratorio Nacional de Física, Teddington, donde ha sido diseñada y construida por un pequeño equipo de ingenieros de investigación matemáticos y electrónicos en el personal del Laboratorio, asistido por varios ingenieros de producción de la compañía eléctrica inglesa, Limited. El equipo hasta ahora erigido en el Laboratorio es sólo el modelo piloto de una instalación mucho más grande que será conocida como el motor de computación automática, pero aunque comparativamente pequeña en granel y conteniendo sólo alrededor de 800 válvulas termonicas, como se puede juzgar de las placas XII, XIII y XIV, es una máquina de cálculo extremadamente rápida y versátil.

Los conceptos básicos y principios abstractos de computación por una máquina fueron formulados por el Dr. A. M. Turing, F.R.S., en un papel1. leer antes de la Sociedad Matemática de Londres en 1936, pero el trabajo en tales máquinas en Gran Bretaña fue retrasado por la guerra. En 1945, sin embargo, el Sr. J. R. Womersley hizo un examen de los problemas, luego superintendente de la División de Matemáticas del Laboratorio. Fue acompañado por el Dr. Turing y un pequeño personal de especialistas, y, para 1947, la planificación preliminar estaba suficientemente avanzada para justificar el establecimiento del grupo especial ya mencionado. En abril de 1948, este último se convirtió en la Sección Electrónica del Laboratorio, a cargo del Sr. F. M. Colebrook.

Primeras computadoras con arquitectura von Neumann

El primer borrador describía un diseño que fue utilizado por muchas universidades y corporaciones para construir sus computadoras. Entre estas diversas computadoras, sólo ILLIAC y ORDVAC tenían conjuntos de instrucciones compatibles.

Primeras computadoras con programas almacenados

Es difícil poner en orden la información de fechas en la siguiente cronología. Algunas fechas son para ejecutar por primera vez un programa de prueba, algunas fechas son para la primera vez que se demostró o completó la computadora y algunas fechas son para la primera entrega o instalación.

Evolución

Sistema único evolución del bus de la arquitectura

A lo largo de las décadas de 1960 y 1970, las computadoras generalmente se volvieron más pequeñas y más rápidas, lo que condujo a evoluciones en su arquitectura. Por ejemplo, las E/S asignadas en memoria permiten que los dispositivos de entrada y salida se traten igual que la memoria. Se podría utilizar un bus de sistema único para proporcionar un sistema modular con un costo menor. A esto a veces se le llama "racionalización" de la arquitectura. En las décadas siguientes, los microcontroladores simples a veces omitían características del modelo para reducir el costo y el tamaño. Las computadoras más grandes agregaron funciones para un mayor rendimiento.

Limitaciones de diseño

Cuello de botella de Von Neumann

El bus compartido entre la memoria de programa y la memoria de datos conduce al cuello de botella de von Neumann, el rendimiento limitado (velocidad de transferencia de datos) entre la unidad central de procesamiento (CPU) y la memoria en comparación con la cantidad de memoria. Debido a que un único bus sólo puede acceder a una de las dos clases de memoria a la vez, el rendimiento es menor que la velocidad a la que puede funcionar la CPU. Esto limita seriamente la velocidad de procesamiento efectiva cuando se requiere que la CPU realice un procesamiento mínimo en grandes cantidades de datos. La CPU se ve obligada continuamente a esperar a que los datos necesarios se muevan hacia o desde la memoria. Dado que la velocidad de la CPU y el tamaño de la memoria han aumentado mucho más rápido que el rendimiento entre ellos, el cuello de botella se ha convertido en un problema mayor, un problema cuya gravedad aumenta con cada nueva generación de CPU.

El cuello de botella de von Neumann fue descrito por John Backus en su conferencia del Premio ACM Turing de 1977. Según Backus:

Seguramente debe haber una forma menos primitiva de hacer grandes cambios en la tienda que empujando un gran número de palabras de ida y vuelta a través del cuello de botella von Neumann. No sólo es este tubo un cuello de botella literal para el tráfico de datos de un problema, sino, más importante, es un cuello de botella intelectual que nos ha mantenido atados a pensamiento palabra a tiempo en lugar de animarnos a pensar en términos de las unidades conceptuales más grandes de la tarea a mano. Así, la programación está básicamente planeando y detallando el enorme tráfico de palabras a través del cuello de botella de von Neumann, y gran parte de ese tráfico no se refiere a datos significativos en sí mismo, sino dónde encontrarlo.

Mitigaciones

Existen varios métodos conocidos para mitigar el cuello de botella en el rendimiento de Von Neumann. Por ejemplo, todo lo siguiente puede mejorar el rendimiento:

El problema también se puede evitar en cierta medida mediante el uso de computación paralela, utilizando, por ejemplo, la arquitectura de acceso a memoria no uniforme (NUMA); este enfoque es comúnmente empleado por las supercomputadoras. Está menos claro si el cuello de botella intelectual que Backus criticó ha cambiado mucho desde 1977. La solución propuesta por Backus no ha tenido una influencia importante. La programación funcional moderna y la programación orientada a objetos están mucho menos orientadas a "impulsar una gran cantidad de palabras de un lado a otro"; que los lenguajes anteriores como FORTRAN, pero internamente, eso sigue siendo en lo que las computadoras pasan gran parte de su tiempo, incluso las supercomputadoras altamente paralelas.

A partir de 1996, un estudio comparativo de bases de datos encontró que tres de cada cuatro ciclos de CPU se gastaban esperando memoria. Los investigadores esperan que el aumento del número de flujos de instrucciones simultáneos con subprocesos múltiples o multiprocesamiento de un solo chip empeore aún más este cuello de botella. En el contexto de los procesadores multinúcleo, se requiere una sobrecarga adicional para mantener la coherencia de la caché entre los procesadores y los subprocesos.

Código automodificable

Aparte del cuello de botella de von Neumann, las modificaciones del programa pueden ser bastante dañinas, ya sea por accidente o por diseño. En algunos diseños de computadoras simples con programas almacenados, un programa que funciona mal puede dañarse a sí mismo, a otros programas o al sistema operativo, lo que posiblemente provoque una falla de la computadora. La protección de la memoria y otras formas de control de acceso generalmente pueden proteger contra cambios de programas tanto accidentales como maliciosos.