Von-Neumann-Architektur

Aus besserwiki.de
Ein Schema der von-Neumann-Architektur

Die von-Neumann-Architektur - auch bekannt als von-Neumann-Modell oder Princeton-Architektur - ist eine Computerarchitektur, die auf einer Beschreibung von John von Neumann und anderen aus dem Jahr 1945 im First Draft of a Report on the EDVAC basiert. Das Dokument beschreibt eine Designarchitektur für einen elektronischen Digitalcomputer mit diesen Komponenten:

  • Eine Verarbeitungseinheit mit einer arithmetischen Logikeinheit und Prozessorregistern
  • Eine Steuereinheit, die ein Befehlsregister und einen Programmzähler enthält
  • Speicher, der Daten und Befehle speichert
  • Externer Massenspeicher
  • Ein- und Ausgabemechanismen

Der Begriff "von-Neumann-Architektur" hat sich entwickelt, um sich auf jeden Computer mit gespeicherten Programmen zu beziehen, bei dem ein Befehlsabruf und eine Datenoperation nicht gleichzeitig erfolgen können (da sie sich einen gemeinsamen Bus teilen). Dies wird als von-Neumann-Engpass bezeichnet, der oft die Leistung des entsprechenden Systems begrenzt.

Der Aufbau eines Rechners mit von-Neumann-Architektur ist einfacher als der eines Rechners mit Harvard-Architektur, der ebenfalls ein System mit gespeicherten Programmen ist, aber einen eigenen Satz von Adress- und Datenbussen zum Lesen und Schreiben in den Speicher und einen weiteren Satz von Adress- und Datenbussen zum Abrufen von Befehlen hat.

Ein speicherprogrammierter Digitalcomputer speichert sowohl Programmanweisungen als auch Daten in einem Schreib-Lese-Speicher (RAM) mit wahlfreiem Zugriff. Speicherprogrammierbare Computer waren ein Fortschritt gegenüber den programmgesteuerten Computern der 1940er Jahre, wie dem Colossus und dem ENIAC. Diese wurden programmiert, indem man Schalter umlegte und Verbindungskabel einsteckte, um Daten und Steuersignale zwischen den verschiedenen Funktionseinheiten zu übertragen. Die meisten modernen Computer verwenden denselben Speicher für Daten und Programmanweisungen, haben aber Caches zwischen der CPU und dem Speicher und für die Caches, die der CPU am nächsten sind, getrennte Caches für Anweisungen und Daten, so dass die meisten Befehls- und Datenabrufe getrennte Busse verwenden (Split-Cache-Architektur).

Modellrechenautomat (1958) mit Von-Neumann-Architektur in den Technischen Sammlungen Dresden

Die Von-Neumann-Architektur (VNA) ist ein Referenzmodell für Computer, wonach ein gemeinsamer Speicher sowohl Computerprogrammbefehle als auch Daten hält. Von-Neumann-Systeme gehören nach der Flynnschen Klassifikation zur Klasse der SISD-Architekturen (Single Instruction, Single Data), im Unterschied zur Parallelverarbeitung.

Eine oft in der Lehre vorgestellte Konkurrenzarchitektur ist die Harvard-Architektur.

Geschichte

Die frühesten Computer hatten feste Programme. Einige sehr einfache Computer verwenden immer noch dieses Design, entweder der Einfachheit halber oder zu Schulungszwecken. Ein Tischrechner zum Beispiel ist (im Prinzip) ein Computer mit festem Programm. Er kann grundlegende mathematische Berechnungen durchführen, aber er kann keine Textverarbeitung oder Spiele ausführen. Um das Programm eines Festprogrammrechners zu ändern, muss der Rechner neu verdrahtet, umstrukturiert oder umgestaltet werden. Die ersten Computer wurden nicht so sehr "programmiert", sondern für eine bestimmte Aufgabe "entworfen". Die "Neuprogrammierung" - sofern überhaupt möglich - war ein mühsamer Prozess, der mit Flussdiagrammen und Notizen auf Papier begann, gefolgt von detaillierten technischen Entwürfen und dann dem oft mühsamen Prozess der physischen Neuverdrahtung und des Umbaus der Maschine. Es konnte drei Wochen dauern, ein Programm auf dem ENIAC einzurichten und zu debuggen.

Mit dem Vorschlag des speicherprogrammierbaren Computers änderte sich dies. Ein speicherprogrammierter Computer verfügt von vornherein über einen Befehlssatz und kann im Speicher eine Reihe von Anweisungen (ein Programm) speichern, die die Berechnung im Detail beschreiben.

