Arquitectura 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:
- Una unidad de procesamiento con una unidad lógica aritmética y registros de procesadores
- Una unidad de control que incluye un registro de instrucciones y un contador de programas
- Memoria que almacena datos e instrucciones
- Almacenamiento masivo externo
- Mecanismos de entrada y producción
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.
- ARC2 (Birkbeck, Universidad de Londres) entró oficialmente en línea el 12 de mayo de 1948.
- Manchester Baby (Victoria University of Manchester, Inglaterra) hizo su primera exitosa carrera de un programa almacenado el 21 de junio de 1948.
- EDSAC (Universidad de Cambridge, Inglaterra) fue la primera computadora electrónica de programa almacenado práctica (mayo de 1949)
- Manchester Mark 1 (Universidad de Manchester, Inglaterra) Desarrollado por el bebé (junio de 1949)
- CSIRAC (Consejo de Investigación Científica e Industrial) Australia (noviembre de 1949)
- MESM en el Instituto de Electrotecnología de Kiev, Ucrania SSR (noviembre de 1950)
- EDVAC (Ballistic Research Laboratory, Computing Laboratory at Aberdeen Proving Ground 1951)
- ORDVAC (U-Illinois) en Aberdeen Proving Ground, Maryland (completed November 1951)
- Máquina IAS en la Universidad de Princeton (enero 1952)
- MANIAC I en el Laboratorio Científico de Los Álamos (marzo 1952)
- ILLIAC en la Universidad de Illinois (septiembre de 1952)
- BESM-1 en Moscú (1952)
- AVIDAC en el Laboratorio Nacional Argonne (1953)
- ORACLE at Oak Ridge National Laboratory (June 1953)
- BESK en Estocolmo (1953)
- JOHNNIAC en RAND Corporation (enero de 1954)
- DASK en Dinamarca (1955)
- WEIZAC en el Instituto de Ciencias de Weizmann en Rehovot, Israel (1955)
- PERM en Munich (1956)
- SILLIAC en Sydney (1956)
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.
- El IBM SSEC tenía la capacidad de tratar las instrucciones como datos, y fue demostrado públicamente el 27 de enero de 1948. Esta habilidad fue reclamada en una patente estadounidense. Sin embargo fue parcialmente electromecánica, no totalmente electrónica. En la práctica, se leyeron instrucciones de la cinta de papel debido a su memoria limitada.
- The ARC2 developed by Andrew Booth and Kathleen Booth at Birkbeck, University of London officially came online on May 12, 1948. Presentaba el primer dispositivo de almacenamiento de tambor giratorio.
- El Manchester Baby fue el primer ordenador totalmente electrónico para ejecutar un programa almacenado. Dirigió un programa de factorización durante 52 minutos el 21 de junio de 1948, después de ejecutar un programa de división simple y un programa para demostrar que dos números eran relativamente primos.
- El ENIAC fue modificado para funcionar como un ordenador de programa almacenado de sólo lectura (utilizando las Tablas de Función para el programa ROM) y fue demostrado como tal el 16 de septiembre de 1948, ejecutando un programa de Adele Goldstine para von Neumann.
- El BINAC ejecutó algunos programas de prueba en febrero, marzo y abril de 1949, aunque no se completó hasta septiembre de 1949.
- El Manchester Mark 1 se desarrolló del proyecto Baby. Una versión intermedia de la Marca 1 estaba disponible para ejecutar programas en abril de 1949, pero no se completó hasta octubre de 1949.
- El EDSAC ejecutó su primer programa el 6 de mayo de 1949.
- El EDVAC fue entregado en agosto de 1949, pero tenía problemas que impedían que fuera puesto en operación regular hasta 1951.
- El CSIR Mk I dirigió su primer programa en noviembre de 1949.
- El SEAC fue demostrado en abril de 1950.
- El piloto ACE ejecutó su primer programa el 10 de mayo de 1950 y fue demostrado en diciembre de 1950.
- El SWAC se completó en julio de 1950.
- The Whirlwind was completed in December 1950 and was in actual use in April 1951.
- En diciembre de 1950 se instaló el primer ERA Atlas (más tarde el comercial ERA 1101/UNIVAC 1101).
Evolución
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:
- Proporcionar un caché entre la CPU y la memoria principal
- proporcionar caches separados o caminos de acceso separados para datos e instrucciones (la llamada arquitectura modificada de Harvard)
- usando algoritmos de predictor de rama y lógica
- proporcionar una pila CPU limitada u otra memoria de arañazo en chip para reducir el acceso a la memoria
- Implementar la CPU y la jerarquía de memoria como un sistema en chip, proporcionando mayor localidad de referencia y reduciendo así la latencia y aumentando el rendimiento entre los registros de procesadores y la memoria principal
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.
Contenido relacionado
ML
Proyección digital
PCA