Hallo, schönen guten Tag.
Ich begrüße Sie zur Vorlesung Rechenorganisation.
Sie hatten letzte Woche, als ich nicht da war, Pipelining
durchgenommen.
Das heißt, damit wurde sozusagen der Rechner, der Mikroprozessor, alle
Bestandteile und Techniken davon besprochen.
Und jetzt wollen wir uns damit beschäftigen, was es noch außerhalb des
Mikroprozessors gibt, zum Beispiel den Hauptspeicher.
Also wir reden hier von einem Hauptspeicher, der nicht Teil des
Mikroprozessors ist, also nicht von dem Registersatz zum Beispiel, den
wir schon vorher hatten, sondern von wirklich großem Hauptspeichern.
Wir wollen uns anschauen, wie ist so ein Speicher überhaupt aufgebaut.
Wir werden sehen, es gibt verschiedene Möglichkeiten, Speicher
aufzubauen.
Wir werden hier nur zwei besprechen, zwei generelle Möglichkeiten.
Also wie ist physikalisch aufgebaut und dann auch, wie ist es
überhaupt aufgebaut von der Struktur.
Wie greift man darauf zu?
Das ist ein Chart, der schon ziemlich alt ist.
Wenn Sie hier hinschauen, da steht 2000.
Das ist völlig egal, ob da 2000 oder 2015 oder sowas steht.
Was hier gezeigt werden soll, ist Folgendes.
Wir haben hier die Performance.
Hier haben wir das Moorische Gesetz.
Sie erinnern sich an eine der ersten Vorlesungen des Moorischen
Gesetzes, also die Verdoppelung alle 1,5 Jahre der Performance.
Und das Grüne, das ist dasselbe für den Hauptspeicher.
Also wie groß oder wie stark, wie wächst der Hauptspeicher von der
Kapazität und auch von der Zugriffszeit über der Zeit.
Was diese Folie zeigen soll oder auch zeigt, ist, dass da eine riesen
Lücke klafft sozusagen.
Während die Prozessoren immer leistungsfähiger werden, werden die
Spreicher weniger stark leistungsfähig.
Das heißt, die werden zwar auch größer und man kann auf diese
schneller zugreifen, aber nicht in demselben Maße, wie die Prozessoren
an Performance zulegen.
Und das ist ein Problem.
Und deswegen habe ich auch bewusst, sage ich mal, so eine alte Folie
genommen, denn wenn man heute eine nehmen würde für 2015, würde genau
so aussehen, nur dass die Lücke noch größer wäre.
Aber das Problem ist da und das Problem vergrößert sich sozusagen
immer weiter.
So, was heißt das jetzt?
Was würden Sie da machen?
Was schließt man daraus, wenn man so eine Kurve hat?
Also Performance eines Prozessors wird immer größer,
Speicherzugriff wird nur bedingt schneller, wird nur bedingt größer
der Speicher.
Was schließt man daraus?
Ist das ein physikalisches Problem?
Das ist völlig richtig.
Sonst würde man es größer machen.
Es scheint also offensichtlich einfacher zu sein, einen schnellen
Prozessor zu bauen, als einen schnellen, großen Speicher sozusagen.
Also man muss es hingegeben nehmen, wie Sie richtig sagen.
Das ist ein physikalisches Problem, das können wir an sich nicht
ändern.
Aber was folgt dann daraus?
Da dem nun mal so ist, was gibt es da an Lösungen?
Oder fangen wir mal so an, warum ist das überhaupt ein Problem?
Okay, meine Prozessoren werden halt immer schneller, und wenn der
Speicher nicht so groß wird, was soll es?
Was hat das miteinander zu tun?
Wo ist überhaupt das Problem?
Vielleicht sollen wir das erst mal herausarbeiten.
Genau, also wir haben viele Hauptspeicherzugriffe und die
Gesamtleistung des Prozessors wird geringer, wie Sie völlig richtig
sagten.
Das heißt, die eigentliche Performance des Prozessors, die ich hätte,
mit der Annahme, dass ich eben nicht auf einen Speicher warten müsste,
das ist sehr viel geringer.
Das heißt, ich kann vielleicht die Prozessor-Performance nur zu 10 %
im schlechtesten Falle ausnutzen, weil ich die ganze Zeit auf den
Speicher warten muss.
Also es macht wenig Sinn, superschnelle Prozessoren zu haben, wenn die
Peripherie, hier in diesem Fall der Speicher, wenn das nicht stimmt.
Also muss ich mir definitiv was einfallen lassen, aber wie Sie eben
richtig sagten, das ist physikalisch bestimmt.
Also was ich letztendlich brauche, ist eine Speicherhierarchie.
Und das wird uns auch für das Ende des Semesters noch beschäftigen,
dass wir mehrere Speicher haben, Speicher, die verschiedene Größen
haben, verschiedene Zugriffszeiten und durch diese Hierarchie kann man
letzten Endes sozusagen diese Lücke schließen oder möglichst
schließen.
Also sehr schnelle Speicher haben, die vielleicht dann doch ein
bisschen näher da rangehen, aber eben sehr klein sind und welche, die
langsamer sind, aber dafür sehr groß.
Das ist die generelle Motivationsfolie zu den Speichern.
Schauen wir uns an, Speicher, der wird typischerweise über den BUS
zugegriffen.
Wir haben einen Prozessor, wir hatten schon gesagt, einen BUS, der
steht immer nur einem Teilnehmer zu einer Zeit zur Verfügung.
Und auch das ist ein Bottleneck, wie man sagt im Englischen, das ist
der Flaschenhals, durch den das alles durch muss.
Da müssen wir entsprechend warten.
Jetzt schauen wir uns einfach mal an, was es für Speicher gibt.
Ich möchte einen Speicher haben, zu dem ich zu jeder Zeit willkürlich
zugreifen kann.
Es gibt auch Speicher, wo ich das nicht kann.
Zum Beispiel, wenn ich irgendwas abgespeichert habe auf Band oder auf
Datenträger, die irgendwo im Regal stehen, also wo es wirklich um
extra Arbeit oder solche Dinge geht, die ich nicht auf einen Chip
bekomme und auch nicht auf einen Computer.
Und da kann ich nicht willkürlich drauf zugreifen.
Aber hier soll es darum gehen, dass ich einen Speicher habe, wo ich
willkürlich zu jeder Zeit drauf zugreifen kann.
So, jetzt haben wir hier das nochmal, das kennen wir schon.
Aber nochmals so zur Erinnerung, das hier oben haben wir
durchgenommen.
Und jetzt sind wir hier in diesem Part.
Das ist ein grundlegender Speicher, wie er aufgebaut ist.
Ich habe einen Prozessor, ich brauche zwei Arten von Bussen, um auf
diesen Speicher zuzugreifen.
Einmal die Adressen und einmal die Daten.
Das heißt, hier lege ich an, welche dieser Speicherzelle ich meine.
Das ist auf der Adressleitung.
Und auf den Daten, da kommen dann die entsprechenden Daten, die hier
gespeichert sind, zurück.
Das können Daten sein, im Sinne von Daten, die ich berechnen möchte,
Ergebnisse.
Aber es können auch Befehle sein.
Auch Befehle sind vom Speicher ausgesehen Daten.
Der weiß also nicht, ob er Befehle speichert oder irgendwelche
Ergebnisse, irgendwelche Berechnungen.
Also sagen wir mal, das sind Daten und Datenbefehle.
Generell sieht er so aus, dass wir Speicherelemente haben.
So ein Ding nennt man Speicherelement.
Wir werden später gleich noch sehen, was das genau ist, was da drin
ist.
Oder eine Speicherzelle.
Das kann dann zum Beispiel ein Wort sein, byte.
Wenn das zum Beispiel dann bit wäre.
Das Ganze ist immer als Speichermatrix aufgebaut.
Und das ist nicht nur logisch, das ist auch physikalisch so.
Und wir werden uns gleich nochmal ein bisschen näher anschauen, wie
das da drin ausschaut.
Also zur Definition.
Ein Speicherelement ist typischerweise ein Bit.
Und da wollen wir uns auch anschauen, wie wird ein Bit überhaupt
gespeichert, physikalisch.
Eine Speicherzelle, wie gesagt, 80 sind 32 Bit.
Ein Speicherwort, maximale Anzahl von Speicherelementen, die in einem
Zyklus zugegriffen werden können.
Ich kann zum Beispiel, wenn ich auf dem Bus eine Adresse gebe, können
mehrere Speicherzellen, ein ganzes Speicherwort gelesen werden.
Also es würde zum Beispiel keinen Sinn machen, wenn ich jedes einzelne
Speicherelement, jede einzelne Speicherzelle rausholen würde.
Ich kann sogar mehrere Worte zusammenlesen, typischerweise.
Das macht dann auch deshalb Sinn, wenn ich den Bus schon einmal
benutze und besetzt habe und den Speicher schon einmal adressiert
habe, was ja auch Zeit kostet, dann mache ich das effektiverweise
einmal und lese dafür zum Beispiel vier hintereinander liegende Worte,
die ich sowieso brauche.
Wenn ich irgendeinen Algorithmus habe, ist es sehr wahrscheinlich,
dass ich auf den nachfolgenden Speicher, auf das nachfolgende
Speicherzelle sowieso zugreife.
Also kann ich das gleich mitmachen.
Also das ist eine gewisse Effizienz gegenüber dem einfachen Fall, wenn
man auf jede einzelne Speicherzelle zugreifen würde.
Wenn man das dann nicht braucht, dann wird man das weg.
Wahlfreier Zugriff, das ist sehr wichtig.
Ich möchte jede dieser Speicherzellen, die wir hier haben, möchte ich
zumindest separat ansprechen können.
Das ist auch nicht unbedingt logisch, es gibt auch Speicher, wo ich
das eben nicht kann.
Aber bei einem wahlfreien Speicher habe ich die Möglichkeit, jede
Speicherzelle separat zu adressieren und den Wert rauszuholen oder den
Wert zu schreiben.
Also das heißt wahlfreier Zugriff.
Und da brauche ich so ein Ding hier, was sich nennt N aus N Code.
Das heißt, hier geht es um Codierung.
Man muss sich das so vorstellen, ich habe hier vorne Adressen.
Ich hatte schon mal gesagt, das sind typischerweise 32 Bit, also was
der Rechner so kann, vielleicht auch 64 Bit, aber 32 Bit.
Stellen Sie sich Folgendes vor, wir haben einen Speicher, der von mir
aus 20 Jahre alt ist, nur ein Megabit groß, also wirklich 25 Jahre
alt.
Dann hätte ich hier 1.000 Zeilen und hier 1.000 Spalten.
Das muss man sich überlegen.
Bei einem sehr kleinen, sehr alten Speicher hätte ich hier 1.000
Zeilen und 1.000 Spalten.
Wie adressiere ich sowas?
Hier vorne habe ich 32 Bit, sage ich mal.
Und jetzt muss ich das umsetzen auf 32 Zeilen und 32 Spalten.
Das heißt, ich brauche ein 1 aus N Code.
Das heißt, es muss eine Leitung ausgewählt werden, eine dieser
Leitungen, die eine Zeile meint, muss ausgewählt werden mit diesem
Code, den ich hier vorne anlege.
Von Codierung an sich kein Problem, mit 32 Bit kann ich noch viel
mehr.
Da kann ich 4 Milliarden Zeilen und Spalten ansprechen, das ist kein
Problem.
Ich brauche halt nur eine Logik und das ist genau dieses stilisierte
Dreieck hier, was ein 1 aus N Code formt.
Also eine Leitung wird aktiv, wenn ich hier eine bestimmte Adresse
anlege.
Das heißt, diese Adresse sozusagen ist die Nummer der Leitung, die
hier aktiv wird.
Also immer nur eine Leitung aktiv.
Das heißt, damit hätte ich schon mal eine Leitung ausgewählt und dann
mache ich dasselbe hier unten auch noch.
Und das ist hiermit gemeint mit diesem 1 aus N Code.
Das heißt, wir haben hier N Coder und D Coder.
Gut, wenn wir das haben, dann hatte ich das schon gesagt, das ist
organisiert als ein N mal M Bitspeicher.
Die Anzahl der Zeilen und Spalten kann unterschiedlich groß sein, das
muss nicht gleich groß sein.
Und zum Beispiel hätte ich hier einen Speicher, der 4000 mal 8 Bit
ist, also einen 4 Kilobyte großen Speicher.
Den kann ich sozusagen organisieren als ein 4K mal 1 Bit.
Ich kann mir also vorstellen, ich kann einen Chip kaufen, der kann 4K
mal 1 Bit und wenn ich dann 8 von denen hintereinander schalte, dann
habe ich entsprechend diese 8 Bit.
Also ich kann nicht immer das physikalisch kaufen, was ich logisch im
Speicher haben möchte.
Das muss ich mir dann so zusammenbauen, von daher ist das dann so
gemeint 4K mal 1 Bit und davon brauche ich 4 oder ich habe 4K mal 4.
Da bräuchte ich dann 2.
Macht das Sinn?
Gibt es da Fragen zu?
Wir müssen immer unterscheiden zwischen dem Logischen, wie mein
Speicher aufgebaut ist und dem Physikalischen, was ich als Chip kaufen
kann.
Und je nachdem, was ich kaufen kann, muss ich das so zusammensetzen,
dass es dem Logischen entspricht.
Also kann ich das hier kaufen, dann brauche ich 8 Stück davon, um das
hier zu bauen.
Irgendwelche Fragen zu dem, was wir bis jetzt durchgemacht haben?
Ich hoffe, es ist nicht zu schnell.
Gut, also Kapazität.
Das ist eine Sache, es geht immer um die Größe von Speichern, das
haben wir eben gesehen bei dem Eingangschart, wo der Speicher sehr
viel langsamer gewachsen ist.
Aber eine andere Sache ist die Geschwindigkeit.
Und die Geschwindigkeit wird bestimmt durch zwei Dinge, zumindest von
außen, wenn man auf den Speicher guckt, die Zugriffsgeschwindigkeit.
Die sogenannte Access Time, das heißt, wie lange dauert es, wenn ich
hier eine Adresse dranlege vom Prozessor, wenn die gültig ist, wie
lange dauert es, bis hier das Datum zur Verfügung steht, zurückkommt
sozusagen.
Das ist die Zugriffszeit.
Irgendwelche Ideen, worüber die Zugriffszeit bestimmt wird, warum die
nicht augenblicklich ist, was da so alles passieren könnte.
Es gibt ganz viele Komponenten, was da so passiert in dieser
Zugriffszeit.
Die Adresse muss dekodiert werden, völlig richtig, also das ist dieser
Teil, das dauert auch eine Zeit, das dauert ein paar Nanosekunden,
genau.
Was muss noch gemacht werden?
Die Adresse muss erstmal zerlegt werden in diese Spalten und in diese
Zeilen, das heißt, die muss auseinanderdividiert werden, wenn man so
will.
Das kostet eine gewisse Arbeit.
Und dann ist natürlich noch die große Frage, wie kommt dieses
Speicherelement oder diese Speicherzelle, wie kommt die von dort nach
da, die muss ja transportiert werden irgendwie.
Das heißt, ich muss die erstmal rausholen, ich muss die rausskopieren.
Ich muss erstmal sagen, okay, das liegt jetzt an, das Datum, aber
selbst wenn ich diese adressiert habe und sage, dich, mein, ich, dann
muss das noch rausgeholt werden und rausholen.
Und das sage ich mal umgangssprachlich, technisch gesehen ist das sehr
kompliziert.
Dadurch, dass ich das lese, zerstöre ich das.
Das ist auch ganz seltsam, wir haben ja sozusagen ein zerstörendes
Lesen.
Denn Lesen heißt nichts anderes als sozusagen messen oder
hereinschauen, was ist da drin.
Und wenn ich hereinschaue, dann messe ich.
Also physikalisch gesehen messe ich was und wenn ich was messe, nehme
ich immer etwas von dem, was ich messe, weg.
In diesem Falle nehme ich so viel weg, dass ich den Wert selber
zerstöre.
Das heißt, zerstörendes Lesen.
Und das passiert augenblicklich in Ihren vornensten Milliarden Mal pro
Sekunde oder so, Sie merken das nicht, aber jedes Mal, wenn etwas
gelesen wird, wird es zerstört.
Das heißt, ich lese etwas und ich muss es dann wieder verstärkt
zurückschreiben.
Aber es wird zerstört bei dieser Technologie, die wir uns hier
anschauen.
Wir schauen uns zwei verschiedene an.
Das heißt, da passieren also eine ganze Menge Dinge und deswegen
dauert es offensichtlich eine gewisse Zeit, eine sogenannte
Zugriffszeit, bis die Daten dann wirklich anliegen.
Und natürlich, teure Speicher haben eine geringe Zugriffszeit.
Je geringer die Zugriffszeit, desto weniger muss der Prozessor warten.
Aber es gibt noch eine andere Zeit, nämlich es gibt auch noch die
Zykluszeit.
Das heißt, ich kann nicht, nachdem ich die Daten gelesen habe, sofort
wieder Daten lesen, denn dieses Zurückschreiben, nachdem es zerstört
wurde, kostet auch wieder Zeit.
Ich muss also etwas warten und die Zykluszeit bestimmt dann die Zeit,
innerhalb der ich jeweils einmal auf den Speicher zugreifen kann.
Wenn es mir nur um ein Datum geht, interessiert mich die Zugriffszeit.
Ich gebe etwas hin, nach der Zugriffszeit kommt es zurück und die
Zykluszeit ist für mich interessant, natürlich wenn ich das öfters
machen will, das sagt mir, wie oft kann ich das pro Sekunde machen.
Das Ganze schaut jetzt so aus.
Wir haben hier also nochmal dasselbe, die Zugriffszeit hier und die
Zykluszeit.
Es liegt hier eine Adresse an und die Definition, das sage ich
nochmal, das hatten wir vor zwei Wochen oder sowas.
Wenn das Ganze hier weiß ist, dann heißt das, das ist gültig und das
heißt ab hier liegt eine gültige Adresse an.
Dann haben wir diese sogenannte Zugriffszeit und ab dieser
Zugriffszeit liegen die Daten hier an.
Dann ist aber noch Folgendes zu beachten, die Daten müssen erstmal
zurückgeschrieben werden, aber was hier zu sehen ist, die Daten müssen
natürlich auch für eine gewisse Zeit stabil dort anliegen, damit der
Prozessor diese übernehmen kann.
Also wir müssen dem Prozessor eine gewisse Zeit geben, zu sagen, die
Daten sind da, die Daten sind gültig, bitte nimm sie an, dann sind wir
hier und dann machen wir das, was ich eben noch gesagt habe und dann
kommen wir eben auf diese Zykluszeit.
Also die Zugriffszeit ist deutlich kleiner als die Zykluszeit, ganz
grob vielleicht so Doppelte oder sowas.
Und das sind die zwei wichtigsten Zeiten, die ich benötige für die
Performance eines Speichers.
Und es gibt natürlich noch viele, viele mehr Zeiten, die die Interna
des Speichers betreffen, aber von außen gesehen sind das sozusagen die
Kenndaten, wie vielleicht von einem Auto die Höchstgeschwindigkeit
oder Beschleunigung oder sowas.
Gut, also das wären Zugriffszeit und Zykluszeit eines Speichers.
Jetzt gibt es viele, viele verschiedene Speicher und das ist auch
nicht vollständig das Ganze.
Es gibt unzählig verschiedene Arten von Speichern, aufgemalt sind hier
mal Halbleiterspeicher.
Vielleicht sollten wir erstmal klären, was sind überhaupt Halbleiter?
Wir haben es die ganze Zeit mit Halbleitern zu tun.
Und wir kommen dann nachher auch noch zu Transistoren, das sind
Halbleiter -Transistoren.
Vielleicht komme ich da später zu, unterhalten wir uns dann noch
drüber.
Also es geht um Halbleiter-Speicher.
Was Halbleiter sind, klären wir dann gleich noch.
Dann gibt es Festwertspeicher und Schreib-Lese-Speicher.
Ein Festwertspeicher ist ein Speicher, da kann ich selber nichts
reinschreiben.
Hat irgendjemand schon was für mich reingeschrieben, macht das Sinn?
Wofür kann ich ein Festwertspeicher gebrauchen?
Ein Speicher hat für mich schon jemand was reingeschrieben, aber als
End -User kann ich das nicht.
Okay.
Ein BIOS, also es gibt ein Programm, das läuft im Rechner ab.
Wenn ich den Rechner einschalte, das ist immer dasselbe beim Booten,
wie Sie richtig sagen.
Und das brauche ich selber nicht verändern können, das ist fest
gespeichert.
Und das hat der Hersteller, das Rechner ist entsprechend so
programmiert.
Keine Notwendigkeit, hier irgendwelche Veränderungen vorzunehmen.
Das Gute, und dann könnte man natürlich auch sagen, warum macht man da
nicht alles in Festwertspeicher?
Festwertspeicher haben natürlich die Eigenschaft, wenn man den Rechner
abstellt, und Sie sagten ja, man stellt den Rechner an, dann ist es
da, die brauchen keinen Strom, die Festwertspeicher.
Das heißt, die speichern die Daten, ohne dass ein Strom vorhanden ist,
während die anderen Halbleiterspeicher, die RAM-Speicher, die wir
später hier besprechen, die Schreib-Lese-Speicher, diejenigen sind,
wenn ich den Rechner abschalte, gehen mir die Daten verloren.
Das heißt, hier gehen sie nicht verloren, ich habe keinen großen
Leistungsverbrauch, viel kleineren, und hier gehen sie verloren.
Die sind aber dafür viel schneller.
Also es macht irgendwo Sinn, diese Aufteilung hier zu haben.
Und jetzt gibt es eben noch, gehen wir erstmal auf diesem Ast hier
drüben weiter, die Festwertspeicher, es gibt solche, die sind
irreversibel und reversibel, es gibt welche, die kann man dann doch
noch umprogrammieren, also ich nicht als End-User sozusagen, aber der
Hersteller könnte schon hergehen, nicht während des Betriebes, aber
wenn er den Chip rausnimmt und den reversibel umprogrammieren, da gibt
es so Geräte für, um das Ganze umzuprogrammieren, dauert eine Zeit,
dauert Minuten, also ist nichts für den Betrieb, aber kann man machen.
Und es gibt welche, die sind dann wirklich so, egal, die kann man
nicht verändern.
Und auch die unterscheiden sich dann wieder im Leistungsverbrauch, im
Zugriffszeit und so weiter.
Und auch in der Integrationsdichte.
Wenn wir jetzt hier rübergehen, in die Speicher, das sind eigentlich
die Interessanten, die wir heute anschauen wollen, die Schreib-Lese
-Speicher, also wo ich selber als Benutzer den Rechner nutze, den
Rechner programmiert, kann ich das schreiben und lesen und da gibt es
eben die statischen und die dynamischen.
Und was ich eben gesagt hatte, dass die Daten verloren gehen, das sind
diese hier, das sind die dynamischen.
Das heißt, die müssen dynamisch wieder aufgeladen werden.
Also kann man sich wirklich vorstellen wie eine Batterie, die eine
gewisse Leistung gespeichert hat, nur dass die Leistung hier sich
verflüchtigt innerhalb von Millisekunden und ich diese wieder aufladen
muss, und eine Batterie offensichtlich länger und wohingegen die
statischen Speicher, da brauche ich nur eine Spannung.
Das heißt, der Stecker im Rechner muss an sein sozusagen, der Rechner
muss angeschaltet sein, dann sind die Daten vorhanden, aber sie
brauchen nicht dauernd wieder intern zurückgeschrieben werden.
Und auch wenn ich hiervon lese, von diesen statischen, dann werden
diese nicht zerstört.
Das kann ich lesen, das ist ein logischer Wert und der bleibt auch
erhalten.
Also das ist eine ganz wichtige Sache, dass man das versteht, was hier
dynamisch meint.
Und es gibt noch viele Dinge, die an sich hier drunter sind.
Es gibt auch Nicht-Halbleiterspeicher, also Speicher, die aus anderen
Materialien hergestellt sind.
Und gerade in letzter Zeit, so in den letzten zehn Jahren, gibt es da
sehr viele neue Entwicklungen aus der Physik, die auch teilweise schon
in Rechnern vorhanden sind.
Die zeichnen sich dann aus durch höhere Speicherdichte, durch höhere
Zugriffszeiten, also durch Kompromisse.
Diese ganze Sache, dieser ganze Entwurfsraum, den wir gesehen haben
zwischen Größe und Zugriffszeit, da gibt es so viele Nuancen
dazwischen, da hat man quasi für jede Art von Zugriffszeit oder für
jede Zugriffszeit und für jede Größe hat man unterschiedlichen
Speicher, den man einsetzen kann.
Deswegen gibt es so viele verschiedene Speicher in einem Rechner.
So, und jetzt wollen wir uns mal anschauen.
Jetzt kommt sozusagen ein Exkurs, wenn man so will, in
Halbleiterphysik.
Ich habe selber so eine Vorlesung gehört, die dauert an sich zwei
Semester und ich habe hier zwei Folien dafür.
Mehr passt hier nicht rein in diese Vorlesung.
Aber um was geht es?
Es geht um einen Transistor.
Letzten Endes wollen wir schalten, wir wollen speichern, wir wollen
auf Speicherzellen zugreifen und um auf diese zuzugreifen, brauchen
wir einen Schalter und ein Transistor ist ein Schalter.
Und wie ist so ein Transistor aufgebaut?
Und hier geht es um einen Transistor, in diesem Falle um einen N
-MOSFET Transistor.
Und wenn wir uns den mal Stück für Stück anschauen, also erst schauen
wir uns mal dieses Teil hier an, dieses weiße, das ist ein Halbleiter.
Und deswegen an Sie mal die Frage, was ist Ihr Verständnis, was ist
ein Halbleiter?
Ich werde es Ihnen dann natürlich noch sagen, keine Frage, aber ich
hätte nur mal so eine Idee, was Sie sich darunter vorstellen im
Moment, ein Halbleiter.
Hat hier irgendjemand eine Idee?
Ich meine, gehört hat es jeder schon, haben wir eben gesehen, auf der
Folie stand Halbleiter Speicher oder Nachrichten hört man Halbleiter
Industrie oder irgend sowas.
Was ist ein Halbleiter?
Wenn Sie es nicht wissen, einfach eine Vermutung, machen wir es
zusammen, dann können wir es uns besser merken am Ende, wenn wir es
zusammen hier leiten.
Möchte irgendjemand sagen?
Also einfach wörtlich, es ist ein Halbleiter sozusagen, ja, es ist
etwas, was nicht wie ein Metall sehr gut den elektrischen Strom
leitet, mit niedrigem Widerstand.
Es ist aber auch nicht etwas, was, wenn man eine Spannung dran legt,
isoliert.
Es ist kein Isolator, es ist kein Leiter, es ist ein schlechter Leiter
und ein schlechter Isolator, es ist beides, es ist irgendwas
dazwischen.
Letzten Endes ist es eine Definition, wie groß der Widerstand, der
spezifische Widerstand ist, oder umgekehrt der spezifische Leitwert,
und je nach Situation kann dieses Material leiten oder isolieren, also
nicht leiten.
Und das ist eine sehr gute Eigenschaft, die man sich hier zunütze
macht.
Frage, kennen Sie irgendwelche Halbleiter, also Periodensysteme der
Elemente, welche der Elemente sind dort als Halbleiter ausgezeichnet?
Das könnte man nur aus Chemie noch wissen.
Silizium, genau, das ist zum Beispiel das, das meistbenutzte, und auch
in diesem hier ist ein Silizium gemeint, ein anderes wäre Germanium,
das ist auch noch bekannt als ein Element des Periodensystems der
Elemente.
Es gibt aber auch Verbindungshalbleiter, wie zum Beispiel Gallium
Arsenid.
Beides sind keine Halbleiter, aber die Verbindung aus Gallium Arsenid
ist zum Beispiel ein Halbleiter.
Was heißt das?
Das heißt im Prinzip, wir haben ein Material, das je nachdem, was wir
mit dem Material tun, kann es leiten oder nicht leiten.
Und das ist eigentlich die geniale Eigenschaft davon.
Und ich kann das Ganze dadurch noch ein bisschen beeinflussen, dass
ich dieses Material dotiere.
Das heißt, ich bringe Atome eines anderen Elementes mit ein, sodass
ich einen Überschuss von Ladungsträgern habe und Ladungsträger sind
zum Beispiel in diesem Fall Elektronen und kann es damit mehr oder
weniger leitend machen im Normalzustand, kann aber jeweils durch den
Zustand, in dem ich es betreibe, dafür sorgen, dass es leitet oder
dass es sperrt.
Und das ist das Geniale dabei.
Und jetzt haben wir uns überlegt, okay, hier gibt es ein
Halbleitermaterial, das ist dotiert, das hat bestimmte zusätzliche
Atome, die es mehr oder weniger leitend macht und durch äußere
Einflüsse kann ich dafür sorgen, dass es nun ganz leitet oder ganz
sperrt.
Und dafür gucken wir uns jetzt nochmal dieses an.
Dieses ist einfach ein Kondensator.
Ein Kondensator ist einfach ein Element, wo ich eine Spannung einlege,
eine elektrische Spannung plus minus.
Ich habe zwei Platten, sonst nichts.
Ein Kondensator besteht schon wirklich so einfach aus zwei
metallischen Platten.
Ich brauche absolut nichts außer zwei metallischen Platten.
Das kann hier ein Metall sein und das kann derselbe Metall sein.
Hier lege ich eine Spannung an, hier zwischen ist Luft, dann habe ich
schon einen Kondensator.
Das ist der einfachste Kondensator, den ich mir bauen kann.
Die Sache mit einem Kondensator ist, dass ihr einerseits Energie
speichern kann, da ja positive und negative Ladungsträger trennt, aber
was hier wichtig ist, da ist ein elektrisches Feld.
Sie sehen diese Pfeile, die sollen andeuten, das ist ein elektrisches
Feld.
Ein elektrisches Feld hat eine Richtung, das heißt es geht hier in
diesem Fall von Plus nach Minus, da ist ein Feld.
Und dieses Feld, darum geht es hier in diesem Fall, dieses Feld liegt
nämlich genau an, hier ist nämlich ein Kondensator, wo ich hier diese
eine Platte habe, das ist die eine Platte und der Rest ist die andere
Platte.
Und dieses elektrische Feld, und das ist der Trick bei diesem
Transistor, dieses elektrische Feld steuert, ob dieser Kanal leitend
oder nicht leitend ist.
Also ob dieser Halbleiter, wie ich eben sagte, der kann leiten oder
nicht leiten, je nachdem, ob ich hier ein positives oder negatives
elektrisches Feld habe, fließen hier Elektronen oder nicht.
Das ist sozusagen ausgedrückt in drei Minuten, wie ein
Halbleitertransistor funktioniert.
Gesteuert durch ein Gate, ein Gatter, wo eine Spannung anliegt und
dann fließt ein Strom von hier nach hier oder eben nicht.
Oder wenn ich es jetzt auf logische Ebene umsetze, ich setze hier noch
eins dran und wenn ich hier noch eins dran setze, dann schaltet der
durch.
Damit kann ich eine logische Tabelle dann aufbauen.
Also das ist die Definition eines Schalters in Form eines, in diesem
Fall, NMOS-Transistors.
Ich weiß nicht, inwieweit das verständlich war, in sehr kurzer Zeit zu
erklären.
Da steckt natürlich sehr viel Physik dahinter, wie das funktioniert
und wie diese Elektronen hier, wie man sagt, durchtunneln, da gibt es
Wahrscheinlichkeiten, solche Dinge, und wie man so ein Material
dotiert.
Aber vom reinen Verständnis kann man sich das so sehr gut merken.
Ein Halbleitermaterial, was dotiert ist, was ein bisschen mehr
elektrische Ladungsträger hat.
Und dieser Fluss, der kann ganz abgeschnitten werden oder eben
begünstigt werden durch diese Spannung, die hier anliegt, die letzten
Endes einen Kondensator darstellt.
So einen simplen Kondensator mit einem elektrischen Feld dazwischen.
Und was heißt das ganze Ding hier?
Das heißt Metall, das ist das Metall hier oben, hier ist ein Oxid,
Semikonduktor, hier ist der Semikonduktor und hier heißt
Feldeffekttransistor.
Das ist nämlich genau dieser Feldeffekt, dieses elektrische Feld, was
diesen Transistor steuert.
Also Metall, Oxid, Oxid ist im Prinzip das, was hier im Kondensator
dazwischen ist, das kann Luft sein, das ist in diesem Fall der Oxid,
um es kleiner zu machen.
Feldeffekttransistor.
Und das ist an sich, könnte man sagen, eine geniale Erfindung.
Jeder ihrer Rechner oder Telefone, was auch immer, funktioniert mit
diesem Transistor als Basiselement.
Nicht nur kann man damit schalten, man kann damit auch eben auf
Speicherzellen zugreifen.
Man kann damit Wahlstabellen bauen, man kann damit, also hier ist auf
diesem Teil, auf so einem MOSFET, ist alles aufgebaut, was wir heute,
sag ich mal, im Rechnerbau kennen.
Gibt es dazu noch generelle Fragen?
Mir ist schon klar, dass man das nur schlecht in fünf Minuten erklären
kann, aber ich hoffe, ich habe es zumindest umgangssprachlich so
erklärt, dass man nachvollziehen kann, nicht quantitativ, aber
qualitativ, wie es funktioniert.
Es ist einfach ein Schalter, der, wenn hier eine Null oder Eins, also
eine niedrige oder hohe Spannung anliegt, hier durchschaltet oder eben
sperrt.
Das ist die ganz vereinfachte Version dessen, was wir hier sehen.
Ist das okay, oder irgendwelche Kommentare, Fragen?
Gut, dann gibt es verschiedene Arten von Transistoren.
Man möchte natürlich verschiedene Logiken aufbauen.
Man kann sich vorstellen, da liegt eine Null an und dann leitet der,
oder da liegt eine Eins an und dann leitet der.
Und das ist genau das, was wir hier haben.
Wir haben hier einen NMOS-Transistor, der funktioniert so, wenn ich
eine Null habe, dann ist der Schalter offen.
Wenn ich eine Eins habe, leitet der und bei dem ist es genau
umgekehrt.
Also es sind zwei Inverse.
Bei dem einen leitet er, wenn er Null ist, bei dem anderen leitet er,
wenn er Eins ist und umgekehrt.
Und das Gate ist immer das, wo ich mit steuere, wo ich sage, ob er
leiten oder schließen soll.
Und Source und Drain sind die beiden Pins, die dann eben verbunden
werden.
Jetzt kommt ein komplizierteres Ding.
Jetzt bauen wir eine Speicherzelle auf und das ist eine statische
Speicherzelle.
Ich mal ein bisschen drinnen in dieser Speicherzelle.
Was Sie hier sehen, ist einer dieser Transistoren.
Wir haben jetzt hier insgesamt sechs, wir schauen uns aber erst mal
vier an.
Wir haben hier eins, oder fangen wir hier an, null, eins, zwei, drei
Transistoren.
Und die kann man jetzt logisch aufteilen, damit man das besser
versteht, in zwei Gruppen.
Es gibt jetzt die eine Gruppe, die linke und die rechte.
Und das sind jeweils zwei Inverter.
Das Problem ist, ich könnte mit einem Transistor schon einen Inverter
aufbauen.
Also ein Inverter, ich gebe eine Eins rein, eine Null kommt raus.
Das Problem ist, ich hätte immer noch Lackströme.
Was ich praktischerweise mache, ich schließe einen NMOS Transistor mit
einem PMOS Transistor in Reihe.
Das heißt, ich habe immer zwei Transistoren, die in Reihe geschaltet
sind.
Wenn der leitet, schließt der und umgekehrt.
Das hat den großen Vorteil, wenn ich zwei Transistoren anstatt einen
nehme, dass absolut kein Strom fließt.
Hätte ich nur einen Transistor, würde trotzdem noch ein kleiner Strom
fließen.
Ich habe also zwei Komplementäre, nichts anderes habe ich hier
gemacht.
Ich habe hier einen NMOS Transistor, PMOS Transistor in Reihe
geschaltet und habe damit einen Inverter.
Jetzt habe ich auf der anderen Seite noch so einen Inverter.
Hier ist auch ein NMOS, hier ist auch ein PMOS Transistor und ich habe
zwei Inverter.
Und ich kopple die Kreuz, die sind kreuzgekoppelt.
Das heißt, wenn ich hier eine Eins draufgebe, leite dieses Teil,
dieser sperrt.
Gebe ich hier eine Null drauf, ist es umgekehrt und das Ganze ist
stabil.
Das heißt, das switcht sich immer um.
Wenn ich hier einen Wert draufgebe, klicken die sich immer um.
Der ist 0, der ist 1, der ist 1, der ist 0.
Das ist komplett stabil.
Das heißt, ich brauche kein Signal mehr anzulegen haben.
Ich brauche nur noch Stromversorgung zu haben, aber ich brauche kein 1
oder 0 Signal mehr anzulegen haben.
Das Datum wird gespeichert.
Das ist eine elementare Speicherzelle aus zwei Invertern, die
kreuzgekoppelt sind, die nur einen Bit speichern und diese stabil
speichern, ohne dass am Eingang ein positiver oder negativer Wert
anliegen muss.
Der muss nur einmal anliegen, dann geht der Inverter in einen Zustand,
der andere in den Inversenzustand und verbleibt dort.
So lange, bis sich der Wert am Eingang ändert.
Das heißt, ich brauche jetzt für diese statische RAM-Zelle, die den
Wert hält, brauche ich offensichtlich 1, 2, 3, 4 Transistoren und ich
brauche noch zwei Transistoren, die sozusagen den Weg freimachen, ein
Signal, was hier hereinkommt, anzunehmen.
Dieses Signal, was da hereinkommt, ist zum Beispiel, bitte schreibe
folgenden Wert.
Also wenn der Prozessor hier irgendwo reinkommt und sagt, okay, wir
möchten einen Wert schreiben, dann ist das sozusagen die Tür, die
geöffnet werden muss, um diesen Wert hier reinzulassen.
Ist diese Tür hier nicht geöffnet, dann sagt man, das Ganze ist
hochohmig und wie gesagt, der Wert bleibt erhalten, der Wert bleibt
stabil erhalten.
Kommt hier allerdings eine 0 oder eine 1 rein, dann wird entsprechend
der Rangfolge eine 1 oder 0 geschaltet und hier wird es entsprechend
inverse geschaltet.
Ich kann natürlich auch von dieser Seite hier zugreifen, aber das ist
das generelle Prinzip.
Ich habe eine logische Schaltung von zwei inversen Schaltern, die
einen 1-Bit-Wert ohne Refresh speichern.
Kann man das verstehen?
Irgendwelche Kommentare dazu?
Vielleicht ein bisschen drüber nachdenken und gehen wir das nächste
Mal nochmal drüber
und behalten uns einfach mal so weit für die heutige Vorlesung.
Wir benötigen sechs Transistoren, um einen Bit zu speichern, um einen
Bit so zu speichern, dass es nicht flüchtig ist.
Das Ganze nennt man dann eine statische SRAM-Zelle und entsprechend
brauche ich dann für einen Megabit um sechs Millionen Transistoren
eine ganze Menge.
Deswegen gibt es auch noch dynamische Speicher, wo ich weniger
benötige, anstatt sechs Transistoren nur einen Transistor, also sechs
Mal so effizient sozusagen.
Und das gucken wir uns jetzt genau hier an.
Hier ist das Gegenstück des Ganzen.
Letzten Endes wollen wir wieder ein Bit speichern, aber jetzt ist es
andersherum.
Jetzt speichern wir dies nicht im Zustand von einem Inverter, sondern
wir speichern ein Bit in einer Kapazität.
Hier soll das Bit gespeichert werden in einer Kapazität, in einem
Kondensator.
Und der Transistor, den wir hier haben, wir schauen uns nur den
unteren Teil an, dieser Transistor, der dient nur dazu, auf diese
Kapazität zuzugreifen.
Also stellen Sie sich einen Transistor immer nur als Schalter vor,
denn nichts anderes ist es als ein Schalter, der den Zugang zu diesem
Transistor hier ermöglicht oder wenn hier eine andere Spannung
anliegt, je nachdem ob es ein N- oder P-MOS-Transistor ist, hier eben
der Schalter geöffnet ist.
Nichts anderes ist das.
Das heißt, in diesem Kondensator ist eine Ladung gespeichert und die
Größe der Ladung gibt an, ob es logisch eine 0 oder 1 ist.
Und das Problem ist, dass diese Ladung hier wegfließt.
Es gibt hier Leckströme, das sind keine perfekten, idealen
Kondensatoren, sondern hier fließen Ströme durch, die eigentlich nicht
durchfließen dürften, weil das Ganze so klein ist und da die Ladung
auch so klein ist, die besteht nur teilweise aus wenigen 10.000
Elektronen.
Na gut, vielleicht 100.000 bei neueren Technologien, nur wenige
tausend, teilweise nur wenige hundert Elektronen.
Das heißt, wenn da ein paar wegfließen, wie man sagt, als Leckströme,
dann ist die Ladung nicht mehr vorhanden und der Wert, den ich vorher
definiert hatte als 1, scheint dann eine 0 zu sein.
Das heißt, deswegen müssen wir hier einen Refresh machen.
Und genau das wird hier eben gemacht und dafür ist hier oben das, aber
da kommen wir gleich in der nächsten Folie noch zu.
Aber jetzt kann man Folgendes festhalten.
Ich sage mal so, die Vorlesung ist natürlich nicht gedacht, dass man
diese ganzen Sachen, was ich hier als Transistor erklärt habe, dass
man das wirklich quantitativ versteht, überhaupt keine Frage, sondern
nur qualitativ.
Nehmen Sie es als gegeben.
Und was wir aber festhalten wollen, ist Folgendes.
Der Platzbedarf dieser S-Ramm-Zelle, dieser dynamischen Zelle, ist ein
Viertel des Platzbedarfs der S-Ramm-Zelle.
Also wenn ich diese Transistoren nicht mitzähle, also wenn ich nur
diese Zelle zähle.
Wenn ich nur die Zelle selber zähle, habe ich hier vier und hier habe
ich einen Transistor.
Und hier haben wir natürlich wieder die Bitlines.
Also nur, dass wir das auch wieder richtig hinkriegen.
Ich gehe jetzt noch mal zurück, dass wir hier den roten Faden nicht
verlieren.
Hier haben wir Zeilen, hier haben wir Spalten.
Und diese Zeilen und Spalten sind genau das.
Das sind genau diese Zeilen, die wir eben in der Matrix gesehen haben
und die Spalten.
Das ist nichts anderes, nur reingezoomt sozusagen.
Und genau das sehen wir auch hier.
Hier haben wir wieder so eine Zeile und hier kommen noch ganz viele.
Und hier haben wir so eine Spalte.
Also B ist die Spalte und A ist die Zeile.
So, wie geht man da jetzt vor?
Jetzt möchte man sowas lesen.
Lesen heißt immer messen.
Und messen heißt, das kommt aus dem Lateinischen, das heißt
vergleichen.
Wenn ich irgendwas messe, vergleiche ich immer zwei Dinge miteinander.
Messen heißt vergleichen.
Und da kommt dann raus, das ist größer oder kleiner oder gleich eines
Vergleichswertes.
Ich messe also, ich habe einen Wert.
Aber wenn ich messe, nehme ich von der Größe, die ich messen möchte,
etwas weg.
Denn ich kann nur messen, wenn ich etwas wegnehme, sonst könnte ich
nicht messen.
Das ist das generelle Dilemma, wenn man misst.
Und das ist generell so in der Physik.
Ich messe etwas, ich nehme etwas weg.
In diesem Fall möchte ich messen, wie groß ist die Ladung, die hier
vorhanden ist.
Hat die einen gewissen Schwellwert, den ich definiert habe als
logische 1?
Oder liegt diese darunter?
Und wenn ich dies eben tue, dann passiert Folgendes.
Stellen Sie sich vor, hier habe ich eine Ladung.
Elektrische Ladungen sind Elektronen, die sind hier drauf, auf diesem
Kondensator.
Nehmen wir an, dieser Transistor hier ist geschlossen.
Das heißt, ich greife darauf zu.
Dann habe ich hier eine Leitung.
Auf dem Blatt ist die Leitung nur ein Strich.
In der Physik stellt diese Leitung selber auch wieder eine Kapazität
dar.
Also etwas, das Leitungsträger aufnehmen kann, das Leitungsträger
speichern kann.
Das heißt, diese Leitung selber stellt schon wieder eine Kapazität
dar.
Und wenn diese Kapazität nun genauso groß ist wie hier, übernimmt die
diese Kapazität und was ich hier oben messen will, dann ist nichts
mehr vorhanden sozusagen.
Also es gibt nichts mehr, was ich messen kann.
Ich könnte sozusagen sagen, wenn ich zu dem Punkt komme, wo ich messen
möchte, ist die Ladung schon nicht mehr vorhanden.
Also ich kann nicht mehr sagen, war es eine 0 oder war es eine 1.
Also muss ich verschiedene Dinge machen.
Ich muss diese Ladung, ich muss diese Leitung erstmal vorladen.
Das heißt, ich muss diese Kapazität der Leitung erstmal füllen, damit
sie nicht später mit dieser Ladung, dieser Kapazität gefüllt wird.
Und dann vergleiche ich, dann mache ich den Schalter hier auf und
dann, und das ist das Wichtige, dann schaue ich, ob hier wirklich noch
ein Strom fließt.
Fließt hier dann wirklich noch ein Strom, den messe ich dann hier oben
mit einem Transistor und wenn ich dort einen Strom messe, dann war es
eine 1 und wenn ich keinen Strom mehr messe, dann war es eine 0.
So einfach ist das.
Das heißt, dieser Transistor hier oben, den denken wir uns einfach mal
nur als Messgerät, der stellt einfach nur fest, ob hier ein Strom
fließt, ob Ladungsträger fließen.
So, eine Sekunde.
So, jetzt haben wir Folgendes gemacht.
Wir haben durch das Messen, ich hoffe, das ist so klar geworden, durch
das Messen haben wir diese Ladung entnommen, die hier als Strom
hochgeflossen ist.
Das heißt, die ist nicht mehr da.
Ich habe gemessen und habe den Wert, falls dort eine Ladung vorhanden
war, zerstört.
Das ist nachher eine 0.
Also nach dem Lesen ist die 1 eine 0 geworden.
Das ist natürlich nicht im Sinn der Sache.
Ich muss also dafür sorgen, wenn ich da festgestellt habe, es war
tatsächlich eine Ladung da, dann muss ich auch dafür sorgen, dass ich,
nachdem ich den Wert ausgelesen habe, diesen wieder zurückschreibe.
Und das ist dieses zerstörende Lesen, das ich wiederherstellen muss,
nachdem ich gelesen habe.
Und deswegen ist eben auch die Zugriffszeit, wie ich schon gesagt
hatte, die setzt sich auf verschiedenen Teilen zusammen, unter anderem
aus dem Teil, dass ich die Ladung wiederherstelle.
Das Ganze habe ich jetzt hier erklärt.
Das steht jetzt hier auf den Folien nochmal Schritt für Schritt
erklärt, so ein bisschen zum Nachlesen für zu Hause.
Also hier das Destructive Read.
Die Ladung geht durch Leckströme verloren.
Das heißt, auch wenn ich überhaupt nichts mache, selbst wenn dieser
Transistor hier immer geschlossen ist, fließen hier Ströme, da dieses
Material, dieser Kondensator oder dieser Zwischenraum dazwischen,
nicht perfekt isolierend ist, fließen dort Ströme.
Und wenn es nur ein paar Elektronen pro Sekunde sind, nach einer
gewissen Zeit sind die weg, da ist nichts mehr da.
Gut, aber der Riesenvorteil, ich brauche gerade mal einen Transistor,
um ein Bit zu speichern.
Aber wie Sie sehen, das ist ein Riesenaufwand, um das zu
bewerkstelligen.
Und das findet viele Milliarden Mal pro Sekunde in jedem Rechner
statt.
Man kriegt davon als Benutzer natürlich nichts mit.
So, jetzt haben wir die Integrationsdichte, die ist viermal höher.
Also wenn man nur die Speicherzelle betrachtet, Distractive Feed,
Lexströme.
Und das Lesen hatte ich auch schon erklärt, das erfolgt durch
Ladungsvergleich.
Die Leitung wird vorgeladen, hatte ich schon gesagt, mit einer
positiven Spannung.
Und dann misst sie diesen Strom, wie ich das eben erklärt hatte.
Und beim Messen fließt eben der Strom und dieser Strom entlädt den
Kondensator und der Kondensator ist leer und damit ist die Ladung
zerstört.
So, wie mache ich es beim Schreiben?
Jetzt sind wir umgekehrt, das Lesen hatten wir schon erklärt.
Beim Schreiben lege ich eine positive Spannung erstmal UGS an.
Das heißt, ich muss dafür sorgen, dass dieser Schalter hier geöffnet
ist, dass ich auf den Kondensator zugreifen kann.
So, und dann kommt es darauf an, liegt die Bitleitung B auf Masse,
dann werden Elektronen hier auf diese Drehzone gebracht und der
Speicherkondensator wird geladen.
Umgekehrt liegt das auf UB, hier ist schon UB, wenn dieses auch auf UB
liegt, wenn dieses auf UB liegt und dieses auf UB, da gibt es keine
Potentialdifferenz, das heißt, da haben die Elektronen keinen Weg, wo
sie hin können, da gibt es kein elektrisches Feld, das heißt, sie
fließen nicht.
Liegt dieser Punkt allerdings auf Minus und hier habe ich UB auf Plus,
dann fließen die Elektronen rein und laden den Transistor.
Das heißt, letzten Endes mit der Spannung, die ich hier auf das B
lege, kann ich bestimmen, ob dieser Transistor geladen wird oder
nicht.
Nicht heißt nur 0, geladen heißt nur 1.
Das ist reine Definitionssache natürlich.
Und mit dem Wert an A bestimme ich überhaupt, ob ich darauf zugreife.
Also das hat mit der Adresse zu tun, dass ich darauf zugreife, den
Schalter mache ich auf und auf B die Spannung bestimmt 0 oder 1, also
5 Volt oder 0 Volt, ob dieser Kondensator geladen wird oder eben
nicht.
Das ist das Schreiben der ganzen Sache.
Und wenn ich natürlich lese, mache ich offensichtlich auch Folgendes,
nach dem Lesen mache ich ein Schreiben.
Je nachdem, was ich gelesen habe, weil ich ja ein zerstörendes Lesen
habe, kommt danach auch noch ein Schreibzyklus.
Gut, also das wäre das Schreiben einer Speicherzelle.
Und jetzt schauen wir das Ganze mal ein bisschen im Größeren an.
Jetzt haben wir sozusagen immer hier reingeguckt, wie sieht dieses
Teil aus, was gibt es da für zwei Möglichkeiten.
Und jetzt ist die Frage, wie sieht der Speicher im Größeren aus, wie
ist der an den Computer angebunden und was gibt es da für Signale.
Wie bin ich den in mein Computersystem ein.
Sie sehen schon, der eigentliche Speicher nimmt einen gewissen Teil
an, der nimmt auch durchaus den größten Teil an, das ist jetzt nicht
maßstäblich gezeichnet.
An sich ist das schon der größte Teil und diese ganze Peripherie nimmt
nur ein paar Prozent ein.
Keine Frage, aber nichtsdestotrotz benötigen auch die Decoder und die
Leitungen, wir hatten ja gesagt, bei einem Megabit Speicher brauche
ich hier tausend Leitungen und hier brauche ich tausend Leitungen, das
nimmt durchaus gewissen Raum ein.
Und natürlich auch die Logik in den Decodern.
Und das ist eben so aufgebaut, dass ich hier einen Zeilendecoder habe,
also hier habe ich die Gesamtadresse, schauen Sie hin, auf dieser
Seite habe ich das A0 bis AN, also 32 Bit, die legen hier an und die
werden jetzt aufgeteilt in einen Decoder, der hier in die Zeilen
reingeht und einen Teil, der die Spalten hier adressiert.
Dann gibt es hier noch ein bisschen Steuerlogik für die verschiedenen
Signale, die dann sagen, ob ich von dem Chip lesen darf oder auf dem
Chip schreiben darf und es gibt natürlich noch diese Logik, die dafür
sorgt, dass die einzelnen Speicherzellen hier refreshed werden,
gelesen werden, das ist hiermit gemeint.
Also generell ist so ein Speicher aufgebaut.
Und jetzt schauen wir uns nochmal ein bisschen anhand eines Beispiels
ein, dass man sich das auch vorstellen kann.
Jetzt sehen wir an, wir haben keinen 1 Megabit Speicher, wir haben
einen 16 Bit Speicher.
Und bei diesem 16 Bit Speicher haben wir Zeilen, 4 Zeilen, 1, 2, 3, 4
Zeilen und 1, 2, 3, 4 Spalten.
Jetzt nehmen wir uns an, wir haben so einen super kleinen Computer,
der hat gerade mal 4 Bit Adressraum, also nicht 32 Bit, 4 Bit
Adressraum.
Da machen wir nämlich folgendes, wir haben diese 4 Bit hier, die zwei
MSBs, die benutzen wir für die Zeilenadresse.
Jetzt steht hier eine 0 und eine 1, das ist 2, das heißt wir meinen
die zweite Zeile.
0, 1, 2, also diese grüne hier, ist hiermit adressiert und die zwei
oberen Bits der Adresse sollen die Spalte wiedergeben.
Das heißt, hier haben wir eine 1 und eine 2, also eine 3, das ist dann
0, 1, 2, 3.
So ist das zu verstehen letzten Endes.
Wenn man das verstanden hat, dann versteht man den ganzen Rest, der
später kommt.
Das ist nur eine weitere Ausblittung in verschiedene Dinge, aber das
ist das einfache Prinzip.
Ich habe hier den Zeilendecoder, gebe hier in diesem super kleinen
Beispiel von 16-Bit-Speicher benötige ich für 4 Zeilen 2 Bit zum
Codieren und das ist nämlich genau dieser 1 aus N-Decoder.
Das heißt, eine von 4 Leitungen, also in diesem Fall wäre es ein 1 aus
4.
Einer von 4 ist immer aktiv, je nachdem, was hier für eine Adresse
anliegt.
Also eine 0, 1, 2 oder 3.
In diesem Fall ist es eine 2, die diese Zeile hier aktiviert.
Und genau dasselbe für die Spalte, das ist kein Unterschied, nur dass
andere Bits natürlich genommen werden, in diesem Fall die
höherwertigen Bits.
Und wir haben ja auch zufälligerweise so viele Zeilen wie Spalten.
Hier steht eine 3 drin und das logische 3 entspricht dann dieser
dritten Spalte in diesem Speicher hier.
Und das ist auch ein 1 aus N-Decoder, also ein 1 aus 4.
Eine Leitung von den 4 ist immer aktiv.
Das ist das ganze Prinzip.
Wenn man das verstanden hat, dann versteht man auch den ganzen Rest.
Das ist nicht komplizierter.
Außer, dass natürlich die Anzahl der Zeilen und Spalten kann
unterschiedlich sein.
Keine Frage, so Dinge kann man alle machen.
Aber das ist das einfache Adressierungsbeispiel eines Speichers hier.
Irgendwelche Fragen oder Kommentare hierzu?
Weil der ganze Rest baut darauf auf.
Und was ich hier drin habe, das interessiert mich in diesem Falle
nicht.
Das kann jetzt entweder eine SRAM-Zelle sein mit diesen 4 Transistoren
plus diesen 2 Transistoren zum Zugriff, also 6 Transistorzelle, oder
es kann diese 1 Transistorzelle sein mit diesem Kondensator.
Beides kann hier drin sein.
Das habe ich hier nicht spezifiziert.
Das ist eine Abstraktionsebene, wo beides drunter sein kann.
Von der Logik da drüber sieht das gleich aus.
Macht es Sinn so?
Wenn nicht, fragen Sie.
Gut, und jetzt kann man das natürlich noch beliebig weiter...
Ja, man muss es komplizierter machen natürlich.
Denn was wir hier nicht beachtet hatten, ist natürlich irgendein
Timing.
Hier gibt es keine Zeit.
Das ist rein logisch.
Und hier sagen wir zum Beispiel auch nicht, wie teilen wir denn die
Adresse in diesem Teil auf, in diesem Teil auf, dass hier alles ein
bisschen abstrahiert.
Und wir sagen auch nicht, wie lange dauert es, diese Teil hier
aufzuteilen und so weiter.
Und all diese Sachen, die kommen dann hier so mit rein.
Das heißt typischerweise, was ich mache ist, ich nehme diese gesamte
Adresse, die anliegt.
Hier oben liegt die Adresse an.
Und ich lege erstmal die Zeilen an.
Und dafür gibt es ein Signal, das nenne ich Row Access Signal.
Das heißt, ich gebe erstmal frei und sage, okay, adressiere zuerst mal
die Zeile.
Dazu muss erstmal dieser Teil extrahiert werden.
Da ist eine Logik für notwendig.
Und dann ist schon mal die Zeile adressiert.
Die sagt, okay, ich bin jetzt bereit.
Und dann, irgendwann muss man sagen, dass die Spalte auch angewählt
werden soll.
Also muss man aus diesen Adressen hier, aus diesem Adresswort, die
Spalten -Bits herausholen.
Das dauert dann auch wieder eine Zeit.
Und irgendwann sagt die Spalte, okay, ich bin bereit.
Und dafür gibt es ein Timing, und das haben wir in den nächsten
Folien, um uns das mal anzuschauen, wie das im Detail aussieht.
Und das sieht dann so aus.
Hier oben habe ich die Adresse.
Das ist nichts anderes, als was ich eben gesagt hatte.
Zeilen-Adresse, Spalten-Adresse.
Lassen wir uns zurückgehen, nur dass wir den Faden nicht verlieren.
Das ist genau das hier.
Das ist nichts anderes.
Das ist die...
Das ist die Zeilen-Adresse, das ist grüne.
Und das Blaue ist die Spalten-Adresse.
Und das ist nichts anderes hier oben.
Schauen Sie.
Hier die Zeilen-Adresse, ich hole mir die Bits raus.
Sage mit dem row-access-signal, bitte hole die Zeilen aus dem
Adresswort raus.
Sage ich hier.
Und wenn diese gültig angenommen sind, also adressiert sind, es dauert
ja eine Zeit, bis die Signale angekommen sind, dann sage ich, okay,
jetzt hol bitte die Spalten-Adresse raus, nimm die anderen Bits, also
nimm diese Bits, nimm diese Bits hier, und das passiert hier.
So.
Und jetzt habe ich schon die Hälfte der Arbeit gemacht.
Ich habe nämlich genau die Speicherzelle, die ich wollte, adressiert.
Durch die Zeilen erst, dann durch die Spalten.
Der Zugriff hat schon hier gestartet.
An dem Zeitpunkt, wo ich dem Chip gesagt habe, ich möchte auf dich
zugreifen, nämlich wo ich hier auf 0 gegangen bin, das ist ein inverse
Signal, 0 heißt immer, hier greife ich darauf zu.
Ab hier zählt die Zeit und bis zu dem Zeitpunkt, wo ich die Spalten
-Adresse angelegt habe, da dauert es noch so ein bisschen, bis ich die
Daten dann wirklich herausgeholt habe, das haben wir eben gesehen in
dem Teil, wo wir den Strom lesen mussten, das dauert hier noch eine
Zeit und dann liegen die Daten hier an.
Das heißt, ab dem Zeitpunkt liegen die Daten gültig an und ich kann
mit diesen Daten arbeiten.
Oder ich mache folgendes, ich sage, ich habe hier den Spaltenzugriff,
ich möchte die Daten jetzt aber schreiben, dazu müssen die Daten an
dem Eingang des Speichers anliegen, sodass ich diese dann, wie ich
eben erzählt habe, im Schreibzyklus diese Daten schreibe.
Und dann liegen die Daten so lange gültig an, bis die Daten auch
gültig übernommen wurden, weil das Schreiben dauert auch wieder eine
gewisse Zeit, nichts ist augenblicklich.
Und hier hätte ich eben genau diese Zugriffszeit, die wir eben, so
müsste es beschrieben haben, wie lange dauert das, hätten wir hier mal
näher reingeguckt, was damit genau gemeint ist.
Die Zeilenadresse liegt an, dann nach einer gewissen Zeit die
Spaltenadresse, dann liegen die Daten an und genau das ist die
Zugriffszeit hier.
Und so sieht typischerweise, das hatte ich schon öfters erwähnt, so
ein Datenblatt aus in eine Speicher- oder auch in einen
Mikroprozessor, so Timing-Diagramme und typischerweise bei den
Taktflanken, wo es von 0 nach 1 oder von 1 nach 0 geht, da passieren
Dinge, da werden Dinge übernommen.
Damit hätten wir dieses Row-Axis-Signal erklärt und dieses Column-Axis
-Signal und wir können dann, wie gesagt, lesen oder schreiben und mehr
sagt das an sich auch gar nicht.
Natürlich kann man sich jetzt überlegen, macht es Sinn, sage ich mal,
das erst in Zeilen und dann in Spalten, könnte man das nicht anders
machen.
Es gibt viele Möglichkeiten, dieses einfache Prinzip noch zu
verbessern, aber zumindest entspricht dies dem ganz einfachen
Speicher, wie er in einem normalen Computer, nicht optimierten,
funktioniert.
Also, das ist die Adressierung eines dynamischen Rabonsteins.
So, jetzt wird das Ganze aufgefrischt, sollen dynamischer sein.
Und da macht man nichts anderes, stellen Sie sich vor, bei dem
Auffrischen, ich hatte zwei Dinge gesagt, ich habe gesagt, wenn wir
von dem Speicher lesen, dann zerstören wir den Wert im Speicher,
müssen den also wieder auffrischen, aber selbst wenn ich mit dem
Speicher nichts tue, denn ich greife ja nicht in einer Sekunde jeweils
auf alle Speicherzellen vom Programm aus zu, selbst wenn ich, selbst
diese Speicherzellen, die ich nicht benutze in meinem Programm, die
muss ich natürlich auch die ganze Zeit wieder auffrischen, denn die
werden durch Leckströme ebenso gelöscht.
Und das passiert in Millisekunden, typischerweise im Refreshzyklus ist
50 Millisekunden, das heißt pro Sekunde muss mein gesamter Speicher,
der vielleicht aus einem Gigabyte besteht, muss der 20 Mal wieder neu
geschrieben werden, stellen Sie sich das vor.
Eine Milliarde Speicherzellen pro Sekunde werden je 20 Mal neu
geschrieben.
Also das ist alles das, was passiert in einem Rechner, wo man als
Programmierer überhaupt nichts von mitbekommt, was alles die
Elektronik im Hintergrund macht.
Und das passiert genau hier, ich habe das Auffrischen des dynamischen
Rahmens, ich mache nichts anderes, als dass ich hier so eine Zeile
anlege und so tue, als würde ich dort einen Wert reinschreiben und
zwar genau den Wert reinschreiben, den ich zuvor ausgelesen habe, aber
eben nicht als Programmierer ausgelesen habe, sondern das macht die
Hardware für sich die ganze Zeit.
Die geht also Spalte für Spalte durch und das 20 Mal in der Sekunde,
liest diese Werte in die Peripherie und schreibt diese Werte wieder
zurück.
Ich finde es zumindest faszinierend, als ich selber das erste Mal so
gehört hatte, was alles in einem Rechner passiert, was man als
Programmierer überhaupt nicht mitbekommt, was die Elektronik sozusagen
alles macht, dieses Refreshen.
Da braucht sich niemand drum kümmern, da braucht sich auch der
Hardware Architekt nicht drum zu kümmern.
Also wenn man einen Rechner baut, braucht man sich um diese Dinge
überhaupt nicht zu kümmern, weil die sind auf dem Speicher, ist diese
Logik, die dieses Refresh macht, schon mit integriert.
Man braucht den nur noch an die Spannung anschließen und dann
funktioniert das alles.
Aber diese 20 Mal pro Sekunde, das passiert automatisch.
Also nichts etwas, was wir hier lernen, was man selber implementieren
müsste oder so.
Aber man soll das zumindest wissen.
So, was kann man noch machen?
Hier ist nämlich genau das nochmal herausgeholt, Aufbau der
Aufrischlogik.
Hier haben wir diese Speicherzellen.
Hier müssen wir uns vorstellen, das geht hier ganz weit nach rechts
weiter.
Das ist so eine Zeile, das soll so eine lange Zeile sein.
Und da wird genau das gemacht.
Es gibt hier sogenannte Operationsverstärker.
Das sind elektronische Bauteile, die einen elektrischen Strom
verstärken.
Das heißt, es kommt ein gewisser Strom rein, der kommt verstärkt hier
raus, der wird hier gelesen.
Und je nachdem, was da gelesen wird, wird er auf diesen Wert wieder
hier zurückgeschickt.
Das heißt, es kommt natürlich ein niedriger, kleiner Wert hier rein,
weil der durch Leckströme schon minimiert wurde, diese Ladung.
Es kommt vielleicht hier eine Ladung rein von ein paar PicoFarad und
vielleicht von 50 PicoFarad wird dann zurückgeschrieben.
So muss man sich das vorstellen.
Und das passiert hier Zeile für Zeile, 20 Mal pro Sekunde.
Gut, und jetzt kann man das Ganze beschleunigen.
Es gibt viele Möglichkeiten, das, was wir hier gesehen haben,
schneller zu machen.
Das ist das, sage ich mal, Hausbackene, wie man es machen würde, wie
man es lernt, wie es funktioniert.
Und jetzt gibt es halt Möglichkeiten zu sagen, man kann das schneller
machen.
Und was ist eine Möglichkeit, das schneller zu machen?
Schneller machen, zum Beispiel, was ich eben schon sagte, warum soll
ich nur auf ein Wort zugreifen?
Warum greife ich nicht auf viele Worte hintereinander zu?
Denn die Worte sind ja in dieser Zeile, in dem Speicher vorhanden.
Und wenn ich den einmal adressiere, warum soll ich den nochmal
adressieren?
Warum hole ich nicht diese gesamte Zeile daraus?
Denn Programm hat es typischerweise von der Lokalität her gesehen,
dass ich auf Speicherzellen zugreife, die im Umfeld einer
Speicherzelle liegen, die ich gerade bearbeitet habe.
Sagen wir, ich bearbeite zum Beispiel ein Feld, in dem ich Werte
sortieren möchte.
Und von daher macht es dann Sinn zu sagen, okay, ich lade verschiedene
Worte hintereinander, was habe ich denn da für einen Vorteil, wenn ich
die hintereinander mache?
Dass wir das nochmal zusammenkriegen mit dem, was wir gerade gesagt
haben.
Eigentlich habe ich es schon ein paar Mal gesagt, aber was hat das für
einen Vorteil, wenn ich verschiedene Worte in einer Zeile zusammen
hintereinander auslese?
Was hat das für Vorteile?
Genau, eine kleine Korrektur.
Ich muss nur einmal die Zeile machen.
Nur einmal die Zeile muss ich lesen oder anlegen, denn die Spalten
sind ja dann immer unterschiedlich.
Aber die Zeile, die habe ich gespart, weil die immer dieselbe ist.
Und genau das mache ich hier letzten Endes.
Sie sehen, letzten Endes ist das nichts anderes, als das, was wir
vorher gesehen haben.
Es klickt hier einmal die Zeile an.
Und Sie sehen, hier geht das Row Access Signal, das Zeilensignal, das
geht hier einmal runter.
Hier wird die Zeile, die Bits, die werden entnommen, werden angelegt.
Und Sie sehen, die Kalm, also die Spalte, die ändert sich.
Die erste Spalte, zweite Spalte, dritte Spalte, vierte Spalte.
Und hier habe ich vier Zellen hintereinander ausgelesen.
Datum 1, Datum 2, Datum 3, Datum 4 oder was auch immer.
Und nur einmal das.
Das heißt, wie viel Prozent hätte ich hier gespart?
Wenn ich hier 1, 2, 3, 4 habe, im Gegensatz zu dem anderen, wie viel
Prozent hätte ich da gespart?
Wie viel Prozent hätte ich da gespart?
Also ganz grob.
Ich will es jetzt nicht auf Nanosekunden hören, aber ganz grob.
Einfach nur von dem Schema hier oben kann ich ablesen, wie viel
Prozent ich bei diesem Schema hier gespart habe.
Einmal Zeile, viermal Spalte.
Was hatte ich vorher?
Einmal Zeile, einmal Spalte.
Also viermal Zeile, viermal Spalte, also 8 zu 5.
Das ist das, was ich hier gespart habe.
Oder 5 zu 8, je nachdem, wie man will.
Das ist das, was ich hier gespart habe.
Und wenn ich mehr auslese als 4, dann entsprechend mehr.
Also signifikante Zeit, die ich hier sparen kann.
Und ich erinnere nochmal an die Eingangsfolie von der Vorlesung, als
wir diese große Lücke hatten zwischen Prozessor-Performance und
Speicher -Performance.
Wenn ich hier mit dem Faktor 8,5 besser bin, dann habe ich die Lücke
schon wieder mal ein kleines Stück mehr geschlossen, sozusagen.
So muss man das sehen.
Das sind kleine Techniken, die diese Diskrepanz versuchen zu
verbessern.
So, nichts anderes sagt das.
Einmal Zeile und mehrmals die Spalte hier auslesen.
Und was ich hier noch sehe, ist letzten Endes, ich lege hier die Daten
an und die Daten müssen übernommen werden.
Sie sehen hier folgendes.
Es dauert eine gewisse Zeit, bis ich das nächste K-Signal anlege.
Auch deshalb, weil ich diese Daten erst sicher übernehmen muss.
Ich muss die sicher speichern und das dauert eine gewisse Zeit.
Also ich habe hier Lücken.
Sie sehen schon, es gibt noch Möglichkeiten, das Ganze noch weiter zu
verbessern.
Und das kann man tatsächlich machen.
Es gibt hier noch eine kleine, die möchte ich aber überspringen, weil
es sind letzten Endes nur Zeiten, die sind wichtig, wenn man ein
Entwickler eines Rechners ist, dann muss man diese Zeiten kennen.
Es sind letzten Endes nur die Definitionen der Zeiten, die hier
definiert sind als das Minimum von Anlegen dieses Raw Extrasignals bis
zum nächsten Zyklus zum Beispiel.
Ich denke, es bringt nichts.
Ich gehe einfach mal drüber.
Sie können sich das zu Hause selber anschauen.
Es sind einfach nur Definitionen von Zeiten, wie diese Signale in
Relation stehen.
Deswegen überspringe ich es und gehe zu den wesentlicheren Dingen.
Und das wäre das, dass ich hier einmal ein Timing-Diagramm habe, wo
ich hier einmal das Raw Extrasignal anlege und dann die Spalten und
hier zwischen den verschiedenen Daten, wenn ich die abspeichere, noch
die entsprechenden Lücken habe oder ich habe die Lücken hier
geschlossen.
Hier habe ich ein sogenanntes Edoram.
Das macht Folgendes, das puffert die Daten, das macht eine
Zwischenpufferung der Daten, braucht also nicht warten, bis die Daten
übernommen wurden, sondern puffert die in einem anderen Speicher
zwischen und kann direkt weiter beginnen, zu lesen, eine neue Adresse
anzulegen, ohne die alten Daten zu überschreiben.
Das heißt, hier ist der Trick sozusagen, ich habe zusätzliche
Speicher, wo ich meine Daten zwischenspeichere, bevor ich sie rauslese
und kann damit schneller auf den Speicher zugreifen.
Sehen Sie, ich habe hier keine Lücke mehr zwischen und hier hatte ich
noch die Lücke dazwischen.
Das kostet mich ein bisschen mehr Aufwand, weil ich brauche sozusagen
mehr Register, um die Daten, die ich aus dem Hauptspeicher rausgelegen
habe, erstmal zwischenzuspeichern, bevor ich sie dann weitergebe an
den Prozessor.
Und das sind nur so ein paar Dinge, wie man den Hauptspeicher weiter
verbessern kann im Sinne der Performance.
Es gibt viele weitere Techniken, die führen über das hinaus, was wir
hier in der Vorlesung letzten Endes haben, aber nur so als Geschmack,
dass man noch einiges tun kann, als was man mit dem Basiszugriff, den
wir am Anfang gesehen haben, erreichen kann.
Es gibt noch andere Arten von Speichern.
Es gibt eine Unzahl von Speichern, eine Unzahl von Speichern, Namen,
Synchronen, Asynchronen usw.
Aber es bringt an sich, sage ich mal, vom Verständnis eines Speichers
her wenig, außer dass da irgendwelche Eigenheiten ausgenutzt werden,
die das Ganze schneller machen.
Also zur Vollständigkeit gibt es hier noch eine Folie, ich möchte aber
nicht weiter darauf eingehen.
Ich möchte noch zur Organisation des Hauptspeichers kommen.
Jetzt stellen Sie sich vor, jetzt haben wir gesehen, wie so ein
Speicher ausschaut.
Also wie sieht physikalisch so ein Speicher aus?
Und wir sind ja immer davon ausgegangen, dass diese Matrix, die wir
vorher hatten, die war immer von einer Art.
Also entweder war das ein dynamischer Speicher oder es war ein
statischer Speicher oder es war ein Festwertspeicher, aber es war
immer von einer Art, das war ja nicht gemixt.
Wenn wir jetzt allerdings ein Mikrocomputer haben, dann sieht das
Ganze so aus.
Das heißt, ich habe irgendwo ein Stück Speicher, das ist ein ROM, ich
habe irgendwo etwas, das heißt ION, ich habe irgendwas, das heißt
dynamischer Speicher und ich habe einen statischen Speicher.
Das heißt, ich habe natürlich alles zur selben Zeit und die sind im
gesamten Adressraum übernannter irgendwie angeordnet.
Das heißt, ich habe verschiedene Speichertechnologien, die in meinem
Adressraum des Computers zum Beispiel so angeordnet sind.
Und wenn ich als Programmierer nun auf irgendeine Speicherzelle
zugreife, dann weiß ich typischerweise überhaupt nicht, ist das nun
ein ROM-Speicher, ist das ein dynamischer oder ein statischer
Speicher, das weiß ich nicht.
Wie könnte ich es rausbekommen?
Mit dem, was wir gelernt haben, wie könnte ich das rausbekommen?
Ich bin nur ein Programmierer, ich weiß nicht, wie es da drinnen
aussieht.
Ich vermute mal, es sieht irgendwie so aus, ich weiß aber nicht genau
wie.
Ich weiß zum Beispiel nicht, bei welchem Adressraum das Dynamische
anfängt.
Wie würde ich es machen?
Okay, ich könnte zum Beispiel, das ist ein gutes, das ist gut, genau.
Ich schreibe zum Beispiel was rein und mein Compiler sagt mir, ich
darf da nicht schreiben.
Also jetzt habe ich zum Beispiel die Unterscheidung gemacht, ich bin
hier, also ich bin im Gelben oder nicht im Gelben.
Wie könnte ich jetzt noch rausbekommen, ob ich im, ja was ist das
überhaupt für Farben, im hellbeigen oder dunkelbeigen bin, na was auch
immer.
Also ob ich hier oder hier bin, wie könnte ich das als Programmierer
rausbekommen?
Ohne aufzuschrauben, nur als Programmierer, was könnte ich machen?
Genau, Zeit messen, wie messe ich die Zeit?
Genau, also ich mache eine große Schleife, ich schreibe da rein, ich
habe einen Timer im Betriebssystem und gucke dann, wie weit der Timer
gelaufen ist bei einer Million Zugriffen.
Dann weiß ich genau, ob ich da drin oder da drin bin zum Beispiel.
Also, was ich also wissen muss, ist natürlich, in welchem Bereich
schreibe oder lese ich, denn es dauert ganz einfach unterschiedlich
lang, wenn ich meinen Algorithmus im dynamischen Speicher ablaufen
lasse, dauert es bestimmt länger, als wenn ich ihn im statischen
Speicher habe.
Das große Problem wird nur darin bestehen, dass meine Daten, die ich
mit dem Algorithmus bearbeiten möchte, sei es ein Graph, den ich
durchlaufen möchte, der passt vielleicht überhaupt nicht in den
statischen RAM rein.
Also der Graph, das könnte zum Beispiel eine Karte eines
Navigationssystems oder sowas sein, der passt dann wahrscheinlich gar
nicht ins statische RAM rein.
Das ist das eigentliche Problem, sonst würde ich natürlich immer das
Statische nehmen.
Aber Sie sehen schon allein hier, in diesem Beispiel ist das so
angedeutet, dass dieser Teil, der dynamische, deutlich größer ist als
der statische.
Also, ich habe verschiedene Arten von Speichern.
Jetzt habe ich hier noch das Grüne, was fällt Ihnen hierzu ein?
Da steht I.O.
Speicher.
Fällt da jemandem was zu ein?
I.O.
heißt Input Output.
Die Maschinen-Programmierer unter Ihnen, Sie müssten es wissen.
Genau, also das könnte der Speicher sein, auf den Geräte zu greifen.
Also irgendwelche externen Signale, ganz allgemein, richtig.
Und zwar ist es so, dass ich externe Signale, wir reden ja oft von
eingebetteten Systemen, ich hatte ja oftmals schon so ein Beispiel
gebracht, wir haben so ein Anti-Blockier-System in einem Auto, da wird
ein Messwert gewessen, das heißt, es wird die Geschwindigkeit
gemessen, und das ist irgendein Zahlenwert.
Und was gemacht wird in I.O.-Mapped-Architekturen, dass dieser Wert,
der an einer Leitung angeht, der wird auf den Speicher gemappt.
Das heißt, ich kann über eine Speicheradresse zum Beispiel einen
Sensor auslesen.
Ich kann zum Beispiel sagen, in dieser grünen Speicheradresse hier
befindet sich der Wert der Geschwindigkeit meines Fahrzeugs.
Solche Dinge.
Das heißt, ich habe ein I.O., also externe Signale, die über den
Speicher adressiert werden können.
Was in dem Sinne genial ist, weil ich kann meine ganzen
Adressierungsarten, die beziehen sich ja auf den Speicher, das heißt,
ich kann direkt Messwerte in meine Berechnungen ohne großen Aufwand
einfließen lassen.
Ich kann zum Beispiel einen Befehl nehmen, Add Speicherzelle 580, in
580 steht die Geschwindigkeit, und kann sie multiplizieren oder kann
sie vergleichen mit einer Maximalgeschwindigkeit oder was auch immer,
mit einem Befehl.
Das heißt, ich brauche keinen zusätzlichen Befehl.
In einer anderen Architektur würde ich einen Befehl benötigen, der
sagt, lade mir bitte den Messwert in ein Register.
Und dann nehme ich dieses Register hier und vergleiche dieses
Register, was einen Geschwindigkeitswert hat, mit einer anderen
Geschwindigkeit oder irgendwas.
Und wenn das auf dem Speicher gemerkt ist, kann ich direkt über die
Adressierungsarten auf Messwerte eines eingebetteten Systems
zugreifen.
Das heißt, hier befindet sich sozusagen die Umwelt, die externe Umwelt
dieses eingebetteten Systems, hier sind diese Werte gespeichert.
Das heißt, wenn irgendwelche Analog-Digitalwandler neue Werte liefern,
ich beschleunige, ich habe eine andere Geschwindigkeit, ändert sich
dieser Wert hier im Speicher, ich kann diese auslesen.
Also aus diesen Teilen besteht ein Speicher, unter anderem eben auch
aus diesem I.O.-Bereich.
Aber es gibt natürlich auch Architekturen, wo ich das nicht habe.
Aber das ist sehr, sehr gut für eingebettete Systeme.
So, und jetzt haben wir nur das, was ich hier schon gesagt habe.
Wir haben hier den Speicherbelegungsplan, bin ich alles schon
durchgegangen.
Hier ist nur noch mal ein Beispiel, wie ich auf verschiedene Teile
eines Speichers zugreife.
Ich habe natürlich die Möglichkeit,
zum Beispiel auf vier Bytes durchzugreifen, auf zwei Bytes innerhalb,
auf einen Byte und so weiter.
Also es gibt verschiedene Möglichkeiten, auf den Speicher
durchzugreifen.
Typischerweise ist es nicht sehr vorteilhaft, weil ich besser alles
auslese, wie ich eben gesagt habe, und nicht an ungeraden Grenzen
zugreife.
Ich kann es aber machen.
Manche Architekturen haben dafür ein paar Bits reserviert, sodass ich
an jeder Byte-Grenze adressieren kann den Speicher.
Das hat eher historische Bedeutung.
Typischerweise reicht es mir, wenn ich ein ganzes Wort mit 32 Bit
auslese und nicht an jeder Byte-Grenze adressieren müssen kann.
Aber ich kann es bei manchen adressieren.
So, jetzt gehen wir noch ein Stück weiter.
Jetzt haben wir uns angeschaut, wie ein Speicher, ein einzelner
Speicher ausschaut.
Typischerweise in einem Computersystem habe ich verschiedene
Steckkarten.
Jede Steckkarte hat einen bestimmten Adressbereich.
Und jede Adresskarte kann verschiedene Speicher haben.
Insgesamt sieht das jetzt so aus.
Ich habe eine große Speicheradresse.
Die erste Adresse geht in die Speicherzelle dieser Matrix, die wir
ganz am Anfang der Vorlesung hatten.
Die zweite geht in den Baustein, das heißt den Chip.
Die dritte geht in das Modul, in die vierte in die Karte.
Das ist so eine Karte.
Die Karte hat mehrere Module.
Jedes Modul hat mehrere Bausteine.
Und jeder Baustein hat mehrere Speicherzellen.
Das heißt, hier kann ich auch deutlich über 32-Bit-Adressen haben.
Hier kann ich mir vorstellen, hier habe ich vielleicht 48-Bit oder
sowas.
Jeder Teil des Adressbereichs spricht dann einen bestimmten Teil an.
Zum Beispiel der obere Teil spricht einfach nur die Karte an, die ich
im Rechner habe.
Also eine von den sechs Karten oder wieviel da auch immer drin ist.
So sieht das dann aus auf Modulebene.
Hier habe ich ein Modul I und ich gehe davon aus, dass ich in dieser
Steckkarte N verschiedene Module drin habe.
Und jedes Modul ist so aufgebaut, wie wir das eben gesehen haben.
Und Sie sehen hier, wie die Adressen zerlegt werden.
Das ist dieser Teil, der zerteilt die Adressen, sodass die
entsprechenden Module hier angesprochen werden.
Das heißt, die da wertenden Bits, die könnten natürlich an allen
Modulen anlegen, aber die werden gar nicht weitergeleitet.
Die werden nur an diese Module weitergeleitet, für die die
höherwertigen Bits bestimmt sind.
So sieht ein Speichermodul aus.
Hier haben wir zum Beispiel 32-Bit.
So ist das typischerweise organisiert.
Wir haben 32-Bit, aber wir haben nur einen Rahmen, was in diesem Falle
nur einen Bit groß ist.
Wir brauchen das hier achtmal.
Und dann haben wir achtmal eben von 0 bis 7, 8 bis 15 usw.
Das heißt, wir haben hier 4 mal 8.
Wir haben hier 32 Bausteine, um einen Speicher aufzubauen, der eine 32
-Bit -Tiefe hat.
Und aus Einzelbausteinen besteht, die organisiert sind, zum Beispiel
aus einem Mega, einer Million Spalten, einer Million Zeilen, wo
jeweils nur eine Speicherzelle ein Bit ist.
Und jedes dieser Module hier stellt ein Bit dar.
Also ich kann das kaskadieren in der Tiefe, wie ich möchte.
Das heißt, ich kann mir jede mögliche Größe, Tiefe von Speichern
bauen, mit den Speichern, die ich kaufen kann.
Weil das Problem ist, man kann halt nur bestimmte Speicher kaufen.
Typischerweise Speicher, die ich kaufen kann, sind immer organisiert
zu einem Bit.
Also wenn ich ein Megabit habe, dann sind das draußen Zeilen, draußen
Spalten, und da ist immer nur genau ein Bit drin.
Wenn ich 16 Bit haben will, muss ich mir halt 16 von diesen hier
kaufen.
So schaut das aus.
Gut, so schaut das Ganze dann praktisch aus.
Die haben dann verschiedene Namen, diese Teile, verschiedene Chips,
und Sie sehen, die sind dann hier gereiht.
Hier haben wir 2, 4, 6, 8, hier haben wir 9.
Warum habe ich da 9?
Ich meine, ich habe gesagt, ich kann alles machen, aber man sollte
nichts Unsinniges machen.
8 klingt logisch, kann ich adressieren, 9, weiß nicht, da brauche ich
ein zusätzliches Bit, um es zu adressieren, macht irgendwie keinen
Sinn, oder?
Warum sind das 9?
Da habe ich hier Fotomontage gemacht, noch eins zugebaut.
2, 4, 6 sind tatsächlich 9.
Das ist die Lösung.
Warum sind es 9?
Ich habe mich nicht verzählt, es sind 9.
Nee, das ist nicht der Fall.
Aber danke, Sie haben es versucht, wer versucht es noch?
Redundanz, Fehlerredundanz, das ist genau die Sache.
Hatte ich schon mal vor 4 Wochen gesagt, Fehlerredundanz.
Wir haben immer Fehlerredundanz.
Wenn wir einen Speicher kaufen von einem Megabit mit 32 Bit, dann hat
er mindestens 33 Bit, vielleicht 3 oder 34 Bit.
Wir haben Fehlertoleranz, Fehlertoleranz ist wichtig.
Es passieren dauernd Fehler, aus dem All kommen dauernd Teilchen, die
schießen auf die Chips, die ändern die Bitwerte.
Die müssen korrigiert, die müssen erkannt werden zumindest.
Und vielleicht sogar korrigiert werden, und das Minimum, was man hat,
ist ein Bit.
Damit kann ich noch nicht mal garantieren, dass ich den Fehler
wirklich gefunden habe.
Aber es handelt sich um Fehlertoleranz, die einen sehr großen
Stellenwert einnimmt, in Zukunft sogar noch mehr als heute.
Weil Speichertechnologien, die sehr klein sind, von der Größenordnung
her, die sind sehr viel fehleranfälliger.
In Zukunft werde ich einen Großteil meines Chips dazu benötigen,
Fehlertoleranz zu bewerkstelligen.
Aber man hat schon, solange es Rechner gibt, hat man schon immer
zumindest ein Bit gehabt.