Ein speicherprogrammierter Computer ermöglicht auch die Selbstmodifikation des Codes. Eine frühe Motivation für eine solche Einrichtung war die Notwendigkeit, dass ein Programm den Adressteil von Befehlen inkrementieren oder anderweitig modifizieren musste, was bei früheren Entwürfen von den Bedienern manuell durchgeführt werden musste. Dies verlor an Bedeutung, als Indexregister und indirekte Adressierung zu üblichen Merkmalen der Maschinenarchitektur wurden. Eine weitere Anwendung war die Einbettung häufig verwendeter Daten in den Befehlsstrom unter Verwendung der unmittelbaren Adressierung. Selbstmodifizierender Code ist weitgehend in Ungnade gefallen, da er in der Regel schwer zu verstehen und zu debuggen ist und zudem unter modernen Prozessor-Pipelining- und Caching-Schemata ineffizient ist.

Fähigkeiten

Die Fähigkeit, Anweisungen als Daten zu behandeln, macht Assembler, Compiler, Linker, Lader und andere automatisierte Programmierwerkzeuge in großem Maßstab möglich. Sie macht "Programme, die Programme schreiben" möglich. Dies hat dazu geführt, dass rund um die von-Neumann-Architektur ein ausgeklügeltes Ökosystem für die selbstverwaltete Datenverarbeitung entstanden ist.

Einige Hochsprachen machen sich die von-Neumann-Architektur zunutze, indem sie eine abstrakte, maschinenunabhängige Möglichkeit bieten, ausführbaren Code zur Laufzeit zu manipulieren (z. B. LISP), oder indem sie Laufzeitinformationen nutzen, um die Just-in-Time-Kompilierung zu optimieren (z. B. Sprachen, die auf der virtuellen Java-Maschine gehostet werden, oder in Webbrowsern eingebettete Sprachen).

In kleinerem Maßstab können einige sich wiederholende Operationen wie BITBLT oder Pixel- und Vertex-Shader auf Mehrzweckprozessoren mit Just-in-Time-Kompilierungstechniken beschleunigt werden. Dies ist eine der Anwendungen von selbstmodifizierendem Code, die nach wie vor beliebt ist.

Entwicklung des Konzepts der gespeicherten Programme

Der Mathematiker Alan Turing, der durch die Vorlesungen von Max Newman an der Universität Cambridge auf ein Problem der mathematischen Logik aufmerksam geworden war, schrieb 1936 eine Arbeit mit dem Titel On Computable Numbers, with an Application to the Entscheidungsproblem, die in den Proceedings of the London Mathematical Society veröffentlicht wurde. Darin beschrieb er eine hypothetische Maschine, die er als universelle Rechenmaschine bezeichnete und die heute als "Universal Turing machine" bekannt ist. Die hypothetische Maschine verfügte über einen unendlichen Speicher (in der heutigen Terminologie: Memory), der sowohl Anweisungen als auch Daten enthielt. John von Neumann lernte Turing kennen, als er 1935 Gastprofessor in Cambridge war, und auch während Turings Promotionsjahr am Institute for Advanced Study in Princeton, New Jersey, in den Jahren 1936-1937. Ob er zu diesem Zeitpunkt von Turings Arbeit von 1936 wusste, ist nicht klar.

1936 nahm auch Konrad Zuse in zwei Patentanmeldungen vorweg, dass Maschinenbefehle in demselben Speicher wie Daten gespeichert werden könnten.

Unabhängig davon schrieben J. Presper Eckert und John Mauchly, die den ENIAC an der Moore School of Electrical Engineering der University of Pennsylvania entwickelten, im Dezember 1943 über das Konzept der gespeicherten Programme.

Bei der Planung einer neuen Maschine, EDVAC, schrieb Eckert im Januar 1944, dass sie Daten und Programme in einem neuen adressierbaren Speichergerät, einem Quecksilbermetall-Verzögerungsleitungsspeicher, speichern würden. Dies war das erste Mal, dass die Konstruktion einer praktischen Maschine mit gespeicherten Programmen vorgeschlagen wurde.  Zu dieser Zeit wussten er und Mauchly noch nichts von Turings Arbeit. 

Von Neumann war am Manhattan-Projekt des Los Alamos National Laboratory beteiligt. Es erforderte riesige Mengen an Berechnungen und zog ihn daher im Sommer 1944 zum ENIAC-Projekt. Dort beteiligte er sich an den laufenden Diskussionen über den Entwurf dieses speicherprogrammierbaren Computers, des EDVAC. Als Mitglied dieser Gruppe verfasste er eine Beschreibung mit dem Titel First Draft of a Report on the EDVAC, die auf den Arbeiten von Eckert und Mauchly basierte. Er war unvollendet, als sein Kollege Herman Goldstine ihn in Umlauf brachte, und trug nur von Neumanns Namen (zur Bestürzung von Eckert und Mauchly). Das Papier wurde von Dutzenden von Neumanns Kollegen in Amerika und Europa gelesen und beeinflusste die nächste Runde der Computerentwürfe.

