Mal zu langsam, dann schnell genug, dann wieder zu langsam – der Speicher
Während sich die Technologie bei der CPU und den Logikbausteinen kaum geändert – hat, wenn man von der ersten Phase mal absieht, als noch Röhren eingesetzt wurden – gab es beim Speicher laufende Technologiewechsel und ich bin beim Lesen alter Dokumente auf eine erstaunliche Erkenntnis gestoßen, die ich am Schluss euch nicht vorenthalten darf.
Jeder Computer braucht Speicher. Wenn man die ersten Maschinen mal ausblendet, die meist keinen dezidierten Speicher hatten, sondern die Logik selbst die wenigen Werte speicherte die in den Gleichungen benötigt wurden, etablierte sich ab Ende der Vierziger Jahre die Trennung von Logik und Speicher nach der von Neumann oder später Harvard Architektur. Beide differieren, doch beide haben einen externen Speicher.
Das Grundproblem, das Speicher hat, ist das er viel mehr Elemente enthalten muss, um Programme und Daten zu halten als die CPU und andere Logikbausteine. Hier ein Vergleich: Eine 8-Bit-CPU war je nach Typ aus zwischen 4.000 und 8.000 Transistoren aufgebaut. Ihr 64-K-Speicher war dagegen 524.000 Bits groß. Bei der 16 Bit Generation waren es zwischen 29.000 und 134.000 Transistoren in der CPU bei 8 Millionen bis 128 Millionen Bits für den Speicher. Heute haben die größten CPU etwa 2 Milliarden Transistoren, doch 64 GByte Speicher, die einen Bruchteil davon kosten, umfasst 512 Milliarden Bits.
Kurzum: Speicher musste pro Bit vor allem billig sein. Daher hat man schon immer versucht, für den Speicher eine andere Technologie einzusetzen als für die CPU. Den Anfang machte die Speicherung als akustisches Signal. Die ersten Speicher in der Univac bestanden aus mit Quecksilber gefüllten Röhren. Vorne wo die Bits geschrieben wurden, gab es einen piezoelektrischen Kristall, das ist ein Kristall, der bei Anlegen eines elektrischen Signals einen Druck aufbaut und umgekehrt, wenn er unter Druck gerät, ein elektrisches Signal abgibt. Schrieb man ein Bit so erzeugte das im Quecksilber eine kleine Welle die nach hinten lief. Dort saß ein zweiter Kristall, der, wenn die Welle ankam, ein Signal abgab das verstärkt und (das Bit musste ja gespeichert werden) wieder vorne eingespeist wurde. Quecksilber wurde genommen, weil das die dichteste Flüssigkeit ist die es gibt und man so möglichst viele Wellen pro Röhre am laufen lassen kann, sprich möglichst viele Bits speichern konnte. Jede Röhre dieses „Verzögerungsspeichers“ konnte beim Univac 7 Dezimalziffern aufnehmen.
Die Quecksilberröhren sind unhandlich und erfordern ziemlich viel Aufwand für die Wartung und Versorgung mit Quecksilber, das zudem noch giftig ist. So hatten sie nur eine kurze Einsatzdauer. Sie wurden Ende der Vierziger Jahre vom Trommelspeicher abgelöst. Das Grundprinzip des Verzögerungsspeichers wurde aber nochmals in den Sechziger bei magnetischen Verzögerungsspeichern aufgegriffen: Drähte aus bestimmten Legierungen leiten Magnetfelder wenn sie unter Strom gesetzt werden langsam durch den Draht. So konnte man auf einem Draht mehrere Bits speichern. Die man hinten auslaß und vorne wieder einspeiste. Auf der Erde in Rechnern selten eingesetzt fand sich etliche Anwendungen in Satelliten und Raumfahrzeugen für diese Technologie. Die Verzögerungsröhren auf Basis von Quecksilber starben dagegen Anfang der Fünfziger Jahre aus.
Der Trommelspeicher speichert Information magnetisch und hat dasselbe Prinzip wie eine Festplatte, nur wird die Information nicht auf einer platten Scheibe, sondern der Außenseite eines Zylinders geschrieben. Dort sitzen viele Schreib-/Lese Kopfe je einer pro Spur (ein Kreisumfang in einer bestimmten Höhe) und die Trommel rotiert. Das klingt gegenüber der später erfundenen Festplatte nach viel zusätzlichem Gewicht und Volumen, hatte aber den Vorteil das alle spuren gleich lang waren, damit auch die Bereiche die magnetisiert wurden. Bei der Festplatte muss sich (zumindest bei gleicher Sektoranzahl pro Spur) sich das nach der innersten Spur richten. Weiterer Vorteil: Die Fliehkräfte sind überall gleich stark, so waren höhere Rotationsgeschwindigkeiten möglich. Nun dauert es aber selbst bei 12.500 Umdrehungen – so schnell rotierte die Trommel beim IBM 650 Rechner – im Mittel 2,5 ms, bis ein Wert ausgelesen und geschrieben werden konnte, was selbst für die damaligen Computer der Fünfziger und Sechziger Jahre zu langsam war. Bei der IBM 650 wurde daher die Architektur des Rechners auf diesen Speicher ausgelegt. Heute haben Computer einen Befehlszähler, der automatisch nach jedem Befehl erhöht wird und dorthin zeigt, wo der nächste Befehl im Speicher ist, damit dieser ausgelesen werden kann. Bei der IBM 650 hatten Befehle im Opcode die Adresse des nächsten Befehls. War die Ausführungszeit sowie die Zeit für das Lesen von der Trommel bekannt so konnte man den nächsten Befehl dort platzieren, wo der Schreiblesekopf sein würde, wenn der Befehl ausgeführt ist. Das macht, weil so der Platz fragmentiert wird, das Programmieren aber nicht einfacher.
Wenn man schon die Information magnetisch speichert, dann auch so das man ohne Verzögerung auf sie zugreifen kann – das führte dazu das man kleine Eisenringe oder Ringe aus einer magnetisierbaren Legierung auf Draht aufzog. In einer Matrix aus Drähten reichte der Strom an einem Kreuzungspunkt aus die Magnetisierung zu ändern, woanders nicht. Auslesen konnte man den Speicher über den Impuls, den er auf einer dritten stromfreien Leseleitung erzeugte. Magnetkernspeicher waren über die ganzen Sechziger Jahre bis Mitte der Siebziger die dominierende Speicherform. Anfangs noch sehr groß, wurden die Ringe immer kleiner. Damit sank aber auch die Zeit, die man brauchte, um die Magnetisierung zu ändern und sie wurden schneller. Mit der Verkleinerung stieg auch die Dichte, die man pro Volumen unterbringen konnte und bald entwickelte man Maschinen, die die Ringe auffädeln konnten, anstatt das man dies manuell machen musste, sodass die Kosten sanken. Die ersten Ringe hatten einen Durchmesser von 2,5 mm, die Letzten einen von 0,33 mm. Die Kosten sanken von 1 Dollar auf 0,33 ct pro Bit. Die Zugriffszeit sank von 20 Mikrosekunden auf 0,3 Mikrosekunden. Obgleich Ringkernspeicher damit immer noch langsamer als die CPUs waren, waren sie um Größenordnung schneller als vorherige Speicher, hatten eine hohe Dichte, was die Rechner kleiner machte. Daneben gab es einen praktischen Vorteil. Da die Information magnetisch gespeichert war, ging sie nicht verloren, wenn der Computer ausgeschaltet wurde. Man konnte, selbst wenn der Computer bei einem Fehler neu gestartet werden musste, den Hauptspeicher auslesen und in dem „Core Memory Dump“ dann nach der Fehlerursache suchen. Zumindest dieser Begriff hat sich viel länger gehalten als der Ringkernspeicher selbst.
Zu Beginn der Sechziger wurden zwar integrierte Schaltungen eingeführt, aber das änderte nichts an der Dominanz der Ringkernspeicher. Nun wurden zwar die CPUs nicht mehr aus Transistoren, sondern IC gefertigt, aber der Ringkernspeicher blieb. Der Grund war die niedrige Informationsdichte in den Schaltungen und ihre Kosten. Man benötigt ein Flip-Flop, ein Schaltelement das dauernd zwischen zwei Zuständen hin und her springt, um ein Bit zu speichern. Das benötigt aber mindestens 4 Transistoren. Eine Schaltung hatte in den Sechzigern aber nur wenige Transistoren und war teuer. So nahm man Schaltungen nur für das Speichern von Daten, auf die man besonders schnell zugreifen musste, Werte in Registern und als Caches einzogen, auch die Caches. Das änderte sich Ende der Sechziger und man kann es sehr gut verdeutlichen an den ersten drei Chips die Intel herausbrachte. Intel wurde als Zulieferer für Schaltungen gegründet. Der erste Speicherbaustein war ein 64-Bit-Baustein in Bipolartechnik, nach der damals Schaltungen entwickelt wurden. Der zweite Chip setzte die damals noch neue Metalloxid-Technik ein (MOS) ein. Transtoren in dieser Technik brauchen viel geringere Stromstärken zum Schalten und sind viel kleiner – man brachte auf demselben Platz nun schon 256 anstatt 64 Bit unter. Schließlich erfand man dort das dynamische RAM – anstatt ein Bit in einer Schaltung aus Flip-Flops zu speichern dotierte man das Silizium in der Tiefe sehr stark und schuf so einen Kondensator, der durch einen Transistor darüber an dem Entladen gehindert wurde. Das benötigte nur einen Transistor anstatt vier pro Bit und viel weniger Aufwand für die Verschaltung und die Kosten sanken: Intels erster DRAM Baustein speicherte 1024 Bit, das 16-Fache des nur ein Jahr vorher vorgestellten 64 Bit Bipolarspeichers und er kostete nur ein Sechstel – innerhalb eines Jahres war der Preis pro Bit um den Faktor 100 von 1 Dollar auf 1 ct pro Bit gefallen.
Mit der Einführung dieses dynamischen RAMs (so genannt, weil die „Miniaturkondensatoren“ sich ohne laufendes Auffrischen der Ladung von alleine entladen) begann der Siegeszug von RAM-Bausteinen, genauer gesagt von DRAM, in der Industrie. Heute besteht fast der gesamte Speicher aus DRAM. Den Speicher aus Flip-Flops gibt es immer noch und zwar als Cache, Zwischenspeicher. Er kann, da er aus derselben Technologie wie die Logik besteht genauso schnell wie diese sein. So nutzte man schon früher den inzwischen statischen Speicher (SRAM) genannten Speicher aus Flip-Flops für Register und eben Caches. Der Grund war auch das man bald entdeckte, dass man DRAM nur langsam in der Zugriffszeit steigern konnte. Ein Kondensator entlädt sich nicht sofort und auch ein Aufladen braucht Zeit, das ist physikalisch so vorgegeben. In der Folge sank die Zugriffszeit nur langsam. Texas Instruments setzte bei ihrem TMS 9900 Prozessor darauf, das DRAM mit dem Anstieg der Taktfrequenzen Schritt halten konnte und sparten auf ihren Prozessor Register ein, die sie ins RAM auslagerten. Als das nicht passierte, hatten sie bei ihrem Ti 99/4 Heimcomputer ein Problem. Aber auch andere PCs hatten das Problem. Solange die CPU nur wenig schneller als das DRAM war, schob man einen Wartetakt ein – das bremste die CPU zwar aus, doch da Speichertransfers nur einen Teil der Ausführungszeit einer CPU ausmachen nicht sehr. Bei 10 MHz Takt eines 80286 machte 1 Wartetakt den Rechner um etwa 3 % langsamer. Doch die Taktfrequenzen steigen weiter an und beim Intel 80386 reichten Wartezyklen alleine nicht mehr aus. Er bekam die Logik für die Ansteuerung eines Caches integriert. Der Cache war noch extern, aber er bekam schon bevor die CPU Daten vom Speicher anforderte die Informationen dafür, damit er falls die Daten im Cache sind, sie bereitstellen kann. Der Cache enthält im Prinzip eine Kopie von Speicherinhalten, organisiert in kleinen Einheiten den Cachelines, die im im Idealfall den Zugriff auf den langsamen Arbeitsspeicher meistens unnötig machen. Er besteht aus schnellem SRAM. Ab dem 486 wurde der Cache in die CPU integriert und extern gab es einen zweiten, größeren „Level 2“ Cache. Heute geht das bis Level 3 den sich mehrere Kerne einer CPU teilen. Beim RAM änderte sich bis Mitte der Neunziger nichts. Da nun viele Rechner schon Caches hatten und eine Cacheline immer 32 Bytes hintereinander aus dem Speicher holte, kam man auf einen Trick: An der Zugriffszeit auf das erste Datenbyte konnte man nichts ändern, aber am Datentransfer. Vorher holte der Prozessor jedes Byte einzeln ab, wobei er erst die Adresse in zwei Schritten (Reihe und Spalte) übermitteln musste, dann signalisieren, dass er bereit ist die Daten entgegenzunehmen, warten, bis der Speicherbaustein sagte „Die Daten liegen auf dem Bus“ und dann wieder das Signal für die Bereitschaft zurücksetzen. Der Speicherbaustein benötigt dann nochmals eine gewisse Zeit um die Information im Chip aufzufrischen, die durch das Lesen verloren ging. So ein Zyklus dauerte typisch dreimal so lange wie die Zugriffszeit, also die Zeit die verging von der Anforderung, bis die Daten auf dem Bus lagen. Bei synchronem DRAM (SDRAM) liest der Speicher dagegen nach dem ersten Byte automatisch aus der nächsten Zelle das nächste Byte aus und legt bei jedem Takt ein Byte auf den Bus, solange bis eine Cacheline voll ist. Dafür muss er mit dem Takt des Prozessors synchronisiert sein, denn dieser muss automatisch bei jedem Takt ein Byte abholen. (In der Praxis sind DRAM bitweise oder 4-Bit weise organisiert, doch das Prinzip ist das gleiche). Als Folge fällt die Zugriffszeit nur einmal an und die Datenrate für die folgenden Bytes ist viel höher. Da alle Daten sowieso erst im Cache landen, ist diese Technik ideal für die Architektur eines Caches. Daran hat sich bis heute nichts geändert. DDR RAM ist SDRAM der bei jedem Takt zwei Bytes (DDR = Double Data Rate) transferiert, und zwar bei jedem Flankenwechsel.
Was sich nicht geändert hat ist die Zugriffszeit. Beim Lesen in alten Texten bin ich auch auf das Datenblatt des 4164 RAMs gestolpert. Das ist ein DRAM Speicher (Vorziffer „4“, „6“ für CMOS, „2“ für SRAM), in 1 Bit Organisation „1“ an der zweiten Ziffer und 64 Kbit Kapazität (letzte Ziffern). Das DRAM erschien 1979 und wird – wie ich bei ebay rausfand immer noch in China produziert. Bei DDR-RAM haben sich zahlreiche Parameter geändert, die beiden früher wichtigsten, nämlich die Zugriffszeit und Zykluszeit werden heute gar nicht mehr angegeben. Aber zumindest die „Kontaktaufnahme“ ist gleich geblieben: RAM Chip selektieren, Reihenadresse übergeben, Spaltenadresse übergeben, Lese oder Schreibsignal setzen. Und ein Zeitparameter, die Trcd (Zeit zwischen Setzen der Reihen- und Soldatenadresse) gibt es heute noch. Netterweise erschien in der letzten ct dann noch ein Artikel über die Optimierung der einzelnen Zeitparameter bei DDR-RAM mit abgedruckten Werten. 3000 MHz DDR4 RAM, also das gerade schnellste auf dem Markt hat eine Trcd von 8,9 ns. Das 4164 hatte in der langsamsten Version eine Trcd von 35 bis 65 ns (200 ns Zugriffszeit), bei 120 ns waren es noch 25 bis 40 ns. Selbst wenn ich also die langsamste Version nehme, dann ist heutiger DRAM Speicher in diesem Zeitparameter nur um den Faktor 4-7 schneller geworden und das in 40 Jahren! Dagegen sind selbst Drucker, die aufgrund der Mechanik nicht so beschleunigt werden, können um einiges leistungsfähiger geworden: 1979 schafften die schnellsten Drucker 80 Zeichen/s, also eine Seite in rund 1 Minute, heute kostet selbst ein Multifiktionsgerät mit 30 Seiten/Minute weniger als damals ein Nadeldrucker. Während der Zugriff nur wenig schneller wurde, stieg die Kapazität von RAM um den Faktor 1 Million in dieser Zeit. Heute sind 64 GBit Stand der Technik.
Die Langsamkeit von RAM ohne Cache Einfluss kann man auch ausprobieren. In diesem Zip Archiv habe ich ein kleines Programm in Pascal (kompiliert mit Lazarus) gepackt. Das Prinzip: Es legt im Array ein großes Feld mit Zufallszahlen an. Einmal wird das Feld linear abgetastet und einmal wird die darin befindliche Zufallszahl als neuer Index genutzt. Damit ist, wenn das Feld groß genug ist, es meist nicht so, das ein Datenwert im Cache ist. Man kann selbst damit experimentieren. Das Feld sollte so groß sein, das es noch in den Arbeitsspeicher passt (vorher im Taskmanager nachsehen, wie viel frei ist) und die Durchläufe sollten so lange sein, das man vernünftige Zeitmessungen machen kann. Bei meinem 16-GB-System habe ich mit 4000 (MByte) und 200 (Millionen Durchläufe) gute Erfahrungen gemacht. Der zweite, längere Lauf dauert dann etwa eine Minute und ist (je nach Feldgröße) um den Faktor 100 bis 250 langsamer als der Zugriff auf den Cache. Die Transferraten liegen dann bei meinem System (Haswell, DDR3 RAM 1333 MHz) bei maximal 9000 MByte/s.
Eine Alternative ist aber kaum in Sicht. In den letzten Jahrzehnten gab es etliche Kandidaten für die Ablösung von DRAM. Nun hat es NRAM wenigstens in die Fertigung geschafft. NRAM hat die Schaltgeschwindigkeit von DRAM, eine ähnliche Kapazität pro Baustein (aber bei größerer Fläche) und ist persistent wie Flash RAM. Er könnte bei Servern die heute schon DDR RAM und Flash RAM kombinieren um im Falle eines Stromausfalls die Daten schnell in den Flash Speicher zu kopieren und bei Wiederherstellung wieder an dieser Stelle weiterzuarbeiten ersetzen. Für den Ersatz von Flash RAM ist die Kapazität dagegen einfach zu klein, außer vielleicht für mobile Geräte mit wenig Speicher die aber sehr schnell sein müssen.
Ich hab mir vor ein paar Jahren noch zwei Dutzend 4164 RAM Chips bei Reichelt gekauft, als es sie dort noch gab.
Ich verwende sie gelegentlich noch für die Reparatur von einem C64.
Ich habe den Eindruck, dass ein nicht geringer Anteil am Erfolg vom C64 daran lag, dass er genau zu dem Zeitpunkt entwickelt wurde, als RAM erheblich schneller als der CPU war.
So konnten sie einen Grafikchip entwickeln, der sich abwechselnd mit der CPU den Speicher teilt: Ein Taktzyklus CPU, ein Taktzyklus Grafikchip. So konnte man zwei Fliegen mit einer Klappe schlagen ohne dass sich beide gegenseitig lahmlegen. (was trotzdem hin und wieder passiert, aber das fällt kaum auf)
Das stimmt nicht. Als DRAM 1971 erschien war es schneller als die CPU, das hat sich aber schnell gedreht. Ich habe im Artikel ja schon den Ti 99/4a erwähnt der hatte für die CPU 128 Byte SRAM eingebaut – DRAM war für die 3,3 MHz schon zu langsam. Die Z80B und Z80H CPUs wurden auch aus dem Grund seltener als die Z80A eingesetzt.
Beim 6502 ist es noch etwas anders weil das Timing anders als bei der 8080/Z80 Reihe ist. Allerdings wurde der Apple II schon 5 Jahre vor dem C64 mit nahezu der gleichen Taktrate entwickelt. Als der C64 aktuell, war gab es Beschleunigerkarten für den Apple II mit 3,6 und nicht 1 MHz! 1 MHz war zu der Zeit schon ziemlich langsam. der BBC Micro lief mit 2 MHz, der Atari 800 mit 1,79. Auch die mehrere Jahre alten Vorgänger V20 und die CBM Serie liefen schon mit dem Takt. RAM war zudem Zeitpunkt sicher schneller als der C64, das lag aber eher daran das die Taktrate ziemlich niedrig war.
Beim Atari ST und beim Amiga (8Mhz Generation) war das RAM noch schnell genug, so daß der Prozessorzugriff und der Videozugriff abwechselnd laufen konnten und sich gegenseitig nur wenig behinderten. (Die 6 Takte Befehle des m68k wurden auf 8 Takte gestreckt.)
Okay, ich war mir nicht bewusst, dass der 6502 so schnell laufen konnte.
Wenn ich das jetzt so lese scheint es mir dann doch so, dass der CPU auf 1 MHz gedrosselt ist, damit er den Speicher zusammen mit dem VIC benutzen kann.
Dann ist es schon ein Jammer, dass man den C64 nicht auf das Doppelte beschleunigen konnte, indem man den VIC ausschaltet, was ja möglich war. Wäre vielleicht mit einem einfachen zusätzlichen Logik-IC möglich gewesen. Hab grad nachgelesen: Die CIA-ICs hätten auch 2 MHz vertragen.
Aber bei dem Design wurden ja viele Kompromisse gemacht, siehe serielles Floppy. Und vielleicht gab es auch Hürden, die mir nicht so ersichtlich sind und es ging ja auch um jeden Pfennig Herstellungskosten.
Das CPU-Befehlszyklen gestreckt wurden um dem Videocontrolelr Zeit zum Zugriff zu geben wie Andreas schreibt gab es oft, so auch bei der CPC Serie und den MSX (immer vielfache von 8 Takten, was die CPU Geschwindigkeit von 4 auf 3,2 MHz senkte). Das man aber die CPU wie beim C64 nur halb so schnell taktet ist schon eine Ausnahme. Allerdings hatte Wozniak aus demselben Grund auch beim Apple II deswegen nur 1 MHz gewählt. Die Alternative wären „Dual Ported“ Rams gewesen, die es schon damals gab, die aber deutlich teurer als die normalen Rams waren.
Wie schnell die DRAMs sein müssen bekommt leider nur durch Studium der Datenblätter heraus, wo die Daten aber auch nicht explizit drinstehen. Ich kenne mich beim 6502 nicht aus, aber beim Z80 dauerte ein Zugriffszyklus minimal 1,5 Takte, sprich bei 4 MHz braucht man eine Zykluszeit von 375 ns. bei der x86 Reihe waren es 2 Takte. Da ein 6502 doppelt so schnell bei gleichem Takt wie ein Z80 war würde ich drauf tippen, das die Anforderungen auch doppelt so hoch sind. Trotzdem wären nach diesem Analogon 2 Mhz mit den DRAMs dieser Zeit problemlos möglich gewesen.
Die Zuse Z3 und Z4 hatten mechanische Stellglieder als Datenspeicher. Aber die hatten eine Designgeschwindigkeit von 1 Addition pro Sekunde. Befehlsspeicher war Lochstreifen.
Ein AppleII oder C64 mit 2Mhz wahr nicht möglich, da DRAM damals deutlich über 250ns Zykluß-Zeit hatte, und Prozessor und Video abwechselnd auf den Speicher zugriffen.
Das 4116 des APPLII hatte 410ns Zuklußzeit. Mit den Laufzeiten durch Treiber und Multiplexer ist nicht mehr als 1Mhz möglich.