Von-Neumann-Architektur

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von Von-Neumann-Flaschenhals)
Zur Navigation springen Zur Suche springen
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.

Die Von-Neumann-Architektur bildet die Grundlage für die Arbeitsweise der meisten heute bekannten Computer. Sie ist benannt nach dem österreichisch-ungarischen, später in den USA tätigen Mathematiker John von Neumann, dessen wesentliche Arbeit zum Thema 1945 veröffentlicht wurde.[1] Sie wird manchmal auch Princeton-Architektur genannt (nach der Princeton University).

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

Von Neumann beschrieb das Konzept 1945 in dem zunächst unveröffentlichten Papier „First Draft of a Report on the EDVAC[2] 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.

Viele Ideen der Von-Neumann-Architektur waren schon 1936 von Konrad Zuse ausgearbeitet, in zwei Patentschriften 1937 dokumentiert und größtenteils bereits 1938 in der Z1-Maschine mechanisch realisiert worden. 1941 baute Konrad Zuse in Zusammenarbeit mit Helmut Schreyer mit der Zuse Z3 den ersten funktionsfähigen Digitalrechner der Welt. Es gilt aber als unwahrscheinlich, dass von Neumann die Arbeiten Zuses kannte, als er 1945 seine Architektur vorstellte.

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.

Die Von-Neumann-Architektur ist ein Schaltungskonzept zur Realisierung universeller Rechner (Von-Neumann-Rechner, VNR). Sie realisiert alle Komponenten einer Turingmaschine, abgesehen von dem unbegrenzten Speicher, der technisch nicht realisierbar ist. 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 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 UnitSteuerwerk oder Leitwerk
interpretiert die Anweisungen eines Programms und verschaltet dementsprechend Datenquelle, -senke und notwendige ALU-Komponenten; das Steuerwerk regelt auch die Befehlsabfolge.
BUSBus 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 UnitEingabe-/Ausgabewerk
steuert die Ein- und Ausgabe von Daten, zum Anwender (Tastatur, Bildschirm) oder zu anderen Systemen (Schnittstellen).

Prinzipien des Modells

[Bearbeiten | Quelltext bearbeiten]

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.

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. Da Programme und Daten denselben Speicher verwenden, ist die Von-Neumann-Architektur flexibel in Bezug auf die Speichernutzung. Der Speicher kann dynamisch zwischen Programminstruktionen und Daten aufgeteilt werden, was es einfach macht, Programme zu laden, auszuführen und zu aktualisieren.

Von-Neumann-Flaschenhals

[Bearbeiten | Quelltext bearbeiten]

Der Von-Neumann-Flaschenhals der Von-Neumann-Architektur beschreibt Performance-Verringerungen von Prozessoren durch konkurrierende Daten- und Befehlscode-Zugriffe über einen gemeinsamen Bus. Weitergehend beschreibt der Von-Neumann-Flaschenhals auch das für diesen Sachverhalt verantwortliche Konzept des „immer nur eine Sache auf einmal“ (eng. Original: one-word-at-a-time thinking), also den expliziten, erzwungenen Sequentialismus durch den einzigen Bus, über den alle Aktionen laufen.

Der Begriff selbst, „Von-Neumann-Flaschenhals“ (eng. Von Neumann bottleneck), wurde von John W. Backus geprägt, der ihn 1977 in seinem Vortrag anlässlich der Verleihung des Turing Awards einführte:[3]

“Surely there must be a less primitive way of making big changes in the store than by pushing vast numbers of words back and forth through the von Neumann bottleneck. Not only is this tube a literal bottleneck for the data traffic of a problem, but, more importantly, it is an intellectual bottleneck that has kept us tied to one word-at-a-time thinking instead of encouraging us to think in terms of the larger conceptual units of the task at hand. Thus programming is basically planning and detailing the enormous traffic of words through the von Neumann bottleneck, and much of that traffic concerns not significant data itself, but where to find it.”

„Sicherlich muss es einen weniger primitiven Weg geben, große Änderungen im Speicher vorzunehmen, als riesige Mengen von Wörtern durch den Von-Neumann-Flaschenhals hin und her zu drücken. Nicht nur ist diese Röhre ein buchstäblicher Flaschenhals für den Datenverkehr eines Problems, sondern, viel wichtiger, es ist ein intellektueller Flaschenhals, der uns an Ein-Wort-zu-einer-Zeit-Denken fesselte, anstatt uns zu ermutigen, in größeren konzeptionellen Einheiten der anstehenden Aufgabe zu denken. Folglich ist Programmieren grundsätzlich die Planung und die Detaillierung des enormen Verkehrs von Wörtern durch den Von-Neumann-Flaschenhals und ein Großteil jenes Verkehrs betrifft nicht diese Daten selbst, sondern wo was zu finden ist.“