Jack Copeland ist der Ansicht, dass es "historisch unangemessen ist, elektronische Digitalrechner mit gespeicherten Programmen als 'von-Neumann-Maschinen' zu bezeichnen". Sein Kollege in Los Alamos, Stan Frankel, sagte über von Neumanns Wertschätzung für Turings Ideen

Ich weiß, dass sich von Neumann etwa 1943 oder '44 der grundlegenden Bedeutung von Turings Arbeit von 1936.... bewusst war. Von Neumann machte mich mit dieser Arbeit bekannt, und auf sein Drängen hin studierte ich sie mit Sorgfalt. Viele Leute haben von Neumann als den "Vater des Computers" (im modernen Sinne des Wortes) gefeiert, aber ich bin sicher, dass er selbst diesen Fehler nie gemacht hätte. Man könnte ihn vielleicht als Hebamme bezeichnen, aber er hat mir und sicher auch anderen gegenüber nachdrücklich betont, dass die grundlegende Konzeption Turing zu verdanken ist - soweit sie nicht von Babbage vorweggenommen wurde.... Sowohl Turing als auch von Neumann haben natürlich auch wesentliche Beiträge zur "praktischen Umsetzung" dieser Konzepte geleistet, aber ich würde diese nicht als vergleichbar wichtig mit der Einführung und Erläuterung des Konzepts eines Computers ansehen, der in der Lage ist, sein Tätigkeitsprogramm in seinem Speicher zu speichern und dieses Programm im Laufe dieser Tätigkeiten zu ändern.

Zu der Zeit, als der "First Draft"-Bericht in Umlauf gebracht wurde, arbeitete Turing an einem Bericht mit dem Titel Proposed Electronic Calculator. Darin beschrieb er seine Idee einer Maschine, die er Automatic Computing Engine (ACE) nannte, in allen technischen und programmtechnischen Einzelheiten. Er stellte diesen Bericht am 19. Februar 1946 dem Exekutivausschuss des britischen National Physical Laboratory vor. Obwohl Turing aufgrund seiner Kriegserfahrungen in Bletchley Park wusste, dass das, was er vorschlug, machbar war, hinderte ihn die jahrzehntelange Geheimhaltung von Colossus daran, dies zu sagen. Verschiedene erfolgreiche Implementierungen des ACE-Entwurfs wurden produziert.

Sowohl von Neumanns als auch Turings Arbeiten beschrieben Computer mit gespeicherten Programmen, aber von Neumanns frühere Arbeit erreichte eine größere Verbreitung und die darin beschriebene Computerarchitektur wurde als "von Neumann-Architektur" bekannt. In der 1953 erschienenen Publikation Faster than Thought: A Symposium on Digital Computing Machines (herausgegeben von B. V. Bowden) lautet ein Abschnitt im Kapitel über Computer in Amerika wie folgt:

Die Maschine des Institute For Advanced Studies, Princeton

1945 gab Professor J. von Neumann, der damals an der Moore School of Engineering in Philadelphia arbeitete, wo der E.N.I.A.C. gebaut worden war, im Namen einer Gruppe von Mitarbeitern einen Bericht über den logischen Aufbau von Digitalrechnern heraus. Der Bericht enthielt einen detaillierten Vorschlag für den Entwurf der Maschine, die seitdem als E.D.V.A.C. (electronic discrete variable automatic computer) bekannt geworden ist. Diese Maschine wurde erst kürzlich in Amerika fertiggestellt, aber der von Neumann-Bericht inspirierte den Bau des E.D.S.A.C. (electronic delay-storage automatic calculator) in Cambridge (siehe Seite 130).

1947 veröffentlichten Burks, Goldstine und von Neumann einen weiteren Bericht, in dem sie den Entwurf einer anderen Art von Maschine (diesmal einer Parallelmaschine) skizzierten, die außerordentlich schnell sein sollte und vielleicht 20.000 Operationen pro Sekunde ausführen konnte. Sie wiesen darauf hin, dass das herausragende Problem beim Bau einer solchen Maschine die Entwicklung eines geeigneten Speichers mit sofortigem Zugriff auf den Inhalt sei. Zunächst schlugen sie vor, eine spezielle Vakuumröhre, das so genannte "Selectron", zu verwenden, das in den Princeton Laboratories von RCA erfunden worden war. Da diese Röhren teuer und schwierig herzustellen waren, beschloss von Neumann, eine Maschine auf der Grundlage des Williams-Speichers zu bauen. Diese Maschine, die im Juni 1952 in Princeton fertiggestellt wurde, ist im Volksmund als Maniac bekannt geworden. Das Design dieser Maschine inspirierte mindestens ein halbes Dutzend Maschinen, die heute in Amerika gebaut werden und alle liebevoll "Johniacs" genannt werden.

In demselben Buch lauten die ersten beiden Absätze eines Kapitels über ACE wie folgt:

Automatisches Rechnen im National Physical Laboratory

