Dieser Artikel entstand aus einem Blogartikel, der in zwei kleinen Blogs die wesentlichen Fortschritte in der Entwicklung von Computern resümiert. Aufgrund des Formates - zehn Einträge musste einiges entfallen wie VLIW oder Mehrkernprozessoren, aber dafür enthält dieser Artikel die wichtigsten Informationen, die sonst in zahlreichen Artikeln in dieser Rubrik enthalten sind. Wer mehr wissen will, folgt einfach den Links in der Seite.
Sehr früh in der Geschichte des Computers musste man festlegen, wie der Speicher genutzt wird. Jeder Computer verarbeitet Programme, also Code und die Programme verarbeiten wiederum Daten. Es gibt nun zwei Ansätze wie man den Speicher zwischen Code und Daten aufteilt: Die von Neumann Architektur hat einen gemeinsamen Speicher für Daten und Code. Beide Ansätze sind sehr alt und entstanden schon bei den ersten Computern: Die Harvard Architektur 1944 beim Mark I und die von Neumann Architektur wurde gleich mehrfach entdeckt und sowohl von Zuses Z3, wie auch dem ersten US-Computer ENIAC eingesetzt. John von Neumann fungiert, obwohl er die Theorie erst 1945 aufstellte, trotzdem als Namensgeber, weil vorher man sie einfach umsetzte aber nicht benannte
Die Harvard Architektur hat dagegen getrennte Speicher für Daten und Code. Beide Ansätze sind weit verbreitet. Pcs oder Smartphones haben Prozessoren mit der von Neumann Architektur, da wo die Prozessoren versteckt sind, also in Geräten wie Waschmaschine oder MP3-Player, dominiert die Harvard Architektur. Die von Neumann Architektur hat den Vorteil, dass die beiden Teile Daten und Code variabel sind. Beispiel auf dem PC: Eine Textverarbeitung hat viel Code, die meisten verfassen damit aber eher kurze Texte, also wenige Daten. Eine Videobearbeitung verarbeitet dagegen Videos, also sehr große Datenmengen. Daneben braucht man bei der von Neumann-Architektur nur einen Datenbus, was die Pins die ein Prozessor hat deutlich verringert. Die Harvard Architektur trennt die beiden Busse. Sie können auch unterschiedlich groß sein und unterschiedliche Architekturen haben. Mikrocontroller mit der Harvard Architektur haben meist einen sehr kleinen Codespeicher aus DRAM und einen größeren Datenspeicher in Form von Flash-ROMs. Ein Vorteil ist auch das so der Codespeicher geschützt ist. Code kann sich so nicht selbst modifizieren.
Ein zweiter Ansatz eine Architektur aufzustellen liegt in den Befehlen. Sie können sehr elementar sind (RISC - Reduced Instruction Set) oder sehr komfortabel (CISC - Complex Instruction Set). Ein Beispiel: in Zählschleifen hat man oft die Befehlsfolge Dekrementiere Register und Springe wenn Register=0. Dies können zwei Befehle sein (RISC) oder einer (CISC). RISC benötigt weniger Transistoren für eine Architektur, auch weil die Anzahl der Befehle und ihre Leistung großen Einfluss auf die Größe und Komplexität der internen Einheiten eines Prozessors hat. CISC ist, wenn dies keine Rolle spielt meist schneller. Da zumeist mit jeder Generation neue Befehle aufgenommen werden, neigen auch RISC-Architekturen dazu zu CISC zu werden. So waren die weit verbreiteten ARM Prozessoren mal RISC-Prozessoren, doch 30 Jahre nach der Einführung sind sie das nicht mehr.
Heute dominiert RISC noch in dem Segment wo der Preis sehr wichtig ist, bei Microcontrollern. In den späten Achtzigern sah man in RISC die Option einen 32-Bit-Prozessor zu designen und die Aufwendungen dafür zu begrenzen, indem er nicht komplexer als ein 16 Bit CISC-Prozessor ist. Das ermöglichte es Firmen die nicht die Marktmacht von Intel oder Motorola hatten, einen Prozessor einzuführen.
Wenn ein Befehl im Prozessor ankommt, gelangt er in den Dekoder und das Steuerwerk in denen das Bitmuster Aktionen auslöst. Diese Teile sind bei einfachen Prozessoren wie z.B. den 8-Bit-Prozessoren meist hardware-verdrahtet. Heute setzen alle größeren Prozessoren Microcode ein. Microcode ist ein ROM im Prozessor. Der Decoder liefert eine Adresse im ROM und dann wird das Bitmuster für einen Befehl - nicht eines, sondern meist mehrere nacheinander aus dem ROM geholt und an das Steuerwerk gesendet. Dabei können auch Schleifen und Verzweigungen realisiert werden. Ein Befehl für das Kopieren eines Blocks kann z.B. in einen Einzelkopierbefehl und eine Schleife zerlegt werden.
Der Vorteil ist, dass man so sehr komplexe Befehle realisieren kann, ohne ein komplexes Steuerwerk und einen komplexen Dekorder zu haben. Bessere Architekturen erlauben auch das Austauschen des Inhalts eines Microcode-ROM, man kann so Fehler beseitigen oder den Microcode verbessern, das geht heute sogar über das Internet, war aber schon (allerdings nur mit physischen Zugriff auf den Baustein) in den Siebzigern möglich, was die Herstellung eines Prozessors oder ein Update deutlich vereinfachte.
Der Nachteil ist, dass Microcode langsamer als die direkte Verdrahtung ist weil er einen Zwischenschritt einschiebt. Bei dem IBM System /360 war es z.B. so, dass die meisten Systeme bis auf die schnellsten Microcode einsetzten, nur die schnellsten waren hardwarekodiert. Bei dieser Linie zeigte sich auch ein anderer Vorteil von Microcode: die gesamte Serie verarbeitete denselben Programmcode, die interne Architektur variierte aber und so auch der Mikrocode, der im ROM war. Das Einstiegssegment hatte eine 16-Bit-Architektur mit wenigen Kilobyte RAM, das Endsegment 32-Bit-Architektur und bis 1 MByte RAM.
Die Ausführung eines Befehls durchläuft im Prozessor mehrere Phasen die unterschiedlich lang sein können und bei komplexen Befehlen sich auch wiederholen können:
Fetch - Befehl aus dem Speicher holen
Dekode - Feststellen was man machen muss
Execute - Befehl ausführen.
Bei jeder dieser Aktion(en) sind andere Teile des Prozessors aktiv. So kam man darauf, diese parallel arbeiten zu lassen. Also der Teil, der mit dem Speicher kommuniziert startet nach einem Fetch einfach schon den nächsten bei der Adresse+1. Das nennt man Pipeline. In der Theorie kann man so bei einer Pipeline von n-Stufen n Befehle parallel abarbeiten und so die Geschwindigkeit um den Faktor n erhöhen - in der Theorie, denn zum einen können Befehle voneinander abhängen, man muss also warten bis ein Befehl ausgeführt ist bevor man den nächsten ausführen kann und zum anderen können die Einheiten auch belegt sein, die Speichereinheit wird nicht nur beim Fetch aktiv, sondern auch, wenn Daten vom Speicher gelesen oder geschrieben werden. Eine Pipeline ist aber ein recht einfacher Weg die Geschwindigkeit eines Prozessors deutlich zu erhöhen. Heute können bei der x86 Linie Pipelines 30 oder 40 Stufen haben, also extrem feingliedrig sein. Das liegt aber auch an den komplexen CISC-Befehlen dieser Architektur, ein RISC-Prozessor kommt dagegen mit 6-7 Stufen aus, auch ein Grund warum diese Architekturen weniger Transistorfunktionen benötigen.
Seit es Speicher gibt, gab es ein Problem: er war immer langsamer als der Prozessor. Man kann Speicher zwar so schnell machen, dass ein Prozessor nahezu verzögerungsfrei auf ihn zugreifen kann, aber solcher Speicher ist viel teurer als der normale. Caches ist eine Lösung des Problems. Sie basieren darauf, dass Code, aber auch Daten eine große Lokalität aufweisen. Sprich: Es ist sehr wahrscheinlich, dass wenn man Daten aus einer bestimmten Speicherstelle braucht, man bei den nächsten Zugriffen Daten aus benachbarten Speicherstellen braucht. Ein Cache ist ein kleiner sehr schneller Speicher der diese Daten zwischenspeichert, aufteilt in kleine Segmente, die Cachelines. Bei der x86 Architektur ist eine Cacheline immer 32 Bytes lang. Er besteht aus Flip-Flops, einer Schaltung aus 4 bis 6 Transistoren die ein Bit speichert und die genauso schnell wie die Logik ist. Verglichen mit den Speicherzellen eines DRAM-Bausteins brauchen Flip-Flops aber viel mehr Platz und sind aufwendiger zu fertigen und damit ist Cache-Speicher sehr teuer.
Heute sind Caches so wichtig für die Geschwindigkeit das sie sowohl von der Fläche wie auch der Anzahl der Transistoren das vorherrschende Element von Prozessoren sind. Spezielle Serverprozessoren haben meist noch größere Caches als Prozessoren für den Desktop, denn auf ihnen laufen viele Prozesse von unterschiedlichen Nutzern, heute auch mehrere Betriebssysteme parallel.
Anfangs kam man mit einem Cache aus - später L1 (Level 1) Cache genannt, heute ist normal, dass der Prozessor einen sehr schnellen, aber kleinen Level 1 Cache haben, dann einen größeren aber etwas langsameren L2-Cache und dann teilen sich mehrere Kerne noch einen noch größeren aber noch langsameren L3-Cache.
Eine zweite Lösung für das Problem, dass Speicher langsamer ist als gewünscht, ist die Unterteilung des Speichers in Bänke. Ein Rechner mit 4 Bänken ist so aufgebaut das die erste Bank immer Daten mit Adressen/4 speichert, die zweite Bank mit Adressen/4+1 ... Das System ist klar. Wenn Code linear ausgeführt wird, wie es auch bei Caches vorhergesehen ist, greift der Prozessor nacheinander auf jede Bank zu, das heißt jede Bank hat viermal so viel Zeit für das Auslesen oder Schreiben von Daten und oft haben sie auch eine Logik die vorausschauend schon das nächste Datenwort ausliest und in einen schnellen Zwischenspeicher ablegt.
Speicherbänke waren vor allem in Großrechnern verbreitet, weil jede Bank eine eigene Adress- und Datenlogik braucht. Dann konnten es aber sehr viele sein. Seymour Cray lehnte z.B. Caches ab, dafür hatten seine Supercomputer bis zu 256 Speicherbänke. In den PC ist das Gegenstück ein Kanal, also ein Steckplatz für ein DIMM Modul. Ein PC aus dem Laden hat zwei oder vier Kanäle. Die Motherboards für Server haben mehr Steckplätze, meist 16 Kanäle. Der Grund ist relativ einfach - denn natürlich macht jeder Steckplatz das Motherboard teurer. Jeder Steckplatz benötigt Platz und eine eigene Verdrahtung. Wer mehrere Kanäle mit identischen Modulen bestückt, wird auch eine Geschwindigkeitssteigerung feststellen - durch die Caches hält er sich mit 5 bis 10 Prozent Geschwindigkeitsgewinn bei einem Desktop-PC aber in Grenzen. Bei Servern ist ein positiver Nebeneffekt, das man so nicht nur die Geschwindigkeit steigert, sondern man bei 16 Kanälen natürlich auch 16 DIMM Module einstecken kann und so über mehr Arbeitsspeicher verfügen kann. Der kann bei einem Server durchaus der Hauptkostenfaktor sein.
Ich bleibe beim Thema Speicher und Adressierung. Virtueller Speicher ist Speicher, den es physikalisch, also als Bausteine, nicht gibt. Welchen Sinn macht er dann? Nun es gibt zwei Nutzen. Zum einen kann ein Prozessor einen großen Adressraum bieten, denn man aber gar nicht ausnutzen kann. Als 1986 der 80386 Prozessor erschien war er der erste in seiner Reihe von Intel mit einem 32 Bit Adressraum, also 4096 MByte Speicher. Die ersten Systeme, die mit ihm erschienen hatten aber nur 4 MByte Speicher. 4 Gigabyte wären weder finanzierbar gewesen, noch mit der aktuellen Generation von DRAM-Chips (die 1 Megabit speicherte) realisierbar. In Zusammenarbeit mit dem Betriebssystem konnte aber eine Anwendung tatsächlich über diesen Speicher verfügen. Das Betriebssystem lagerte dazu Teile des Speichers auf Festplatte aus und zwar die Teile die am längsten nicht genutzt waren. Die Vorgehensweise ähnelt also dem Cache. Der Arbeitsspeicher ist praktisch ein Cache des virtuellen Speichers.
Die zweite Funktion betrifft das Multitasking. Das ist ja heute der Normalfall. Jede Anwendung wird aber von einem Compiler so erstellt, dass sie immer an einer festen Basisadresse beginnt. Die Logik, die den Speicher in Seiten unterteilt und diese bei Bedarf auslagert verändert auch die Adressierung von Anwendungen. Die Anwendung sieht einen logischen Speicher, genau so als wäre sie alleine vorhanden. Die virtuelle Speicheradressierung übersetzt diese Adressierung in eine physikalische Adressierung, platziert mehre Anwendungen, die alle meinen, sie beginnen bei einer festen, überall gleichen Adresse in unterschiedlichen Bereichen des Speichers und schottet sie voneinander ab.
Ohne virtuelle Adressierung wäre kein Multi-Tasking (Multi-User) Betriebssysteme möglich. Sie wird auch heute noch eingesetzt, auch wenn die meisten PC genügend Arbeitsspeicher haben. Früher war dies anders. Wer noch zu Windows 3.1 Zeiten arbeitete, kannte das Phänomen: sobald der Arbeitsspeicher erschöpft war und Windows begann Daten aus dem physikalischen Speicher in den virtuellen Speicher (eine Datei namens pagefile.sys, die gibt es bis heute im Stammverzeichnis C:\) auszulagern wurde die Anwendung sehr langsam.
Schon früh in der Computerentwicklung reichte eine Pipeline nicht mehr aus um die Geschwindigkeit zu erhöhen. Der Flaschenhals bei den Prozessoren waren nun die Ausführungseinheiten. Die meiste Zeit des Zyklus aus Fetch-Decode-Exevute (siehe Teil 1) brauchte der letzte Teil. Die Lösung war die Ausführungseinheiten mehrfach vorzuhalten, wenn eine belegt war so wurde die nächste genutzt. So konnte man mehr als einen Befehl pro Takt abarbeiten, mit einer Pipeline ist es maximal einer. Später wurde dann auch der Dekoder mehrfach ausgelegt. Die Alder Lake Mikroarchitektur von Intel - nicht die neueste, aber noch im Handel unter der Bezeichnung iCore-12xxx - hat zum Beispiel nicht weniegr als 37 Ausführungseinheiten. Eingeführt hat dies Seymour Cray bei der legendären CDC-6600 Mitte der Sechziger Jahre. Intel zog 30 Jahre später mit dem Pentium nach. Die Bezeichnung klingt etwas komisch, kommt aber aus der Vektormathematik. Ein Skalar ist dort ein einzelner Wert also eine Zahl im Gegensatz zu einem Vektor, einem ein- oder mehrdimensionalen Feld auch Array oder Matrix genannt.
Auch die nächste Entwicklung wird mit Seymour Cray verbunden, wurde aber zeitgleich auch woanders erfunden, doch Crays Konzept war das erfolgreichste. Eine Vektorarchitektur gehört zu dem Konzept von SIMD - Singe Instruction, Multiple Data. Dahinter steckt die Erkenntnis das in vielen Anwendungen in Technik und Wissenschaft ganze Felder von Daten auf die gleiche Weise bearbeitet werden. In einer Schleife iteriert der Code zum Beispiel über ein Feld und führt bei jedem Element die gleiche Berechnung durch. Der Code ist dabei immer gleich, aber die Daten wechseln. Bei SIMD werden daher mit einer Instruktion mehrere Daten verarbeitet. Bei Crays Supercomputer waren das spezielle Vektorregister die 64 Werte fassten, bei AVX dem heutigen Gegenstück bei Intel/AMD ist es ein bis zu 512 Bit langer Wert, der der Instruktion folgt. Dieser wird dann im mehrere 64 oder 32 Bit lange Fließkommazahlen unterteilt. Analog funktionieren auch die KI-Beschleuniger, die neuere Prozessoren haben, nur sind bei ihnen die Werte die verarbeitet werden noch kleiner nur 16 oder 8 Bit breit. Der Vorteil: AVX kann, wenn man die 512 Bit z. B. in 16 x 32 Bit unterteilt 16 Werte in der gleichen Zeit bearbeiten, in der sonst nur ein Wert durchgeschleust wird. Das ist auch ein Grund warum Prozessoren heute so viele Ausführungseinheiten haben, denn für jeden Wert braucht man natürlich eine Einheit, die die Berechnung durchführt.
Ich habe schon im ersten Teil dieses Artikels die Pipeline erwähnt, die dafür sorgte, dass eine CPU mehr als eine Anweisung gleichzeitig ausführen kann. Das hat aber Grenzen. Nehmen wir die einfache Berechnung A = B + C * D. Nach den Rechenregeln ("Punkt vor Strich") wird zuerst C * D berechnet und dann das Ergebnis zu B addiert. Solange dieses Ergebnis aber nicht feststeht, muss die Addition warten. Das hält besonders den Ablauf auf, weil wie jeder vom Kopfrechnen weiß, die Multiplikation länger dauert als die Addition, das ist auch bei Computern so. Bei einer "In-Order" Architektur hält diese Anweisung also den Ablauf auf.
Bei einer Out-of-Order Architektur wird die CPU nun den folgenden Code analysieren und nach Befehlen suchen, die unabhängig vom Produkt C*D sind und diese ausführen, also vorziehen oder wie der englische Begriff aussagt die Reihenfolge umstellen. Das bringt einen ziemlichen Performancesprung weil diese Situationen doch sehr häufig im Maschinencode vorkommen. Heute haben alle Prozessoren von Intel und AMD dieses Feature außer die ganz billigen Atom-Prozessoren von Intel. Eingeführt wurde es bei dem Pentium Pro Prozessor, mit dem Intel vor allem im Bereich der Großrechner und Server Fuß fasste, aufgrund seines Preises sich im Desktop-Bereich aber nicht durchsetzen konnte.
Damit verbunden, aber nicht das Gleiche, ist ein zweites Verfahren namens Branch Prediction. Im Code gibt es viele bedingte Sprünge. Alle Schleifen in einer Hochsprache enden in einem solchen Sprung, wo wieder zum Schleifenanfang gesprungen wird, wenn eine Bedingung erfüllt ist oder eben nicht. Ebenso führen If-THEN Abfragen in einer Hochsprache zu bedingten Sprüngen. Diese sind für die Ausführung fatal. Denn anders als bei Out-of-Order kann man nun keinen Befehl vorziehen, ja da die Ausführung an einer anderen Stelle fortgesetzt wird, kann es sein, dass Dutzende Befehle die in der Pipeline stecken, nun alle ungültig sind. Der Pentium 4 Prozessor hatte wegen seines hohen Taktes eine sehr lange Pipeline und war daher sehr anfällig gegen einen Sprung, der nicht dahin ging, wo er ihn vermutete. Um dies zu vermeiden, haben alle Prozessoren heute Sprungvorhersage-Logiken. Sie versuchen vorherzusagen, wohin der Sprung geht, indem sie die Befehle vor dem Sprung, deren Ergebnis die Bedingung für den Sprung definiert analysieren und schon mal probeweise ausführen.
Intel und die Fortschritte
Hier in der langen Geschichte der intel Prozessoren die Prozessoren wo eines der obigen Features erstmals auftrat:
Prozessor |
... führte ein |
---|---|
Microcode |
|
Pipeline |
|
Cacheunterstützung, aber Cache noch extern |
|
Interner Cache mit voller Prozessorgeschwindigkeit |
|
Superskalarität für die Integerberechnungen |
|
Out-of-Order Execution RISC |
|
Superskalarität (SSE, später zu AVX erweitert) |
|
Hyperthreading |
Noch eine kleine Erläuterung zu "RISC" beim Pentium Pro. Der x86 Code und der nun aktuelle IA64 Code ist natürlich ein CISC-Code. Doch auch Intel erkannte die Vorteile von RISC und hat seit dem Pentium Pro eine Art Übersetzer im Prozessor integriert. Dieser ersetzt eine CISC Anweisung durch eine Folge von elementaren RISC Anweisungen im Intel Jargon "Micro-Ops"genannt. Diese Micro-Ops sind schneller verarbeitbar und auch einfacher an die vielen Ausfuhreinheiten verteilbar. Heutige Prozessoren von Intel haben sogar einen eigenen Cache für diese Micro-Ops im Prozessor.
Das Hyperthreading beim Pentium 4 war eine Vorstufe eines Mehrkernprozessors. Ein Mehrkernprozessor hat mehrere Prozessorkerne, also alle Bestandteile eines Prozessors sind mehrfach vorhanden. Beim Hyperthreading, (allgemeine Bezeichnung Symmetrisches Multithreading - SMT) werden nur die unbenutzten Funktionseinheiten durch einen zweiten Thread ausgelastet. Das bringt etwas mehr Performance, aber deutlich weniger als ein zweiter Kern, weil Dekoder und Speicherinterface und Cache natürlich nicht mehrfach vorhanden sind.
Artikel verfasst am 11.7.2025, Artikel zuletzt geändert am 12.7.2025
Home | Computer | Prozessor Basics | Site Map | ![]() |
Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensläufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.
Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.
Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.
Mehr über das Buch auf dieser eigenen Seite.
Hier geht's zur Gesamtübersicht meiner Bücher mit direkten Links zum BOD-Buchshop. Die Bücher sind aber auch direkt im Buchhandel bestellbar (da ich über sehr spezielle Themen schreibe, wird man sie wohl kaum in der Auslage finden) und sie sind natürlich in den gängigen Online-Plattformen wie Amazon, Libri, Buecher.de erhältlich.
Sitemap | Kontakt | Impressum / Datenschutz | Neues | Hier werben / advertisment here | Buchshop | Bücher vom Autor |
![]() |