Mit dem Aufkommen von getrennten Caches für Daten und Befehle ist der Von-Neumann-Flaschenhals ein akademisches Problem geworden. In modernen Prozessoren ist die Entkopplung von Speicher und Rechenwerken über mehrere Cache-Hierarchien so weit fortgeschritten, dass unzählige Befehlsdecoder und Rechenwerke sich die Ressource Hauptspeicher ohne große Performance-Verluste teilen.

Die Unterschiede zwischen der Von-Neumann-Architektur und der Harvard-Architektur

[Bearbeiten | Quelltext bearbeiten]

Von-Neumann-Architektur: In der Von-Neumann-Architektur teilen sich Programme und Daten denselben Speicher und denselben Datenbus. Dies bedeutet, dass sowohl Befehle als auch Daten über denselben Datenpfad zwischen Prozessor und Speicher übertragen werden. Dies bietet eine flexible Nutzung des Speichers, ermöglicht jedoch nur eine sequenzielle Ausführung von Befehlen.

Harvard-Architektur: Im Gegensatz dazu verwendet die Harvard-Architektur getrennte Speicherbereiche und Datenpfade für Programme und Daten. Es gibt separate Speicherbereiche für Programminstruktionen und Daten, auf die unabhängig voneinander zugegriffen werden kann. Dies ermöglicht eine parallele Ausführung von Instruktionen und Datenzugriffen, was potenziell die Leistung verbessert.

          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üchtigem Speicher ausführbar. Das Nachladen von Programmen sowie das dynamische Kompilieren und Ausführen von Programmen sind nicht möglich.

Die Super-Harvard-Architekturen findet man häufig in DSPs (Digitalen Signalprozessoren), 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
          CPU-Kern
      zwei Rechenwerke
       ^          ^
       |          v
      L1I        L1D
       |          |
       +-----+----+
      RAM-Controller
          CPU-Kern
    mehrere Rechenwerke
       ^         ^ |
       |         | v
      L1I        L1D
       |          |
       +-----+----+
             L2
             |
       RAM-Controller
     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

[Bearbeiten | Quelltext bearbeiten]
                                        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

Da bei einer Von-Neumann-Architektur im Gegensatz zur Harvard-Architektur nur ein gemeinsamer Bus für Daten und Befehle genutzt wird, müssen sich diese die maximal übertragbare Datenmenge aufteilen. Bei frühen Computern stellte die CPU die langsamste Einheit des Rechners dar, d. h., die Datenbereitstellungszeit war nur ein geringer Anteil an der gesamten Verarbeitungszeit für eine Rechenoperation. Seit geraumer Zeit jedoch wuchs die CPU-Verarbeitungsgeschwindigkeit deutlich stärker als die Datentransferraten der Busse oder der Speicher, was den Einfluss des Von-Neumann-Flaschenhalses verschärft. Der Begriff der „memory wall“ bezeichnet dieses wachsende Ungleichgewicht zwischen der Geschwindigkeit der CPU und des Speichers außerhalb des CPU-Chips.

Von 1986 bis 2000 wuchsen die CPU-Geschwindigkeiten jährlich um 55 %, während die Speichertransfergeschwindigkeiten nur um 10 % anstiegen. Diesem Trend folgend wurde die Speicherlatenz der Flaschenhals der Computerrechenleistung.[4] Als erste Maßnahme wurden schon früh Datenregister eingeführt. Heute nimmt bei leistungsstarken Prozessoren ein dreistufiger Cache etwa die Hälfte der Chipfläche ein und führt die allermeisten Lade- und Schreibbefehle aus, ohne dass der Hauptspeicher zunächst beteiligt ist.

  • Johnny-Simulator, eine Software-Implementierung eines Von-Neumann-Rechners mit zehn vordefinierten Befehlen
  1. Gerard O’Regan: A Brief History of Computing. 2. Auflage. Springer Verlag, 2012, ISBN 978-1-4471-2358-3, S. 196.
  2. John von Neumann: First Draft of a Report on the EDVAC. In: IEEE Annals of the History of Computing. Vol. 15, Issue 4, 1993, doi:10.1109/85.238389, S. 27–75 (PDF, 9,556 MB)
  3. John Backus: Can Programming Be Liberated from the von Neumann Style? A Functional Style and Its Algebra of Programs. In: Communications of the ACM. Vol. 21, No. 8, August 1978, S. 615 (PDF, 3,0 MB)
  4. William A. Wulf, Sally A. McKee: Hitting the Memory Wall: Implications of the Obvious. In: Computer Architecture News. Vol. 23, Issue 1, März 1995, doi:10.1145/216585.216588, S. 20–24 (PDF, 20 KB)