Einer der modernsten Digitalcomputer, der Entwicklungen und Verbesserungen in der Technik des automatischen elektronischen Rechnens verkörpert, wurde kürzlich im National Physical Laboratory, Teddington, vorgeführt, wo er von einem kleinen Team von Mathematikern und Elektronik-Forschungsingenieuren aus dem Personal des Labors, unterstützt von einer Reihe von Produktionsingenieuren der English Electric Company, Limited, entworfen und gebaut wurde. Die bisher im Laboratorium errichtete Anlage ist nur das Pilotmodell einer viel größeren Installation, die als "Automatic Computing Engine" bekannt sein wird. Obwohl sie vergleichsweise klein ist und nur etwa 800 thermionische Ventile enthält, wie aus den Tafeln XII, XIII und XIV ersichtlich ist, ist sie eine äußerst schnelle und vielseitige Rechenmaschine.

Die grundlegenden Konzepte und abstrakten Prinzipien des maschinellen Rechnens wurden von Dr. A. M. Turing, F.R.S., in einem Vortrag1. vor der London Mathematical Society im Jahre 1936 formuliert, aber die Arbeit an solchen Maschinen in Großbritannien wurde durch den Krieg verzögert. Im Jahr 1945 wurde jedoch im National Physical Laboratory von J. R. Womersley, dem damaligen Leiter der mathematischen Abteilung des Labors, eine Untersuchung der Probleme durchgeführt. Ihm schlossen sich Dr. Turing und ein kleiner Stab von Spezialisten an, und 1947 waren die Vorplanungen so weit fortgeschritten, dass die Einrichtung der bereits erwähnten Sondergruppe gerechtfertigt war. Im April 1948 wurde letztere zur Elektronikabteilung des Laboratoriums, die von F. M. Colebrook geleitet wurde.

Von Neumann beschrieb das Konzept 1945 in dem zunächst unveröffentlichten Papier „First Draft of a Report on the EDVAC“ im Rahmen des Baus der EDVAC-Rechenmaschine. Es war seinerzeit revolutionär, denn zuvor entwickelte Rechner waren an ein festes Programm gebunden, das entweder hardwaremäßig verschaltet war oder über Lochkarten eingelesen werden musste. Mit der Von-Neumann-Architektur war es nun möglich, Änderungen an Programmen sehr schnell und ohne Änderungen an der Hardware durchzuführen oder in kurzer Folge verschiedene Programme ablaufen zu lassen.

Die meisten der heute gebräuchlichen Computer basieren auf dem Grundprinzip der Von-Neumann-Architektur, d. h. ihre Eigenschaften entsprechen denen einer VNA. Dies bedeutet jedoch typischerweise nicht mehr, dass sie intern wie eine einfache VNA mit den wenigen VNA-Funktionsgruppen aufgebaut sind. Im Laufe der Zeit wurden viele der ursprünglich als einfache VNA-Rechnerarchitekturen erdachten, z. B. die x86-Architektur, jenseits davon ausdifferenziert und weitaus komplexer weiterentwickelt. Dies geschah, um Leistungszuwächse zu erzielen, ohne jedoch mit dem leicht beherrschbaren VNA-Modell zu brechen, d. h. aus Softwaresicht kompatibel zu diesem zu bleiben, um dessen Vorteile weiter nutzen zu können.

Mit dem Trend der wachsenden Zahl von parallelen Recheneinheiten (Multicore) und Bussen (z. B. HyperTransport) wird diese Kompatibilität immer aufwendiger und schwieriger zu realisieren. Es ist daher zu erwarten, dass in absehbarer Zukunft ein Paradigmenwechsel zu einem anderen, parallelen Architekturmodell notwendig sein wird, um Leistungszuwächse in Rechnerarchitekturen erzielen zu können. Erste Vorboten sind zum Beispiel das aufkommende NUMA-Computing, bei dem der Speicher nicht mehr als mit „uniformen“-Eigenschaften behaftet betrachtet wird.

Frühe Computer mit von-Neumann-Architektur

Der erste Entwurf beschrieb ein Design, das von vielen Universitäten und Unternehmen für den Bau ihrer Computer verwendet wurde. Von diesen verschiedenen Computern hatten nur ILLIAC und ORDVAC kompatible Befehlssätze.

  • ARC2 (Birkbeck, University of London) wurde am 12. Mai 1948 offiziell in Betrieb genommen.
  • Manchester Baby (Victoria University of Manchester, England) führte am 21. Juni 1948 zum ersten Mal erfolgreich ein gespeichertes Programm aus.
  • EDSAC (University of Cambridge, England) war der erste praktische elektronische Computer mit gespeicherten Programmen (Mai 1949)
  • Manchester Mark 1 (University of Manchester, England) Entwickelt aus dem Baby (Juni 1949)
  • CSIRAC (Rat für wissenschaftliche und industrielle Forschung) Australien (November 1949)
  • MESM in Kiew, Ukraine (November 1950)
  • EDVAC (Ballistisches Forschungslabor, Rechenlabor auf dem Aberdeen Proving Ground 1951)
  • ORDVAC (U-Illinois) auf dem Aberdeen Proving Ground, Maryland (abgeschlossen November 1951)
  • IAS-Maschine an der Universität Princeton (Januar 1952)
  • MANIAC I im Wissenschaftlichen Laboratorium von Los Alamos (März 1952)
  • ILLIAC an der Universität von Illinois, (September 1952)
  • BESM-1 in Moskau (1952)
  • AVIDAC im Argonne National Laboratory (1953)
  • ORACLE im Oak Ridge National Laboratory (Juni 1953)
  • BESK in Stockholm (1953)
  • JOHNNIAC bei der RAND Corporation (Januar 1954)
  • DASK in Dänemark (1955)
  • WEIZAC am Weizmann-Institut für Wissenschaft in Rehovot, Israel (1955)
  • PERM in München (1956)
  • SILLIAC in Sydney (1956)

Frühe speicherprogrammierbare Computer

Die Datumsangaben in der folgenden Chronologie lassen sich nur schwer in die richtige Reihenfolge bringen. Einige Daten beziehen sich auf die erste Ausführung eines Testprogramms, einige auf die erste Vorführung oder Fertigstellung des Computers und einige auf die erste Lieferung oder Installation.

  • Der IBM SSEC war in der Lage, Anweisungen als Daten zu behandeln, und wurde am 27. Januar 1948 öffentlich vorgeführt. Diese Fähigkeit wurde in einem US-Patent beansprucht. Allerdings war es teilweise elektromechanisch, nicht vollständig elektronisch. In der Praxis wurden die Anweisungen aufgrund des begrenzten Speichers von einem Papierband gelesen.
  • Der von Andrew Booth und Kathleen Booth an der Birkbeck University of London entwickelte ARC2 wurde am 12. Mai 1948 offiziell in Betrieb genommen. Er verfügte über den ersten rotierenden Trommelspeicher.
  • Das Manchester Baby war der erste vollelektronische Computer, der ein gespeichertes Programm ausführte. Er führte am 21. Juni 1948 52 Minuten lang ein Faktorisierungsprogramm aus, nachdem er ein einfaches Divisionsprogramm und ein Programm zum Nachweis der relativen Primzahl zweier Zahlen ausgeführt hatte.
  • Der ENIAC wurde so modifiziert, dass er als primitiver Nur-Lese-Computer mit gespeicherten Programmen lief (unter Verwendung der Funktionstabellen als Programm-ROM) und wurde als solcher am 16. September 1948 vorgeführt, wobei ein Programm von Adele Goldstine für von Neumann lief.
  • Der BINAC führte im Februar, März und April 1949 einige Testprogramme aus, wurde jedoch erst im September 1949 fertiggestellt.
  • Der Manchester Mark 1 entwickelte sich aus dem Baby-Projekt. Eine Zwischenversion des Mark 1 stand im April 1949 für die Durchführung von Programmen zur Verfügung, wurde aber erst im Oktober 1949 fertiggestellt.
  • Das EDSAC führte sein erstes Programm am 6. Mai 1949 durch.
  • Das EDVAC wurde im August 1949 ausgeliefert, konnte aber aufgrund von Problemen erst 1951 in Betrieb genommen werden.
  • Das CSIR Mk I führte sein erstes Programm im November 1949 durch.
  • Der SEAC wurde im April 1950 vorgeführt.
  • Der Pilot ACE absolvierte sein erstes Programm am 10. Mai 1950 und wurde im Dezember 1950 vorgeführt.
  • Der SWAC wurde im Juli 1950 fertiggestellt.
  • Der Whirlwind wurde im Dezember 1950 fertiggestellt und war im April 1951 im Einsatz.
  • Der erste ERA Atlas (später der kommerzielle ERA 1101/UNIVAC 1101) wurde im Dezember 1950 installiert.

Entwicklung

Entwicklung der Architektur des Einzelsystembusses

Im Laufe der 1960er und 1970er Jahre wurden die Computer im Allgemeinen sowohl kleiner als auch schneller, was zu einer Weiterentwicklung ihrer Architektur führte. Mit der speicherabbildenden E/A können Ein- und Ausgabegeräte mit dem Speicher gleichgesetzt werden. Ein einziger Systembus konnte verwendet werden, um ein modulares System mit geringeren Kosten bereitzustellen. Dies wird manchmal als "Verschlankung" der Architektur bezeichnet. In den folgenden Jahrzehnten wurden bei einfachen Mikrocontrollern manchmal Funktionen des Modells weggelassen, um Kosten und Größe zu senken. Größere Computer fügten Funktionen für eine höhere Leistung hinzu.

Konstruktionsbedingte Einschränkungen

Von-Neumann-Engpass

Der gemeinsame Bus zwischen dem Programmspeicher und dem Datenspeicher führt zum Von-Neumann-Engpass, dem begrenzten Durchsatz (Datenübertragungsrate) zwischen der Zentraleinheit (CPU) und dem Speicher im Vergleich zur Speichergröße. Da der einzelne Bus jeweils nur auf eine der beiden Speicherklassen zugreifen kann, ist der Durchsatz geringer als die Rate, mit der die CPU arbeiten kann. Dies schränkt die effektive Verarbeitungsgeschwindigkeit erheblich ein, wenn die CPU eine minimale Verarbeitung großer Datenmengen durchführen muss. Die CPU ist ständig gezwungen, darauf zu warten, dass benötigte Daten in den oder aus dem Speicher übertragen werden. Da die CPU-Geschwindigkeit und die Speichergröße viel schneller gestiegen sind als der Durchsatz zwischen ihnen, ist der Engpass zu einem größeren Problem geworden, ein Problem, das mit jeder neuen CPU-Generation an Schwere zunimmt.

Der von-Neumann-Engpass wurde von John Backus in seinem Vortrag zum ACM Turing Award 1977 beschrieben. Laut Backus:

Sicherlich muss es einen weniger primitiven Weg geben, um große Änderungen im Speicher vorzunehmen, als Unmengen von Wörtern durch den von-Neumann-Engpass hin und her zu schieben. Diese Röhre ist nicht nur ein buchstäblicher Engpaß für den Datenverkehr eines Problems, sondern, was noch wichtiger ist, ein intellektueller Engpaß, der uns an ein wortweises Denken gefesselt hat, anstatt uns zu ermutigen, in größeren konzeptionellen Einheiten der anstehenden Aufgabe zu denken. Programmieren heißt also im Grunde, den enormen Wortverkehr durch den von-Neumann-Engpass zu planen und im Detail zu beschreiben, und ein Großteil dieses Verkehrs betrifft nicht die Daten selbst, sondern die Frage, wo sie zu finden sind.

Abhilfemaßnahmen

Es gibt mehrere bekannte Methoden zur Abschwächung des Von-Neumann-Leistungsengpasses. Zum Beispiel können die folgenden Methoden die Leistung verbessern:

  • Bereitstellung eines Caches zwischen der CPU und dem Hauptspeicher
  • Bereitstellung getrennter Caches oder getrennter Zugriffspfade für Daten und Anweisungen (die so genannte modifizierte Harvard-Architektur)
  • Verwendung von Verzweigungsvorhersagealgorithmen und -logik
  • Bereitstellung eines begrenzten CPU-Stacks oder eines anderen On-Chip-Scratchpad-Speichers, um den Speicherzugriff zu reduzieren
  • Implementierung der CPU und der Speicherhierarchie als ein System auf dem Chip, das eine größere Lokalität der Referenz bietet und somit die Latenzzeit verringert und den Durchsatz zwischen Prozessorregistern und Hauptspeicher erhöht

Das Problem kann auch durch parallele Datenverarbeitung umgangen werden, z. B. durch die NUMA-Architektur (Non-Uniform Memory Access), die häufig bei Supercomputern eingesetzt wird. Es ist weniger klar, ob sich der von Backus kritisierte intellektuelle Engpass seit 1977 stark verändert hat. Die von Backus vorgeschlagene Lösung hat keinen großen Einfluss gehabt. Die moderne funktionale Programmierung und die objektorientierte Programmierung sind viel weniger auf das "Hin- und Herschieben einer großen Anzahl von Wörtern" ausgerichtet als frühere Sprachen wie FORTRAN, aber intern verbringen Computer immer noch einen Großteil ihrer Zeit damit, selbst hochparallele Supercomputer.

Eine Datenbank-Benchmark-Studie aus dem Jahr 1996 ergab, dass drei von vier CPU-Zyklen damit verbracht wurden, auf Speicher zu warten. Forscher erwarten, dass die Erhöhung der Anzahl gleichzeitiger Befehlsströme durch Multithreading oder Single-Chip-Multiprocessing diesen Engpass noch verschärfen wird. Bei Multi-Core-Prozessoren ist zusätzlicher Aufwand erforderlich, um die Cache-Kohärenz zwischen Prozessoren und Threads aufrechtzuerhalten.

Selbstmodifizierender Code

Abgesehen von dem von-Neumann-Engpass können Programmänderungen sehr schädlich sein, entweder versehentlich oder absichtlich. In einigen einfachen Computerdesigns mit gespeicherten Programmen kann ein fehlerhaftes Programm sich selbst, andere Programme oder das Betriebssystem beschädigen, was möglicherweise zu einem Computerabsturz führt. Speicherschutz und andere Formen der Zugriffskontrolle können in der Regel sowohl vor versehentlichen als auch vor böswilligen Programmänderungen schützen.

Konzept

Die Von-Neumann-Architektur ist ein Schaltungskonzept zur Realisierung universeller Rechner (Von-Neumann-Rechner, VNR). Sie realisiert alle Komponenten einer Turingmaschine. Dabei ermöglicht ihre systematische Aufteilung in die entsprechenden Funktionsgruppen jedoch die Nutzung spezialisierter binärer Schaltwerke und damit eine effizientere Strukturierung der Operationen.

Im Prinzip bleibt es aber dabei, dass alles, was mit einer Turingmaschine berechenbar ist, auch auf einer Maschine mit Von-Neumann-Architektur berechenbar ist und umgekehrt. Gleiches gilt für alle höheren Programmiersprachen, die durch einen Compiler oder Interpreter auf die binäre Repräsentation abgebildet werden. Sie vereinfachen zwar das Handling der Operationen, bieten jedoch keine Erweiterung der von der Turingmaschine vorgegebenen Semantik. Dies wird daran deutlich, dass die Übersetzung aus einer höheren Programmiersprache in die binäre Repräsentation wiederum von einem binären Programm ohne Anwenderinteraktion vorgenommen wird.

Komponenten

Komponenten eines Von-Neumann-Rechners
Schematischer Aufbau eines Von-Neumann-Rechners mit dem zugehörigen Bussystem

Ein Von-Neumann-Rechner beruht auf folgenden Komponenten, die bis heute in Computern verwendet werden:

ALU (Arithmetic Logic Unit) Rechenwerk
selten auch Zentraleinheit oder Prozessor genannt, führt Rechenoperationen und boolesche Verknüpfungen aus. (Die Begriffe Zentraleinheit und Prozessor werden im Allgemeinen in anderer Bedeutung verwendet.)
Control Unit Steuerwerk oder Leitwerk
interpretiert die Anweisungen eines Programms und verschaltet dementsprechend Datenquelle, -senke und notwendige ALU-Komponenten; das Steuerwerk regelt auch die Befehlsabfolge.
BUS Bus System
dient zur Kommunikation zwischen den einzelnen Komponenten (Steuerbus, Adressbus, Datenbus)
Memory – (RAM/Arbeitsspeicher) Speicherwerk
speichert sowohl Programme als auch Daten, welche für das Rechenwerk zugänglich sind.
I/O Unit – Eingabe-/Ausgabewerk
steuert die Ein- und Ausgabe von Daten, zum Anwender (Tastatur, Bildschirm) oder zu anderen Systemen (Schnittstellen).

Prinzipien des Modells

Diese Komponenten arbeiten Programmbefehle nach folgenden Regeln ab.

  • Prinzipien des gespeicherten Programms:
    • Befehle werden geladen und Steuersignale an andere Funktionseinheiten gesendet
    • Befehle sind in einem RAM-Speicher mit linearem (1-dimensionalem) Adressraum abgelegt.
    • Ein Befehls-Adressregister, genannt Befehlszähler oder Programmzähler, zeigt auf den nächsten auszuführenden Befehl.
    • Befehle können wie Daten geändert werden.
  • Prinzipien der sequentiellen Programm-Ausführung (siehe auch Von-Neumann-Zyklus):
    • Befehle werden aus einer Zelle des Speichers gelesen und dann ausgeführt.
    • Normalerweise wird dann der Inhalt des Befehlszählers um Eins erhöht.
    • Es gibt einen oder mehrere Sprung-Befehle, die den Inhalt des Befehlszählers um einen anderen Wert als +1 verändern.
    • Es gibt einen oder mehrere Verzweigungs-Befehle, die in Abhängigkeit vom Wert eines Entscheidungs-Bit den Befehlszähler um Eins erhöhen oder einen Sprung-Befehl ausführen.

Eigenschaften

Vorteile

Der streng sequentielle Ablauf einer Von-Neumann-Architektur ist der entscheidende Vorteil gegenüber anderen, parallelen Architekturen (z. B. Rechnerverbund, Harvard-Architektur) und der Grund für die ungebrochene Popularität dieser Architektur. Aus der Sicht des Programmierers ist ein einfacher, deterministischer Programmablauf garantiert, Race Conditions und Daten-Inkohärenzen sind durch den einzelnen Bus, über den die CPU auf Daten und Programm zugreift, ausgeschlossen.

Von-Neumann-Flaschenhals

Von Neumann

Die Von-Neumann-Architektur erlaubt das Lesen eines Befehlscode-Worts oder das Lesen eines Datenworts oder das Schreiben eines Datenwortes. Befehlscode-Lesen und Daten-Lesen und -Schreiben konkurrieren.

Harvard

Die Standard-Harvard-Architektur erlaubt das gleichzeitige Lesen eines Befehlscode-Worts und das Lesen oder Schreiben eines Datenworts. Das erlaubt eine gewisse Parallelisierung der Befehlscode-Abarbeitung. Befehle aus mehreren Worten wie auch Read-Modify-Write-Zugriffe auf Daten verhindern allerdings auch hier, dass Befehle innerhalb eines Speicherzyklus abgearbeitet werden können. Befehle ohne Datenspeicher-Zugriffe werden gegenüber einer Von-Neumann-Architektur nicht beschleunigt.

          CPU-Kern
          ^      ^
          |      v
      RAM-Ctrl RAM-Ctrl

Eine klassische Standard-Harvard-Architektur mit strikter Trennung von Befehls- und Datenbus ist außer in Spezialfällen unüblich. Es wären nur fertige Programme in nichtflüchtigen Speicher ausführbar. Nachladen von Programmen, Programme kompilieren und ausführen sind nicht möglich.

Super-Harvard

Die Super-Harvard-Architekturen findet man häufig in DSPs, die zwei oder vier Bussysteme haben. Beispiele sind Motorola 56001 und Texas Instruments TMS320.

           CPU-Kern
       ^      ^      ^
       |      v      v
 RAM-Ctrl RAM-Ctrl RAM-Ctrl

Üblich ist auch eine Aufweichung der Trennung der Bussysteme. Jeder Bus kann sowohl Code wie Daten liefern. Kollisionen vermindern die Performance. Neben Befehlsabarbeitungen durch den CPU-Kern sind weitere Speicherzugriffe durch DMA-Controller und Video-Controller üblich.

        CPU-Kern + Dma-Ctrl
       ^      ^      ^      ^
       v      v      v      v
RAM-Ctrl RAM-Ctrl RAM-Ctrl RAM-Ctrl 

1993

CPU Kern

      zwei Rechenwerke
       ^          ^
       |          v
      L1I        L1D
       |          |
       +-----+----+
      RAM-Controller 

1997

CPU Kern

    mehrere Rechenwerke
       ^         ^ |
       |         | v
      L1I        L1D
       |          |
       +-----+----+
             L2
             |
       RAM-Controller 

2008

CPU Kern 1 CPU Kern 2 CPU Kern 3 ... CPU Kern N

 mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke
  ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |
  |        | | v         |        | | v         |        | | v         |        | | v
 L1I        L1D         L1I        L1D         L1I        L1D         L1I        L1D
  |          |           |          |           |          |           |          |
  +----L2----+           +----L2----+           +----L2----+           +----L2----+
       |                      |                      |                      |
  +----L3---------------------L3---------------------L3---------------------L3-----+
  |                                                                                |
  +--------------------------------------+-----------------------------------------+
                                    RAM-Controller 

Dual-Sockel-Server-System

Sockel 1 Sockel 2

     CPU Kern 1             CPU Kern 2             CPU Kern 3     ...     CPU Kern N                 CPU Kern 1             CPU Kern 2             CPU Kern 3     ...     CPU Kern N
 mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke         mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke    mehrere Rechenwerke
  ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |             ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |         ^        ^ ^ |
  |        | | v         |        | | v         |        | | v         |        | | v             |        | | v         |        | | v         |        | | v         |        | | v
 L1I        L1D         L1I        L1D         L1I        L1D         L1I        L1D             L1I        L1D         L1I        L1D         L1I        L1D         L1I        L1D
  |          |           |          |           |          |           |          |               |          |           |          |           |          |           |          |
  +----L2----+           +----L2----+           +----L2----+           +----L2----+               +----L2----+           +----L2----+           +----L2----+           +----L2----+
       |                      |                      |                      |                          |                      |                      |                      |
  +----L3---------------------L3---------------------L3---------------------L3-----+              +----L3---------------------L3---------------------L3---------------------L3-----+
  |                                                                                +--------------+                                                                                |
  +--------------------------------------+-----------------------------------------+              +---------------------------------------+----------------------------------------+
                                    RAM-Controller                                                                                   RAM-Controller 

Vergleich zur Harvard-Architektur

Eine der wichtigsten Konkurrenzarchitekturen ist die Harvard-Architektur mit einer physischen Separierung von Befehls- und Datenspeicher, auf die über getrennte Busse zugegriffen wird, also unabhängig und parallel. Der Vorteil dieser Architektur besteht darin, dass Befehle und Daten gleichzeitig geladen bzw. geschrieben werden können, also der Von-Neumann-Flaschenhals umgangen werden kann.

Die physikalische Trennung von Daten und Programm sorgt dafür, dass eine Zugriffsrechtetrennung und Speicherschutz einfach realisierbar sind. Wurde für den Programmcode ein im Betrieb nur lesbarer Speicher verwendet, so ist das Überschreiben selbst durch Schadcode ausgeschlossen. Nachteilig ist allerdings, dass nicht benötigter Datenspeicher nicht als Programmspeicher genutzt werden kann (und umgekehrt), also eine erhöhte Speicherfragmentierung auftritt.