So, herzlich willkommen zur Fortsetzung von Informatik 2.
Ich muss wieder kurz mein Gerät hier umbauen, um das Grafiktablett
nutzen zu können.
So müsste es eigentlich gehen.
Also, ich begrüße Sie nochmal zur Vortätigung Informatik 2.
Wir haben uns in der letzten Doppelstunde wieder mit Rechneragentur
und Organisation beschäftigt.
Und wir sind ein ganzes Stück weit gekommen.
Wir haben uns mit einigen Dingen befasst.
Mit den verschiedenen Teilen des von Neumann Rechners.
Ich habe Ihnen das Steuerwerk nochmal kurz erzählt.
Die eine Ausgabeeinheit haben wir uns genauer angeschaut.
Ich habe Ihnen etwas über das Buskonzept berichtet.
Wie man eigentlich Buskommunikation ermöglicht zwischen den
Komponenten eines Rechners.
Wir haben uns über die Buszuteilung kurz Gedanken gemacht.
Ich habe Ihnen dann etwas erzählt über den von Neumann Engpass.
Nochmal zurück, das ist halt auch ein wesentlicher Punkt, dass man
sich klar macht, die von Neumann Rechner Architektur hat halt ein
bestimmtes Prinzip.
Und wir müssen halt sehen, wie wir mit diesem Prinzip zurechtkommen
und unsere Berechnungen organisieren.
Das Problem ist halt diese Beziehung zwischen dem physikalischen von
Neumann Engpass und dem intellektuellen von Neumann Engpass, vor dem
wir uns hüten müssen in dem Entwurf unserer Programme.
Wir sollten sehen, dass wir uns halt nicht dadurch beirren lassen,
dass es eben diese Reihenfolge im Rechner gibt, in der einzelne
Befehle abgearbeitet werden.
Das sollte man möglichst einer intelligenten Software überlassen.
Gut, dann haben wir uns mit weiteren Themen befasst.
Ich habe Ihnen etwas erzählt über Konzepte zur Vermeidung des von
Neumann Engpasses.
Wir haben uns angeschaut, Möglichkeiten, Datenstrukturen auf Hardware
-Ebene zu implementieren, dadurch den Engpass abzumildern, indem man
halt die Anzahl der Zugriffe auf Speicherelemente reduziert.
Ich habe Ihnen etwas erzählt über ein ganz anderes Konzept des
Speicherzugriffs, nämlich diesen inhaltsorientierten, den wir in dem
Assoziativ -Speicher haben.
Und ich habe Ihnen kurz etwas über die möglichen Anwendungen erzählt,
auch kurz diesen Assoziativ-Prozessor angesprochen, bei dem man halt
sämtliche Operationen im Rechner über solche Assoziativ-Operationen
macht.
Dann sind wir zu dem dritten Teil gekommen, Parallelverarbeitung.
Ein anderes Prinzip, bei dem man eigentlich sich von dem von Neumann
Rechner gar nicht so weit entfernt.
Die Architektur ist eigentlich immer noch die gleiche, nämlich diese
Transformation des Speichers durch eine Folge von, oder Berechnung
durch Folgen von Speichertransformationen.
Nur der Unterschied ist halt, dass wir jetzt mehrere Dinge parallel
machen können.
Und das auf verschiedenen Ebenen, entweder auf der Ebene der einzelnen
Prozessorteile, das wäre das niedrigste, oder vollständige
Prozessoren, wie wir es heute in vielen Rechnern schon haben, oder
auch mehrere autonome Rechner, auch das ist Realität, dass Rechner im
Verbund miteinander arbeiten.
Und ich habe Ihnen dann dieses Klassifizierungsschema von Flynn, das
30 Jahre alt ist inzwischen, kurz vorgestellt, das aber immer noch
seine Gültigkeit hat, um so eine grobe Klassifizierung vorzunehmen.
Es gibt mittlerweile auch andere Klassifizierungsschema da für
Parallelrechner, die wesentlich feiner sind und mehr Parameter einer
Architektur enthalten, aber das wäre mehr Inhalt einer Vorlesung über
Rechnerarchitektur als Inhalt an der Vorlesung, wo ich nur in die
Architektur eigentlich Einführungs- und Überblick gebe.
Dann haben wir uns die verschiedenen Ebenen der Parallelverarbeitung
kurz angeschaut und ich habe Ihnen dann noch etwas erzählt zu SIMD und
MEMD Rechnern.
Und wir haben uns schließlich Pipeline Rechner angeschaut und dort das
Befehlsphasen -Pipelining in einem Prozessor betrachtet.
Wir hatten ja den Maschinenbefehlszyklus einer von Neumann Maschine
uns genau betrachtet und Sie wissen, dass das etwas ist, was jeder
eigentlich im Schlaf können muss, wenn er mal irgendwann zu Dingen
über Grundlagen der Informatik gefragt wird.
Und das Konzept muss man verstanden haben, genauso wie man verstanden
haben muss, was ein Algorithmus ist.
Wenn man also über Dinge aus Informatik 1 gefragt wird, muss man
selbstverständlich wissen, wodurch ein Algorithmus charakterisiert ist
und wie man die wesentlichen Eigenschaften eigentlich beurteilt.
Das nur als kurze Randbemerkung.
Genauso wie man natürlich wissen muss, wie man die Kosten eines
Programms beurteilt, wie man die Qualität eines Programms beurteilt.
Das sind ja Dinge, die wir Ihnen erzählen wollen.
Und hier lernen Sie halt jetzt bei Informatik 2, wie man die Qualität
von Rechnern beurteilt.
Und wir sind halt gerade bei dem Prozessor, der eben, wenn er gut ist,
ein Pipelining erlaubt.
Und ich hatte auch schon darauf hingewiesen, dass ein Pipelining
natürlich sehr schön ist, aber dass wir beim Pipelining halt ein
Problem haben und hier gehe ich jetzt wieder auf den
Präsentationsmodus.
Das war die letzte Folie am Montag.
Lassen Sie mich kurz wieder auf den Stift gehen und auch eine andere
Farbe wählen.
Nehmen wir mal rot.
Also Pipelines sind halt eine wichtige Realisierungsart von
Prozessoren heutzutage.
Die einzelnen Befehle werden nicht so nacheinander ausgeführt.
Also wenn wir hier eine Zeitachse hätten, führen wir halt die Befehle
eines Rechners nicht so nacheinander aus, in aufeinanderfolgenden
Abschnitten, sondern wir machen das Ganze nach einem Pipelining
-Muster.
Das heißt, dass wir halt hier, mal ich das mal daneben hier irgendwo,
da brauchen wir nicht so viel Platz, indem wir halt die Befehle sehr
eng nacheinander ausführen.
Sie sehen, hier sieht es wesentlich länger aus als nur vier Phasen,
wie bei dem Befehlsphasen-Pipelining, was ich Ihnen gerade eben
vorgestellt hatte.
Wenn wir das so im Pipelining-Prinzip organisieren, haben wir immer
den Vorteil, dass wir halt einen wesentlich höheren Durchsatz an
Befehlen ermöglichen können.
Und jetzt kann man noch daran gehen, solche Pipelines zu unterscheiden
nach Art der Anwendung, also Befehlsphasen oder Operations-Pipelining.
Man kann auch beides kombinieren.
Man kann Pipelines als Einfunktions-Pipeline organisieren oder als
Multifunktions -Pipeline, wobei das zunächst mal sehr schön aussieht,
dass man eine Pipeline unterschiedlich organisieren kann.
Das heißt aber, ich muss sie auch immer steuern.
Und ehe ich die Funktion einer Pipeline ändern kann, müsste ich
natürlich die erstmal wahrscheinlich leerlaufen lassen, damit auch
nicht das Verhalten der Pipeline geändert wird, während mehrere
Operationen dort gerade ausgeführt werden.
Also das macht das Rechnen mit so einer Pipeline etwas aufwendiger,
kann aber manchmal durchaus sinnvoll sein.
Und das, was dann eben eine wichtige Erkenntnis ist, ist, dass wir
halt heutzutage in allen unseren leistungsfähigen Prozessoren
Pipelining realisiert haben.
In sehr vielen Stufen.
Da habe ich Ihnen schon letztes Mal gesagt, dass wir im Intel Pentium
4 Rechner jetzt so ca.
26 Pipelining-Stufen haben.
Und es ist eben völlig klar, dass eine solche ganz tief gestufte
Pipeline nur dann zu einer Leistungssteigerung im Rechner führt, wenn
sie auch voll ausgenutzt werden kann, wenn wir halt nicht in dieser
Art, wie das hier angegeben ist, die Pipeline ganz stark ausnutzen
können.
Dann haben wir im Extremfall mit dieser Situation es zu tun, dass wir
halt einzelne Befehle nacheinander ausführen müssen, wenn z.B.
das Ergebnis der einen Operation direkt Einfluss hat, wenn z.B.
hier etwas berechnet wird, was anschließend dort in der Operation
gebraucht wird.
Wenn wir also solche Datenabhängigkeiten haben, dann wird es natürlich
schwierig, eine Pipeline tatsächlich auszunutzen.
Und da hatte ich Sie schon darauf hingewiesen, dass es dazu natürlich
Überlegungen gibt in der Informatik, wie man mit sowas umgeht.
Und das ist das Stichwort spekulative Programmausführung.
Dazu habe ich Ihnen am Ende der Vorlesung am Montag noch ein bisschen
was erzählt, dass man halt einfach sich überlegt oder im Programm
einfach spekuliert auf das mögliche Ergebnis von Berechnungen und
daraufhin dann einfach Befehle ausführt.
Und wenn sich anschließend herausstellt, dass ein Befehl nicht
ausgeführt werden sollte, weil das dort spekulierte Datenfeld ein
anderes Ergebnis hätte, oder einen anderen Wert hätte haben müssen,
dann muss man den Befehl halt nochmal ausführen mit den richtigen
Werten.
Deswegen kann man auch eventuell nicht nur ein Befehl ausführen,
sondern vielleicht zwei.
Man weiß, ein Programm wird sich verzweigen.
Man führt einfach beide Zweige nebeneinander aus und wählt dann
denjenigen, der am Ende oder wenn der Test tatsächlich beendet ist,
sich als richtig herausstellt.
Solche Techniken kann man automatisch einsetzen und ein gutes
Betriebssystem, ein gutes Laufzeitsystem macht das und nutzt dann
tatsächlich Ihren 2,6 GHz Rechner so aus, dass Sie ihn mit 2,6 GHz
oder vielleicht mit 2 oder 1,5 GHz nutzen können.
Wenn das nicht genutzt wird, dann haben Sie halt nur einen 100 MHz
Rechner.
Und da muss ich eben darüber im Klaren sein, was dort alles an
Intelligenz drinstecken muss in der Software, die Ihren Prozessor
betreibt.
Der Prozessor muss möglichst intensiv ausgenutzt werden, möglichst in
der Art, wie es hier oben angedeutet ist, ganz starkes Pipelining,
eine voll ausgelastete Pipeline.
Und wenn Sie ein schlechtes Betriebssystem haben, dann haben Sie diese
wirklich leer gelaufene Pipeline, die eigentlich gar nicht ihren Zweck
erfüllen kann.
Und die Leistungsfähigkeit des Rechners geht runter.
Okay, das also nochmal hier als Bemerkung.
Möglichkeit des Zeitgewinns durch Einsatz von Pipelining ist eines der
Hauptargumente für die Hardwareimplementierung von Algorithmen.
Es ist klar, Sie können natürlich Pipelining nur machen, wenn Sie auch
in der Lage sind, mehrere Berechnungen nebeneinander auszuführen.
Das erfordert einen zusätzlichen Hardwareaufwand und deswegen kann man
sowas nur in Hardware natürlich machen.
Ich kann in der Software nicht mehrere Programme nebeneinander
ausführen, das macht keinen Sinn.
Wir haben so ähnliche Dinge, wenn wir mit Threads arbeiten, aber da
werden ja nicht mehrere Threads genau nebeneinander zeitlich parallel
ausgeführt, sondern die werden nur unabhängig voneinander irgendwann
den Prozessoren zugeteilt.
Das führt auch zu Verbesserungen, bindet uns vor allen Dingen von der
Sorge um die Festlegung der Reihenfolge von Befehlen.
Okay, das also zu diesem Pipelining-Prinzip, ein ganz wichtiges
Architekturprinzip von heutigen Rechenanlagen.
Ich wollte jetzt nochmal auf Multiprozessor-Systeme zurückkommen.
Wir hatten ja vorhin schon uns die Klassifizierungsschemata angeguckt.
Was interessant ist, sind halt die MEMD-Rechner bzw.
SPMD, Single Program Multiple Data Machines und das, was wir machen,
wenn wir über MEMD oder Single Program Multiple Data Machines reden.
Das ist eine Parallelverarbeitung auf der Task- oder Job-Ebene und es
ist eine grobkörnige Parallelität.
Dann ist es so, dass wir natürlich, wenn wir über die Kombination von
unabhängig arbeitenden Rechnern reden, diese Rechner auch eventuell
unterschiedlich sein können.
Selbst in dem Rechner hier bei uns im Rechenzentrum, in dem großen IBM
-Parallelrechner, da sind nicht alle Rechner einheitlich.
Das sind zwar alles IBM-Prozessoren, alles RS6000-Rechner, aber die
sind unterschiedlich leistungsfähig ausgestattet.
Das kann natürlich noch wesentlich stärker heterogen sein.
Also es könnte sein, dass Sie sogar völlig unterschiedliche
Prozessoren haben.
In weitläufigen Clustern könnten Sie halt Prozessoren oder Rechner von
unterschiedlichen Herstellern haben, sodass Sie dann hardwaremäßig
unterschiedliche Plattformen haben, sodass Sie eventuell darauf dann
auch mit Ihren Programmen eingehen müssen.
Da wir aber heutzutage eigentlich immer stärker plattformunabhängig
programmieren, geht das Problem berücksichtigt unter unterschiedlichen
Hardware ein bisschen zurück.
Das einzige ist, wenn man mehrere Prozessoren hat, die unterschiedlich
leistungsfähig sind, dann muss ich natürlich aufpassen, wie ich meine
Last verteile.
Welchem Prozessor ich einen aufwändigen Job gebe und welchem ich einen
etwas leichteren Job gebe, die sollen ja möglichst mit ihrer Aufgabe
gleich schnell fertig werden.
Dann kann man sich unterhalten über die Funktion der Prozessoren.
Also wie gesagt, wenn Sie alle die gleiche Funktionalität haben, dann
nennt man das Ganze ein symmetrisches System.
Ansonsten wären Sie asymmetrisch.
Es könnte sein, dass Sie einige Prozessoren für spezielle Aufgaben
vorsehen.
Und dann wäre es halt ein asymmetrisches System.
Die Kopplung ist auch wieder wichtig.
Also wie stark sind die Prozessoren gekoppelt?
Sie könnten mehrere Prozessoren nebeneinander arbeiten lassen, die
einen gemeinsamen Speicher haben.
Und die können halt alle darauf zugreifen.
Das wäre ein Shared Memory Prozessor.
Das wird in den meisten Prozessoren, wenn Sie leistungsfähige Rechner
kaufen, mit Dual Prozessor oder auch mit 4 Prozessoren drin.
Die haben einen gemeinsamen Speicher.
Dann ist völlig klar, dann kann es Probleme geben, diesen
Speicherzugriff richtig zu organisieren, dass diese nicht ins Gehege
kommen.
Macht ein bisschen Aufwand.
Kann man nicht mit beliebig vielen Prozessoren machen.
Wenn man also über so Größenordnung 8 Prozessoren hinaus geht, dann
gibt es einfach Probleme durch Konflikte beim Speicherzugriff.
Und dann ist es sinnvoller, die nicht so auf einen gemeinsamen
Speicher zugreifen zu lassen, sondern dann hat man eher so mehrere
Speicherbereiche, auf die diese Prozessoren dann halt getrennt
zugreifen.
Das wäre also sowas wie Distributed Memory.
Also wie gesagt, bei SMP hätten wir die untere Variante Speicher
geteilt zwischen mehreren Prozessoren.
Schwach gekoppelt bedeutet, die Rechner sind unabhängig voneinander.
Also, wenn Sie hier irgendwelche Prozessoren haben, die miteinander
reden wollen, das wäre jetzt hier das Kommunikationsnetz, da können
die alle drauf zugreifen.
Und die greifen auf dieses Netz zu, indem sie irgendwelche Nachrichten
schicken.
Insofern wären sie Nachrichten gekoppelt.
Das ist so die typische Bezeichnung für schwach gekoppelte
Multiprozessor -Systeme.
Wann immer zwei Prozessoren Informationen austauschen wollen, müssen
sie Nachrichten schicken.
Das ist natürlich ein ziemlicher Aufwand.
Stellen Sie sich vor, Sie haben mehrere Rechner, die einen virtuellen
Speicherraum haben.
Dieser virtuelle Speicher ist verteilt auf mehrere Prozessoren.
Und wann immer ein Rechner auf ein Datum beim anderen Prozessor
zugreifen will, müsste er erst eine Nachricht schicken an diesen
anderen Prozessor, der dann dieses Datum einpackt und wieder
zurückschickt.
So funktioniert die Kommunikation in Nachrichten gekoppelten Rechnern.
Und das ist natürlich ein ziemlicher Aufwand.
Deswegen muss man sehen, dass man bei Anwendungen auf solchen schwach
gekoppelten Multiprozessor-Systemen den Kommunikationsaufwand
möglichst gering hält.
Auch mit diesen Themen kann man sich intensiver beschäftigen.
Dafür gibt es eine Reihe von Vorlesungen.
Ich will sie nicht alle mal wieder aufführen.
Bei heutigen Parallelrechnern hat man meistens etwas gemacht, was man
heute eigentlich häufig findet.
Die Hardware gibt uns zwar bestimmte Dinge vor, zum Beispiel so etwas
wie einen verteilten Speicher, wie ich das hier oben angedeutet habe,
oder hier in dem Bereich.
Aus physikalischen Gründen ist es sinnvoll, den Speicher verteilt an
mehrere Prozessoren anzuordnen.
Aber logisch möchte ich gerne einen gemeinsamen Speicher haben.
Und deswegen realisiert man einfach einen verteilten gemeinsamen
Speicher.
Das heißt, man realisiert das, was wir hier als gemeinsamen Speicher
angedeutet haben, realisiert man so, dass man die getrennt vorhandenen
Speicherbereiche einfach virtuell zu einem gemeinsamen Speicher
zusammenfasst und es damit dem Anwender ermöglicht, dass er beliebig
auf Adressen in diesem Speicher zugreifen kann und das Betriebssystem
übernimmt den Austausch der Daten.
Dafür gibt es dann spezielle Kommunikationsfunktionen, um die sich
aber der Benutzer nicht mehr kümmern muss, sondern der kann so tun,
als wenn er einen gemeinsamen Speicher hat.
Da ist es also wieder Aufgabe der Informatik, dann im Betriebssystem
dafür zu sorgen, dass die entsprechenden Funktionen effizient und
effektiv zur Verfügung stehen.
Gut, das also zu diesen Unterschieden in den Multiprozessorsystemen.
Ich habe noch ganz paar Beispiele hier aufgeführt.
Es gibt natürlich viele verschiedene Möglichkeiten,
Multiprozessorsysteme zu realisieren.
Ich habe hier einen Namen, also Sun ist ja ein bekannter
Rechnerhersteller, die halt auch sehr viel Server-Architektur
bereitstellen.
Die Namen ändern sich hier sehr schnell.
Ultraspark.
Ich war mir gar nicht bewusst, ob bei Sun noch ein Rechner im Angebot
ist, der Ultraspark heißt.
Auf jeden Fall gab es den vor ein paar Jahren.
Server-Architektur mit mehreren Prozessoren in einer Workstation.
Inzwischen haben die glaube ich wieder ihren Namen geändert.
Hier haben wir einen gemeinsamen Speicher und ein stark gekoppeltes
System.
Da sind also wirklich viele Prozessoren drin, die nebeneinander
arbeiten.
Sehr viele.
Und einen gemeinsamen Speicher.
Sie können aber bei dieser Sun-Architektur diesen Multiprozessor
-Rechner aufteilen in verschiedene Bereiche.
Sie könnten also sagen, eine bestimmte Anwendung soll meinetwegen
diesen Bereich hier bekommen für seine Berechnung und ein anderer, der
soll vielleicht jetzt mit diesen beiden arbeiten und bekommt dafür
auch einen bestimmten Speicherbereich zugeteilt.
Das heißt, man kann so einen Multiprozessor-Rechner auch aufteilen,
kann ihn partitionieren, sodass verschiedene Anwendungen in
unterschiedlichen Bereichen hier arbeiten können.
Das ist für eine Server-Architektur relativ wichtig.
Gut, das sind also wie gesagt die SMP-Architekturen.
Dann habe ich Ihnen hier nochmal einen Workstation-Cluster erwähnt.
Da können Sie halt PCs, Linux-PCs, also PCs mit Intel-Prozessoren
drin, einfach unter Linux betreiben und als sogenannte Beowulf.
Das wäre also eine, Beowulf ist also ein Standardpaket, um eine
Cluster -Architektur, also die Kommunikation zwischen den Prozessoren
zu organisieren.
Das ist dieses Beowulf-Cluster.
Da gibt es eine ganze Reihe Beispiele von mit mehreren hundert
Prozessoren drin oder mehreren hundert PCs.
Gerade für Hochleistungsrechnungen kann man so relativ preisgünstig,
also für Anwendungen im technisch-wissenschaftlichen Bereich, kann man
so relativ preisgünstig Hochleistungsrechner produzieren und
realisieren.
Auch Server-Architekturen sind also häufig nach diesem Beowulf-Prinzip
gemacht.
Und wie gesagt, das ist relativ preiswert, kann man sich halt
zusammenbauen.
Wenn man höhere Ansprüche hat, dann geht man halt nicht zur Firma
Cray.
Die Firma Cray gibt es nicht mehr, die ist inzwischen übernommen
worden.
Und die Rechner gibt es natürlich noch, die Weiterentwicklung der
Rechner.
Cray T3e habe ich Ihnen voriges Mal schon skizziert.
Wir haben hier, das habe ich letztes Mal nicht gesagt, eine
Kombination von Vektorrechner und MEMD-Parallelrechner.
Also hier haben wir einen Rechner, das ist ein Vektorrechner und der
ist kombiniert mit diesem dreidimensionalen Torus.
Also da haben wir halt hier diese Torus-Architektur, wie ich Ihnen
letztes Mal schon kurz erläutert habe.
So, das wäre also etwa so eine Architektur.
Sieht ja ziemlich wild aus.
Eigentlich soll das hier irgendwie organisiert sein mit drei in der
Richtung.
Dann fehlt uns hier noch irgendwas.
Da sollten drei sein.
Hier brauchen wir noch drei.
So in etwa.
Und natürlich haben wir dann auch noch senkrechte Verbindungen.
Und das Ganze, das hatte ich Ihnen letztes Mal angedeutet, ist halt
ein Torus, weil wir hier jeweils die Wraparound-Verbindungen drin
haben.
Und zwar in jeder Dimension.
Also das wäre in der einen Dimension, dann haben wir die auch noch
hier in dieser Dimension einmal drin.
Und jetzt fehlt es noch in einer Dimension, eins, zwei...
Welche fehlt denn hier noch?
Die haben wir.
So rüber müssen wir noch.
Machen wir das mal meinetwegen in der Farbe hier.
Also wir müssen hier auch noch so rumlaufen können.
Das wäre also ein dreidimensionaler Torus.
Das heißt, Sie würden den Torus jetzt zusammenbauen, nochmal
zusammenbauen und nochmal zusammenbauen.
Dann haben Sie in einer höheren Dimension dann so eine nicht
vollständig verbundene Struktur, sondern eine Struktur, wo Sie halt
für jeden Knoten, das ist das Wesentliche, warum man das macht, für
jeden Knoten haben Sie die gleiche Nachbarschaft.
Jeder Knoten hat hier seine sechs Nachbarn.
Zwei in jeder Dimension.
Und das ist völlig unabhängig davon, ob der sich am Rand des Torus
befindet oder in der Mitte.
Die Nachbarschaft ist immer gleich, weil es gibt insofern bei dem
Torus kein Rand und keine Mitte.
Ist halt identische Nachbarschaft.
Letztes Mal habe ich Ihnen den zweidimensionalen Torus hier
vorgestellt.
Auf jeden Fall ist das eine interessante Rechnerarchitektur.
Übrigens ein virtueller gemeinsamer Speicher realisiert.
Das heißt der Benutzer muss sich hier nicht kümmern, wie er an ein
Datum rankommt.
Das macht das Betriebssystem in dem Fall.
Sehr leistungsfähige Rechner, so einer steht zum Beispiel im
Hochleistungsrechenzentrum in Stuttgart.
Beziehungsweise in Stuttgart ist es ein Höchstleistungsrechenzentrum,
während man das hier in Karlsruhe nur ein Hochleistungsrechenzentrum
nennt.
In dem wir demnächst auch wieder einen sehr leistungsfähigen neuen
Parallelrechner kriegen werden.
Dann, IBM SP2 haben wir hier in Karlsruhe mit, ich glaube das sind zur
Zeit auch 256 Prozessoren.
Wie gesagt, da kommt demnächst was Neues.
Heterogen, weil die Prozessoren unterschiedlich aussehen, sind nicht
alle identisch.
Und es ist Nachrichten gekoppelt, aber mit einem sehr schnellen
Kommunikationssystem.
Und Speicher ist also nicht, wie hier oben, virtueller gemeinsamer
Speicher, sondern ein echter verteilter Speicher.
Wenn Sie dort also auf Daten eines anderen Prozessors zugreifen
wollen, müssen Sie tatsächlich eine Nachricht schicken und die Daten
explizit hin und her bewegen.
Das also zu IBM SP2.
Nochmal eine Nachbemerkung hier zur Cray T3e.
Warum macht man so etwas, dass man einen Vektorrechner kombiniert mit
so einem Parallelrechner?
Nun, es gibt unterschiedliche Anwendungen.
Einige sind hervorragend zu beschleunigen dadurch, dass man
Vektoroperationen ausführt.
Das gilt für viele Matrix-Operationen.
Und viele Operationen, die Sie ausführen in technisch
-wissenschaftlichen Anwendungen, sind Operationen auf großen Matrizen.
Und deswegen ist es dort sehr sinnvoll, Vektorrechner zu haben.
Besonders als Rechner, die spezielle Vektor-Datenstrukturen in
Hardware realisiert haben und dadurch diese Operationen besonders
beschleunigen.
Natürlich gibt es dann daneben auch andere Arten von Berechnungen, die
nicht so gut oder nicht so sehr profitieren von dieser Vektor
-Datenstruktur.
Und für die hat man dann halt diese Torus-Architektur zur Verfügung
gestellt, bei denen es so auch um nächste Nachbarschaften geht.
Also wenn Sie irgendetwas in so Gitter-ähnlichen Strukturen in der
Realität simulieren wollen, dann ist es sinnvoll, die natürlichen
Kommunikationsstrukturen auch hier in dieser Torus-Architektur
nachzubilden.
Das sind sehr interessante Dinge.
Auch darüber kann man mehr lernen, wenn man in Vorlesungen über
parallele Algorithmen geht.
Programmierung des Nachrichtenaustausches.
Ich sagte, es gibt Rechner, bei denen man sich darum nicht kümmern
muss.
Bei einigen muss man sich explizit darum kümmern, gerade wenn Sie zum
Beispiel so einen Beowulf-Cluster realisieren wollen bei sich zu
Hause.
Vielleicht wollen Sie ja 50 Rechner sich da hinstellen und
hochleistungs - oder anspruchsvolle Rechnungen ausführen.
Dann müssen Sie natürlich sich mit dem Nachrichtenaustausch
beschäftigen.
Dafür gibt es einmal spezielle Programmiersprachen.
Das sogenannte HP-Fortran, High-Performance-Fortran mit speziellen
Klassen - oder Funktionsbibliotheken für Nachrichtenaustausch, für
parallele Anwendungen.
Sie können Java einsetzen mit speziellen APIs.
Auch wieder spezielle Methoden, die den Nachrichtenaustausch zwischen
Parallelrechnern unterstützen.
Oder Sie nehmen eine der Standard-Funktionsbibliotheken, wie hier
dieses PVM.
Das ist eine klassische Bibliothek, Parallel Virtual Machine, die es
Ihnen erlaubt, mit einer Vielzahl von Funktionen die Operationen in
Parallelrechnern oder in solchen Multiprozessor-Architekturen zu
realisieren, die man halt so braucht.
Eine andere Alternative ist das MPI.
Letztes Mal war mir die Bedeutung nicht ganz entfallen, aber ich hatte
die Abkürzung nicht mehr im Kopf gehabt in dem Augenblick.
Also das Message Passing Interface.
Und das heißt, ich habe hier ein Interface, also eine Schnittstelle,
um Nachrichten auszutauschen zwischen Rechnern.
Das ist ja das, was ich machen muss bei solchen schwächer gekoppelten
Rechnern.
Ich muss Nachrichten austauschen und MPI, also eine Alternative zu
Parallel Virtual Machine, stellt auch eine Vielzahl von Funktionen zur
Verfügung, um Nachrichten zu verschicken.
Und wenn Sie darüber mehr lernen wollen, gehen Sie in Vorlesungen über
verteilte Algorithmen.
Da wird darüber einiges erzählt.
Oder auch in der Vorlesung effiziente Algorithmen.
Gut, jetzt will ich noch ganz speziell kurz eingehen auf die
verteilten Systeme.
Das sind jetzt noch schwächer gekoppelte Rechner als in solchen
Parallelrechnern wie SP2 oder ähnliches.
Das sind weitgehend autonome, in der Regel heterogene Rechner, die
durch den Austausch von Nachrichten kommunizieren.
In dem Fall erfolgt die Kommunikation halt über ein Netzwerk von
Leitungen.
Und wir reden dann von Rechnernetzen.
Ich werde das Thema Rechnernetze etwas später noch wieder
zurückkommen.
Was ist das Ziel verteilter Systeme?
Wir wollen einen Leistungsverbund erreichen.
Eine höhere Rechenleistung erzielen, dadurch, dass wir mehrere Rechner
zusammenschalten.
Wir wollen höhere Zuverlässigkeit haben.
Das heißt, ich kann auch bei Ausfall eines Rechners eine Funktion
trotzdem erreichen, indem ein anderer Rechner diese Aufgabe übernimmt.
Und ich möchte gerne die Last, die ich habe, verteilen auf alle
Rechner, die mir zur Verfügung stehen, um dadurch insgesamt meine
Aufgaben schneller zu erledigen.
Die Idee, die dahinter steckt, die Idealvorstellung ist, ich habe eine
große Firma mit vielen Rechnern und die Standarderfahrung ist, dass
die Rechner ungenutzt herumstehen.
Da möchte man die Last, die man hat, möglichst gleichmäßig verteilen.
Auch dann, wenn der eigentliche Benutzer den Rechner gar nicht für
sich nutzt, soll die Rechenleistung für andere Aufgaben eingesetzt
werden können.
Wenn ich mehrere Rechner einsetze, im Vergleich zu einem, ist es klar,
habe ich ein verbreitetes Dienstleistungsangebot.
Und da ist eben eine Standardanwendung, dass ich halt mehrere Server
habe.
Also Server 1, Server 2, vielleicht mehrere, also irgendwelche K
-Server.
Und ich habe eine ganze Reihe von Clients.
Client 1, Client 2 und so weiter.
Client N, das war schlecht geschrieben.
Client N soll das bedeuten.
Und was machen die?
Die wollen alle Funktionen ausführen, wie zum Beispiel etwas drucken
oder E-Mail schicken oder ähnliches.
Und dann schicken sie halt eine Nachricht oder führen einen Remote
Procedure Call aus.
So nennt man das häufig bei den verteilten Systemen, Remote Procedure
Call.
Eine Prozedur, eine Methode, eine Funktion, die in dem Rechner, in dem
Client nicht zur Verfügung steht, aber in dem Server, der führt sie
aus.
Und wird irgendwann, wenn es erforderlich ist, eine Rückmeldung geben,
dass die Aufgabe erledigt ist.
Der Client kann in der Zeit andere Aufgaben erledigen.
Und der wird nicht nur sich mit einem unterhalten, sondern wird auch
Funktionen vom anderen nutzen.
Und so sind also diese Rechner, diese Clients und Server dann
verbunden.
Es kann sein, dass sie nur einen Server haben, es kann sein, dass sie
mehrere haben.
Wie gesagt, bei solchen Client-Server-Architekturen, der Name steht
glaube ich auch auf der, genau, steht hier auf dem nächsten Satz.
Also Client-Server-Systeme, Standard-Architektur, Sie werden kaum noch
irgendwelche Unternehmensrechner-Infrastrukturen finden, die nicht als
Client -Server-System organisiert sind.
Sie brauchen immer einige Server für bestimmte Aufgaben, wie Web
-Server oder File-Server oder Mail-Server oder E-Commerce-Server, also
Business -Server und ähnliches.
Und all diese arbeiten dann halt so, dass sie Klienten haben, Clients,
Kunden, die Funktionen ausgeführt haben möchten, die dann der Server
für sie erledigt.
Gut, das ist nicht die einzige Art, wie man solche verteilten Systeme
realisiert.
Client -Server ist die einfachste Art, weil sie da eine saubere
Trennung haben zwischen den Aufgaben.
Sie haben einerseits die Clients, die halt nur Funktionen aufrufen bei
den Servern.
Jetzt kann es aber auch sein, dass Sie hier mehrere Server haben, die
sich gegenseitig Aufgaben zuschieben und dann redet man häufig auch
von Peer-to-Peer-Systemen.
Also das sind dann eher gleichberechtigte Knoten in einem größeren
System, die Aufgaben übernehmen und sich dann gemeinsam Aufgaben
lösen.
Peer -to-Peer-Systeme hat es im Prinzip schon lange gegeben, sie sind
aber jetzt in letzter Zeit als Schlagwort sehr modern geworden.
Wenn Sie irgendwas lesen über so neuste Entwicklungen im Bereich E
-Commerce, lesen Sie überall Peer-to-Peer-Systeme.
Da hat halt irgendjemand entdeckt, dass es nicht nur Client-Server
-Systeme gibt bei verteilten Systemen, sondern dass man das auch
anders machen kann.
Etwas, was die Leute im Bereich verteilte Systeme längst wussten, aber
wenn das eben einige merken, die in anderen Bereichen der Informatik
gearbeitet haben, dann ist es ein ganz neues, tolles Schlagwort.
Peer-to-Peer-Systeme.
Eine Zeit lang hat man von Multi-Agenten-Systemen geredet, bei denen
also viele Agenten im Netz unterwegs sind und Aufgaben für sie
erledigen.
Heute redet man dann von mehreren Peers, die etwas machen.
Das hat mit verschiedenen Dingen zu tun, auf die ich jetzt hier gar
nicht mehr eingehen will.
Der positive Effekt ist, wenn man wieder so ein neues Schlagwort in
die Öffentlichkeit bringt, springen dann eine Reihe Leute wieder drauf
und entwickeln neue Ideen.
Und das bringt uns ja auch alle dann weiter.
Man muss nur sehen, dass man nicht den Fehler macht, dann alles
umzustellen auf diese neue Architektur, sondern zu sehen, dass man die
Vorteile der verschiedenen Entwicklungen für seine eigenen Anwendungen
sinnvoll nutzt.
Okay, also verteilte Systeme sind nichts, was irgendwo in der Zukunft
ist, sondern die sind Realität, aber sie sind in verschiedener Form
Realität.
In der einfachsten Form das Client-Server-System, wobei ich sage in
der einfachsten Form.
Wenn Sie die Aufgabe haben, verteiltes System zu managen, ist das gar
nicht leicht.
Also jemand, der sehr gut Bescheid weiß darüber, wie man Client-Server
-Systeme effizient und effektiv managt, der hat immer noch gute
Berufsaussichten.
Also das ist schon gar nicht so einfach, aber dafür gibt es halt
Standard -Vorgehensweisen inzwischen.
Und in dem Bereich kann man sicherlich noch mehr machen.
Ich komme darauf nochmal zurück, wenn wir uns mit Rechnernetzen
genauer beschäftigen.
Sie haben in der, ich hatte in der vorigen Woche eine Version dieses
Kapitels Ihnen in die Hand gegeben, bei der Sie hier im Anschluss
sofort Rechnernetze fanden.
Das habe ich jetzt etwas modifiziert, weil Rechnernetze eigentlich
einen eigenen Abschnitt verdient.
Da zähle ich Ihnen dann etwas mehr zu.
Jetzt muss ich auf die andere Vorlesung kommen.
Wo habe ich jetzt die?
Da nicht.
Dann machen wir das hier mal zu.
Genau, da haben wir ja das.
Nächste, wir haben das Kapitel über Speicher.
Also 8.3, das Kapitel über Speicher.
Ich habe Ihnen jetzt einiges erzählt über Alternativen zur Von-Neumann
-Architektur, wie wir durch unterschiedliche Organisationen,
unterschiedliches Architekturprinzip, wie diesen Assoziativrechner und
andere Organisationen, Parallelverarbeitung usw.
die Leistungsfähigkeit des Rechners erhöhen können.
Ein anderer wichtiger Bereich, der mit der Leistungsfähigkeit von
Rechnern zu tun hat, ist der Bereich der Speicher.
Und hier, eigentlich soll hier beim...
Genau, da ist es.
Ich wollte an meinen Filzstift rankommen.
So, jetzt habe ich Ihnen gleich die ganze Seite hier gezeigt.
Also, worum geht es bei Speichern?
Da müssen wir uns einfach angucken, was haben die eigentlich für
Eigenschaften.
Wenn wir deren Leistungsfähigkeit beurteilen wollen, dann müssen wir
natürlich sehen, was interessiert uns dabei eigentlich.
Also Speicher zunächst mal, daran erinnern Sie sich noch aus dem Teil
über Schaltnetze, Schaltwerke.
Da habe ich Ihnen schon etwas erzählt über Speicher.
Das sind Bausteine, in denen wir Informationen flüchtig oder dauerhaft
ablegen wollen.
Auf jeden Fall müssen wir in der Lage sein, etwas reinzuschreiben und
es irgendwann wieder rauszuholen.
Und ich habe Ihnen auch gesagt, von Neumann Rechner ist es wesentlich,
dass wir sowohl Daten als auch Programme in diesem Speicher ablegen
können.
Der Zugriff auf Speicher ist das eine, was uns interessiert.
Wie kann ich eigentlich auf einzelne Bereiche im Speicher zugreifen?
Wir hatten schon gesehen, es gibt direkt adressierte Speicher, es gibt
Assoziativ -Zugriff.
Hier habe ich jetzt nur noch stehen, wahlfrei, sequenziell,
blockadressierbar.
Ich hätte also eigentlich hier noch sagen müssen, fällt mir jetzt auf,
Assoziativ.
Aber das ist so eine andere Architektur, die ist hier draußen
vorgelassen.
Also, wenn wir einen adressierbaren Speicher haben, dann gibt es eben
unterschiedliche Möglichkeiten.
Es kann sein, dass ich hier so ein Speicher habe, Folge von Registern,
und ich habe halt hier verschiedene Nummern dran stehen und so weiter,
und kann dann einfach auf irgendeine Adresse zugreifen, beliebig.
Es kann auch sein, dass ich etwas habe, was Sie bei der Turing
-Maschine gesehen haben, halt ein Speicherband, und Sie haben hier so
eine Art Lesekopf.
Und dieser Lesekopf, der muss halt hin und her bewegt werden, oder das
Band hin und her bewegt werden, um auf einzelne Bereiche dieses Bandes
zugreifen zu können.
Das sind halt so die unterschiedlichen Dinge.
Das, was wir uns zunächst mal anschauen, ist der wahlfreie Zugriff.
Wahlfrei heißt halt Random Access.
Ich kann auf beliebige Speicherzellen zugreifen.
Und charakterisiert ist das dadurch, dass ich also auf ein
Speicherelement unabhängig von seiner Position mit dem gleichen
zeitlichen Aufwand zugreifen kann.
Es ist direkt erreichbar.
Und der Gegensatz dazu wäre eben so eine Bandorganisation, wo ich
halt, wenn ich am Anfang des Bandes bin, halt erstmal sehr lange das
Band laufen lassen muss, bis ich ans Ende des Bandes komme.
Also sehr unterschiedliche Architekturen.
Wahlfreier Zugriff ist das, was wir gerne haben.
Beispiel kennen Sie alle, Random Access Memory oder Read-Only Memory.
Wichtige Unterscheidung, wir brauchen einige Bereiche im Rechner, bei
denen wir nur lesen.
Da darf nichts reingeschrieben werden.
Einige elementare Daten, die so den Kern des Betriebssystems
darstellen, die müssen im Read-Only Memory abgelegt sein, damit Sie
tatsächlich den Rechner hochfahren können.
Wenn Sie nicht so einen ROM hätten und Sie würden dort etwas
reinschreiben, dann hätten Sie halt echt Probleme.
Man kann so ein Read-Only Memory so organisieren, dass es beim
Herstellungsprozess bereits programmiert wird.
Das heißt, Sie können dort nie wieder etwas ändern.
Das wäre etwas sehr stark nur Lesespeicher.
Dann gibt es solche Programmable ROMs, die durch den Anwender
programmierbar sind, aber danach fest nicht wieder veränderbar.
Das heißt, Sie können nur einmal etwas reinschreiben.
Ein PROM, Programmable ROM.
Und dann gibt es noch die EPROMs, Erasable Programmable Read-Only
Memory.
Da ist die Information durchaus wieder veränderbar, aber da müssen Sie
schon besondere Aktionen vornehmen, um das EPROM zu verändern.
Das können Sie nicht so ohne weiteres machen.
Der Sinn ist halt, dass man Speicherbereiche hat, in denen man nicht
aus Versehen irgendwelche Informationen verändert oder löscht.
Im Gegensatz dazu brauchen wir natürlich wesentliche Speicherbereiche
in einer Form, in die wir ständig neue Informationen reinschreiben
können.
Das wäre dann unser Random Access Memory.
Speicher, in denen wir schreiben können und Sachen wieder rauslesen
können.
Und vor allen Dingen müssen wir eben von jedem Programm aus in diesen
Speicherbereich hineinschreiben oder daraus lesen können.
Noch hier unten kurz die Bemerkung, dass natürlich dieser Name Random
Access Memory eigentlich gar nicht sinnvoll ist in dem Fall.
Random Access Memory heißt ja nur die Charakterisierung, ich habe
einen wahlfreien Zugriff.
Den wahlfreien Zugriff habe ich beim Read-Only Memory auch.
Aber das ist halt ein spezieller Random Access Memory Speicher, bei
dem ich halt Read-Only Memory habe.
Gut.
Im Gegensatz dazu den sequenziellen Zugriff hatte ich Ihnen gerade
eben schon aufgelistet oder schon erwähnt.
Wenn Sie ein Band haben als Speicherelement, dann können Sie nur
sequenziell zugreifen.
Das ist also die eine Möglichkeit.
Sie haben so ein langes Band.
Es kann aber auch sein, dass Sie eine große Scheibe haben und Sie
haben hier irgendwo Ihr Lesegerät, das darauf zugreifen kann.
Aber Sie müssen, um auf ein Datum zuzugreifen, das da drüben ist,
müssen Sie halt warten, die Scheibe dreht sich, bis das Datum unter
diesem Lesekopf ist.
Das ist auch kein wahlfreier Zugriff.
Das wäre ein sequenzieller Zugriff.
Also da gibt es verschiedene Varianten von solchen Speichern mit
sequenziellem Zugriff.
Das eine, also Magnetbandspeicher, ist das typische.
Das, was ich Ihnen hier angedeutet habe, der blockadressierbare
Zugriff, ist noch wieder etwas anderes.
Ich habe eine Mischung aus wahlfreiem und sequenziellem Zugriff.
Ich kann auf bestimmte Bereiche direkt wahlfrei zugreifen und kann
dann aber innerhalb so eines Blocks nur sequenziell lesen.
Da sind die typischen Bereiche Diskette, Festplatte, CD, wobei die
Wahlfreiheit bei dem Block nicht ganz so richtig ist.
Ich kann zwar hier beliebig auf so einer Scheibe Blöcke adressieren
und kann dann darauf zugreifen, muss aber warten, bis der Beginn
dieses Blocks tatsächlich unter meinem Lesekopf ist auf der Platte.
Und dann kann ich auf die einzelnen Elemente in dem Block nur
sequenziell zugreifen, muss den Speicher holen, Hauptspeicher, und
kann dann dort natürlich wieder wahlfrei zugreifen.
Da gehen wir gleich noch genauer darauf ein, wie solche Speicher
konkret organisiert sind.
Hier steht Block 0, Block 1, Block 2, zum Beispiel 2 KB pro Block.
Und wenn Sie also zugreifen auf solch ein Speicherelement, Diskette,
Festplatte oder CD, greifen Sie immer auf einen Block zu und nicht auf
ein einzelnes Datum, während Sie bei dem wahlfreien Zugriff natürlich
auf einzelne Speicherzellen zugreifen.
Bei diesen Speichermedien greifen Sie immer auf einzelne Blöcke zu und
haben halt in der Regel dann viel, wenn Sie das falsch organisiert
haben, unnütze Daten mit dabei, wenn Sie es gut organisiert haben,
brauchen Sie auch alle Daten innerhalb eines Blocks.
In der Regel hat man mehrere logische Datensätze pro Block.
Wir werden hier auf diese Organisation von solchen
Hintergrundspeichern noch zurückkommen.
Wie legt man eigentlich Dateien sinnvoll ab, sodass in den Blöcken,
die man vom Speicher kriegt, tatsächlich sinnvolle Daten drin sind.
Wie sieht das aus mit der Speicherkapazität?
Das eine war die Art des Zugriffs, das andere ist, wie viel kann ich
eigentlich in den Speicher ablegen.
Das kann man natürlich unterschiedlich messen.
Wir messen das in der Regel durch Bezeichnungen wie Kilobyte,
Megabyte, Gigabyte, Terabyte, Petabyte, jeweils unterschieden nach den
Zweierpotenzen, die hier dahinter stehen.
Von Kilobyte 2 hoch 10, Megabyte 2 hoch 20 und so weiter bis Petabyte
2 hoch 50 Daten.
Wer braucht jemals 2 hoch 50 Daten?
Ich kann mich noch daran erinnern, als wir bei unserem Großrechner im
Rechenzentrum der Universität, an der ich früher mal war, als wir da
den Speicher auf ein Megabyte erhöht haben.
Und Bill Gates hat irgendwann gesagt, Anfang der 80er Jahre, es
braucht eigentlich niemand, keine Anwendung braucht jemals mehr als
640 Kilobyte.
Er kann sich das nicht vorstellen, dass man mehr als 640 Kilobyte
braucht.
Deswegen hat er ja auch bei seinem Betriebssystem diese imaginäre
Grenze von 640 Kilobyte eingeführt.
Weil er meinte, man braucht eigentlich gar nicht mehr.
Er konnte sich nichts vorstellen, wo man mehr braucht als 640
Kilobyte.
Inzwischen sind wir der Meinung, wir haben keinen leistungsfähigen
Rechner mehr, wenn die Festplatte weniger als 20 oder 30 Gigabyte
Hauptspeicher hat.
Das ist natürlich wirklich ein Ende größer.
Da sind wir bei 2 hoch 30.
Und wenn wir uns angucken, was so alles heutzutage gespeichert wird,
zum Beispiel in den USA, wenn Sie sich das anschauen, der
Geschäftsverkehr läuft völlig anders als bei uns.
Nicht auf elektronischem Wege, sondern da wird sehr viel mit Checks
gearbeitet.
Sie schicken Ihren Check zur Telefongesellschaft und die lesen dann
den Check ein und verbuchen dann die Zahlung.
Und da müssen solche Checks alle gespeichert werden.
Die werden eingescannt und gespeichert.
Das ist ein ziemlich hoher Datenaufwand.
Das heißt, Sie haben hier allein mehrere Terabyte Speicher allein für
diese ganzen Checks, die gespeichert werden.
Und wenn Sie mehrere Terabyte pro Monat haben, kommen Sie sehr bald in
die Bereiche von Petabyte.
Oder eine ganz neue Entwicklung.
Ich hatte schon mal angesprochen, dass es sowas gibt wie Grid
Computing.
Also Nutzen des weltweiten Rechnernetzes für verteilte Berechnungen.
Im Höchstleistungsrechnen, gerade bei physikalischen Anwendungen,
werden nicht nur viele Berechnungen gemacht, sehr komplexe
Berechnungen, sondern da treten auch viele Daten auf.
Im CERN in Genf werden viele neue Experimente gemacht und werden halt
Zerfallerscheinungen untersucht von Elementen.
Es werden sehr viele Daten gemessen.
Das sind mehrere Terabyte pro Tag, die dort an Daten anfallen.
Und diese Daten müssen alle gesammelt werden, die sollen alle
ausgewertet werden.
Weltweit von Wissenschaftlern werden die ausgewertet.
Und ein zentraler Knoten, in dem diese Daten gesammelt werden, wird
hier in Karlsruhe sitzen, am Forschungszentrum.
Und da muss man also in der Lage sein, mehrere Terabyte pro Tag
aufzusammeln, sinnvoll zu speichern, zu organisieren und den Zugriff
zu ermöglichen für Forscher, die weltweit verteilt sind.
Es wird also mehrere solche Knoten geben, solche Data-Grid-Knoten.
Aber der zentrale sitzt hier in Karlsruhe.
Und dass man sich nochmal klar macht, was das für Dinge sind, was das
für Größenordnungen sind.
Ich finde es häufig sehr hilfreich, einfach mal so eine grobe
Berechnung zu machen.
So über den Daumen abgeschätzt.
Was heißt das eigentlich, wenn ich davon rede, ich habe ein Petabyte
Daten vom Hintergrundspeicher zu lesen.
Ich möchte Daten verteilen.
Jetzt habe ich mehrere Terabyte Daten pro Tag oder ich habe vielleicht
jetzt ein Petabyte Daten, die will jemand in den USA haben.
Oder ich möchte sie nur mit meinem PC, mit meinem Hochleistungspc, ein
Gigahertz -PC kann man vielleicht noch als relativ leistungsfähig
ansehen, mit dem möchte ich einfach diese ein Petabyte Daten lesen.
Nur mal durchscannen.
Was heißt denn das?
Pro Takt einweit wäre eine Möglichkeit.
Wir wissen, pro Takt bei so einem Rechner heißt, ich habe ein Takt von
der Befehlspipeline ausgenutzt.
Das kommt durchaus hin.
Übliche Datenzugriffszeiten wären noch anders.
Da kommen wir gleich noch darauf zurück, wie das eigentlich aussieht.
Wenn Sie von der Festplatte irgendwas lesen wollen, wie viele Bits pro
Sekunde Sie lesen können.
Aber wenn Sie allein annehmen, Sie können ein Byte pro Tag lesen.
Sie haben ein Gigahertz-PC, das heißt Sie hätten 8 Gigabit pro
Sekunde.
Rechnen Sie das mal aus, wenn Sie dann ein Petabyte Daten lesen
wollen.
Sie kommen so in die Größenordnung von 14 Tage Arbeitszeit.
Nur um ein Petabyte Daten zu lesen.
Mit einem Gigahertz-PC.
Unter diesen optimistischen Annahmen.
Wenn Sie weniger optimistisch sind, mehr realistisch und die üblichen
Zugriffszeiten sich anschauen auf Speicherbereiche.
Dann sind Sie halt deutlich unter diesen 8 Gigabit pro Sekunde.
Und sofort sehen Sie, dass man dann sehr sehr lange braucht, um mit
diesen Daten umzugehen.
Trotzdem bauen wir solche Knoten auf.
Das heißt, da werden sehr sehr viele Rechner erforderlich sein, um
solche riesen Datenmengen vernünftig bearbeiten zu können.
Sie müssen ja daran denken, die müssen auch gesichert werden.
Jetzt machen Sie mal ein Backup für einen Speicher, in dem mehrere
Petabyte Daten sind.
Mal kurz über das Wochenende.
Das ist gar nicht so einfach.
Wenn Sie ein großes Unternehmen zu betreuen haben und dort für die
Datensicherheit zuständig sind und dafür sorgen müssen, dass
regelmäßig Datensicherungen gemacht werden.
Dann können Sie sich vorstellen, was dafür eine Infrastruktur
erforderlich ist.
Allein um solche Aufgaben sinnvoll erfüllen zu können in einer kurzen
Zeit.
Denn es macht keinen Sinn, wenn ein Backup Ihres Speichers 14 Tage
oder 2 Monate dauert.
Das muss über das Wochenende möglich sein.
Gut, nur dass Sie sehen, Speicherkapazität ist ein wichtiger Punkt.
Zugriffsart war ein wichtiger Punkt.
Kommt noch ein bisschen mehr dazu.
Der Zugriffszeit natürlich auch.
Hatte ich gerade eben schon indirekt angesprochen.
Zugriffszeit kann sehr unterschiedlich sein.
Hatte ich schon gesagt, als wir uns mit der Prozessorarchitektur
begannen zu beschäftigen.
Wir haben unterschiedliche Arten von Speichern.
Beginn in der Nähe des Prozessors, leistungsfähiger als ein bisschen
weiter weg.
Wir haben halt einige Dinge zu berücksichtigen, wenn es um die Zeit
geht für die Ausführung eines Speicherzugriffs.
Das ist Zeit entweder zum Lesen oder zum Schreiben.
Und wir haben sehr unterschiedliche Speicherarten zur Verfügung.
Und je nachdem haben wir dann unterschiedliche Zeiten fürs Lesen und
Schreiben eines Speicherelements.
Insbesondere haben wir eine Unterscheidung in Static RAM und Dynamic
RAM.
Static RAM ist deutlich schneller, aber auch teurer in der
Realisierung als Dynamic RAM.
Dynamic RAM ist also üblicherweise die Speicherart im Arbeitsspeicher.
Static RAM ist das, was wir im Cache zur Verfügung haben.
Der Cache muss deutlich schneller sein als der Arbeitsspeicher.
Und warum ist der Dynamic RAM so viel langsamer?
Beim dynamischen Speicher, da muss man den Speicherinhalt nach jedem
Zugriff wieder neu reinschreiben.
Wenn Sie also lesen aus einer Speicherzelle im dynamischen Speicher,
müssen Sie anschließend den Wert wieder reinschreiben.
Sonst ist er weg.
Das braucht natürlich Zeit.
Wenn Sie einen statischen Speicherzelle haben, dann können Sie darauf
zugreifen, Sie müssen nicht wieder auffrischen, das geht schneller.
Aber das kostet auch.
Also Sie haben bei dynamischen Speichern ein bis drei Transistoren pro
Bit, bei statischen Speichern haben Sie deutlich mehr.
Vier bis sechs, eventuell noch mehr, je nachdem wie man das auslegt.
Das sind natürlich höhere Kosten.
Und wie gesagt, die Zeiten sind bei statischen Speichern niedriger,
bei dynamischen Speichern höher.
Dann schauen wir uns Platten- und Bandspeicher an.
Da haben wir halt das Problem, dass wir die Blockadressierbarkeit
haben oder die sequentielle Adressierbarkeit.
Das heißt, wir müssen uns die Zeit anschauen zum Erreichen einer
gesuchten Speichereinheit.
Wir können nicht direkt zugreifen auf jeden Block, sondern wir müssen
erstmal mit unserem Lesekopf auf dem entsprechenden Bereich sein,
haben dadurch deutlich höhere Zeiten.
Und das Problem ist, dass wir hier im Wesentlichen mechanisch bewegte
Teile haben.
Selbst in unseren Hochleistungsrechnern haben wir mechanisch bewegte
Teile.
Das können Sie alle ständig erleben, wenn Sie auf Ihrem Rechner
arbeiten.
Wenn Sie viel Speicherzugriff haben, hören Sie so ein kleines Klackern
im Hintergrund.
Die Speicherzugriffe, da bewegen sich die Schreibleseköpfe Ihres
Plattenspeichers, positionieren sich hin und her.
Und das ist dieses kleine Klackern, was Sie im Hintergrund hören.
Und das sind wirklich mechanisch bewegte Teile.
Die brauchen Zeit.
Und da kann man durch Elektronik nicht viel machen.
Und deswegen werden Sie gleich sehen, dass es da Zugriffszeiten,
Unterschiede gibt, die einfach Größenordnung ausmachen.
Zwischen den Arbeitsspeichern, den rein elektronisch realisierten
Speichern und diesen Platten- und Wandspeichern.
Der dritte Bereich ist die Energieabhängigkeit.
Es gibt Speicher, die abhängig sind von Energie.
Die Halbleiterspeicher, wobei das natürlich für ROM nicht gilt,
sondern nur für RAM, die ihren Inhalt bei Stromausfall verlieren.
Und dann haben wir die energieunabhängigen Speicher, bei denen eine
Zustandserhaltung ohne Energieaufwand möglich ist.
Also auf Band und Platte bleibt natürlich der Inhalt erhalten.
Auch DVD oder CD-ROM und Ähnliches.
Das sind halt andere Prinzipien als bei den Arbeitsspeichern.
Also ich habe das jetzt sehr schnell gemacht.
Ich hoffe, da steht nicht viel inhaltlich drauf.
Einfach nur, dass es unterschiedliche Arten von Speichern gibt, die
einen flüchtigen Inhalt haben oder einen dauerhaften Inhalt.
Dann habe ich hier eine Tabelle Ihnen mal kurz zusammengestellt.
In der Sie sehen können, so einige Angaben über die typischen
Kennwerte von Speicherarten.
Das ist so ein bisschen ein Problem.
Ich versuche immer jedes Jahr diese Tabelle anzupassen an den
aktuellen Stand.
Es ist gar nicht so einfach immer rauszufinden, was sind eigentlich
die aktuellen Grenzen für diese Speicherparameter.
Da entwickelt sich ja auch einiges.
Also, Halbleiter, also Speicherarten.
Hier oben habe ich Halbleiterspeicher aufgeführt.
Bipolar, darüber habe ich Ihnen gar nichts erzählt bei der
Realisierung von Schaltnetzen und Schaltwerken.
Ich habe Ihnen nur etwas über CMOS erzählt.
Bipolar ist noch eine etwas andere Art, Schaltelemente in Hardware zu
realisieren, die auch relativ schnelle Bausteine ermöglicht.
Da haben Sie halt zum Beispiel hier Assoziativzugriff, wie im L1-Cache
auf dem Chip.
Die Kapazität 1 KB oder bis 16 KB, das mag auch größer sein
inzwischen.
Wichtig ist nur, dass es so im Kilobyte-Bereich.
Kann 10 sein, vielleicht sind Sie ja inzwischen auch schon bei 100.
Aber das ist auf jeden Fall kein sehr großer Speicherbereich.
Zugriffszeiten verändern sich natürlich auch ständig.
Die werden aber nicht ganz so stark wie die Schaltzeiten von
Transistoren.
0,1 Nanosekunden bis 5 Nanosekunden, je nachdem wie das realisiert
ist.
Dann sind wir hier bei den SRAM-Halbleitern, Bipolar oder CMOS.
Das wäre also typischer L2-Cache, Off-Chip, 1 MB Cache, so die
Größenordnung.
Sie kommen im MB-Bereich bei der Cache-Größe.
Kann auch sein, dass Sie schon mehrere MB Caches haben in Ihren
normalen PCs.
Sind Sie auch in der Größenordnung 1 MB oder 0,5 MB Cache.
Zugriffszeiten sind etwas höher schon als bei dem L1-Cache, On-Chip.
Und wenn Sie dann auf DRAM kommen, auf also üblichen Hauptspeicher,
Dynamic RAM, dann können Sie natürlich hier Speichergrößen
realisieren, die zwischen 1 KB, wer hat noch 1 KB Speicher?
Das ist klar, Sie können das beliebig klein machen, Sie können auch 1
KB da hinschreiben.
Wesentlich ist halt, dass man auf mehrere GB durchaus kommen kann.
Hochleistungs-Server haben mindestens 1 GB Hauptspeicher.
Selbst also die neue Generation der Rechner in unserem Zip-Pool in der
Fakultät, wird PCs haben, die jeder 1 GB Hauptspeicher haben.
Das sind dann keine Server, das sind einfache Rechner für jeden
Studenten.
Und das ist also zur Zeit sicherlich nicht so, dass Sie sich, wenn Sie
zu Hause sich einen Rechner kaufen, da 1 GB Hauptspeicher reinsetzen,
aber Sie werden sicherlich schon 256 MB oder 512 MB reinsetzen.
Und wie gesagt, 1 GB ist gar nicht so weit entfernt, Server haben in
der Regel dann mehrere GB Hauptspeicher.
Suchmaschinen haben in der Regel sehr, sehr große Hauptspeicher.
Zugriffszeiten liegen aber hier eben deutlich über dem, was wir im
Cache zur Verfügung haben.
Deswegen muss man sich eben auch mit der Cache-Architektur genauer
beschäftigen.
Dann habe ich hier Flash-Speicher aufgeführt, hier sehen Sie einen
deutlichen Sprung.
Da sind wir im Nanosekundenbereich gewesen, bei den
Halbleiterspeichern.
Jetzt kommen wir hier auf Flash-Speicher, da sind wir im
Millisekundenbereich.
Das ist ein Sprung von 1000 zwischen Nanosekunden und... Quatsch, noch
größer.
Wir haben hier Nanosekunden, nicht Mikrosekunden, sondern wir haben
Millisekunden.
Eine Million Unterschied.
Und eine Nanosekunde, eine Millisekunde unterscheiden sich um 10 auf
6.
Das ist ein deutlicher Unterschied und der ist nun mal leider da.
Das heißt, Sie haben einen sehr langsamen Zugriff auf Flash-Speicher.
Wobei Flash-Speicher in der Regel sogar noch schneller sind als
Plattenspeicher, Magnetplatte.
Also nochmal kurz, Flash-Speicher, was ist ein Flash-Speicher?
Wenn Sie irgendwo so eine Karte reinstecken, so ein Memory-Stick oder
sowas, was ist denn alles Flash-Speicher?
Flash-Speicher haben eine Größenordnung bis zu 1 Gigabyte inzwischen.
Hier stand im vorigen Jahr noch irgendwas bei 150 Megabyte.
Inzwischen geht es durchaus bis 1 Gigabyte.
Die üblichen Memory-Sticks, die sind sowas bei 64 Megabyte oder 128
Megabyte oder sowas in der Größenordnung.
Es gibt aber durchaus welche, die schon in der Größenordnung liegen.
Sie haben also eine langsame Zugriffszeit, dauert lange, um auf einen,
ja in dem Fall Block, zuzugreifen.
Dann können Sie aber, da Sie ja mit einem Zugriff viele Daten
runterholen, dann bis zu hier 5 Megabit pro Sekunde so etwa Daten dort
auslesen.
Bei der Magnetplatte ist es so, ist natürlich auch Block adressierbar.
Übliche Magnetplattengrößen liegen jetzt zwischen 20 und 200 Gigabyte.
Also kleinere als 20 Gigabyte gibt es eigentlich kaum noch.
Das ist schon sehr schwierig, da an sowas ranzukommen.
Wozu auch?
Die Größen liegen jetzt so bei 200 Gigabyte.
Vor nicht allzu vielen Jahren haben wir einen großen Fileserver für
die Universität beschafft.
Der hatte 150 Gigabyte Speicher.
Da wurde darüber gerungen, wer nun wie viel Anteil auf dieser riesen
Speicherkapazität bekommt von 150 Gigabyte.
Jetzt haben Sie einzelne Platten in Ihrem Rechner mit 60, 80 Gigabyte
und wie gesagt bis zu 200 Gigabyte auf einer Platte drauf.
Also die Kapazität, die ist in letzter Zeit auch ziemlich hoch
gegangen.
Aber die Zugriffszeit liegt bei 5 Millisekunden bis zu 25
Millisekunden.
Je nachdem, worauf man besonders Wert legt.
Und das hängt halt mit den mechanischen Teilen zusammen, über die Sie
auf diese Blöcke bei der Magnetplatte zugreifen.
Und wenn Sie aber erstmal zugegriffen haben, dann können Sie wieder
aufgrund der hohen Schreibdichte heutzutage auf den Platten halt auch
sehr viele Daten dann gleich runterlesen.
Da können Sie bis zu 160 Megabit pro Sekunde runterlesen.
Aber eben, es dauert lange, bis Sie auf einen Block zugreifen können.
Und wenn jetzt Ihre Zugriffe auf die Festplatte ständig an
verschiedene Stellen Ihrer Platte gehen, in verschiedene Blöcke
hinein, dann haben Sie für jeden Zugriff eine Zeit zu kalkulieren, die
im Millisekundenbereich liegt.
Sie könnten zwar dann mit Megabit pro Sekunde dort Daten runterholen,
aber die anderen, die Sie auf dem Block mitgeholt haben, die brauchen
Sie halt alle gar nicht.
Und Sie müssen ständig auf verschiedene Blöcke zugreifen und haben
dadurch für jeden Zugriff im Millisekundenbereich zu spendieren.
Und das heißt bei einem Gigahertzrechner, dass Sie ganz schön lange
warten müssen, bis das nächste Datum da ist.
Der könnte in der Zeit sehr viele andere Dinge tun.
Laserplatte, also CD-ROMs, DVDs und so weiter, die liegen so im
Bereich 500 Megabyte.
680 ist die übliche CD-ROM-Größe bis 16 Gigabyte.
Aber Zugriffszeiten liegen auch im Millisekundenbereich.
Man kann durchaus sich vorstellen, bei einer Erhöhung der
Schreibdichte, dass man bis zu mehreren Terabyte hier kommt und auch
die Zugriffszeiten hier reduziert.
Also unter 1 Millisekunde, dass man so Größenordnung 100 Mikrosekunden
kommt.
Das wäre also wieder eine Größenordnung Zugriffszeit gewinnen und dann
auch mit Gigabit pro Sekunde darauf zugreifen kann.
Das ist aber noch Zukunftsmusik.
Disketten verlieren ihre Bedeutung.
1,4 Megabyte die Standardgröße bis zu 750 Megabyte.
Wenn Sie sich spezielle Arten von Disketten anschauen, ist sowas
durchaus realisierbar.
Zugriffszeiten sind lang.
Und dann schließlich die Kassetten als Datensicherungsmedium immer
noch die sinnvollste Möglichkeit.
Kassetten, Cartridges oder Magnetbänder mit sequenziellem Zugriff und
relativ hohen...
Also eine Kassette mit 100 Gigabyte auf einer Kassette ist ganz gut.
Und wenn Sie sich vorstellen, Sie haben eine Festplatte mit 200
Gigabyte, dann brauchen Sie schon zwei solche Kassetten, um eine
Platte zu speichern.
Das heißt, das ist auch ziemlich viel Organisationsaufwand, ist aber
erforderlich.
Und hier liegen halt die Zugriffszeiten zwischen Millisekunden, 10
Millisekunden, wenn Sie direkt praktisch an der Position sind, wo Sie
darauf zugreifen müssen...
bis zu einer Minute, damit Sie an die richtige Position gelangen auf
Ihrem Band.
Und Sie wissen, was Sie innerhalb einer Minute alles machen können.
Also als direktes Hintergrundspeichermedium selbstverständlich
überhaupt nicht geeignet.
Ich habe das Magnetband hier unten noch aufgeführt.
Natürlich ist eine Kassette auch eine Art Magnetband, aber diese
großen Rollen von Magnetbändern, die sind ja eigentlich nicht mehr so
relevant.
Vielleicht in einigen großen Datensicherungsanlagen, aber die haben
ihre Bedeutung doch ganz stark verloren.
Kommen wir zur Speicherorganisation.
Man muss natürlich jetzt diese unterschiedlichen Eigenschaften
berücksichtigen, wenn man Speicher organisiert.
Wir haben, also das hatte ich schon mal auf einer der früheren Folien
Ihnen gezeigt, unterschiedliche Arten von Speichern, je nachdem wie
nah wir an der CPU sind.
Wir wollen möglichst schnell rechnen können, wollen den von Neumann
-Engpass möglichst klein machen oder möglichst wenig merkbar.
Deswegen haben wir halt hier den Level 1 Cache auf dem Chip und dann
halt den Level 2 Cache und dahinter den Hauptspeicher und dann
irgendwelche externen Speicher im Hintergrund.
Und das, womit man sich erstmal beschäftigen muss, ist jetzt, was ist
eigentlich so ein Cache?
Der Cache ist also ein Assoziativspeicher oder hat wahlfreien Zugriff.
Beide Realisierungsmöglichkeiten gibt es.
Er ist in der Regel sehr schnell und enthält hoffentlich die nächsten
Befehle, Daten sowie deren Adressen.
Ich hatte bei der Pipeline-Organisation von Prozessoren darauf
hingewiesen, dass man dort bei der Befehlsausführung spekuliert.
In gewissem Maße spekuliert man auch bei der Belegung von
Speicherplatz im Cache.
Man hat dort die voraussichtlichen nächsten Befehle oder Daten.
Das heißt, wenn man zugreift, hatte ich gesagt, beim
Maschinenbefehlszyklus habe ich die Fetch-Phase.
Ich hole mir den nächsten Befehl.
Ich hole mir nicht den nächsten Befehl, ich hole mir die nächsten
Befehle.
Da kommen gleich mehrere Befehle in den Cache, weil ich annehme, dass
nach dem Befehl, den ich gerade brauche, der darauffolgende ausgeführt
werden wird.
Und dann ist der halt schon im Cache drin.
Ich brauche nicht den Umweg zum Hauptspeicher zu machen.
Der Level 1 Cache ist um mindestens eine Größenordnung schneller als
der Level 2 Cache.
Und natürlich, der wiederum ist schneller als der Hauptspeicher.
Wie sieht das aus?
Was ist in so einem Cache drin?
Ich habe dort sogenannte Cache-Lines.
Also das, was hier so eine Zeile ist.
Das ist eine sogenannte, habe ich gar nicht aufgeschrieben, Cache
-Line.
Und in jeder solchen Cache-Line ist drin vorne ein Tag und dann ein
Datenblock.
Und so ein Tag ist gerade die Hauptspeicheradresse des Datenblocks.
Warum muss da die Hauptspeicheradresse des Datenblocks drin sein?
Nun, ich möchte ja von der CPU aus zugreifen auf irgendein Datum.
Da habe ich irgendeine Adresse.
Und diese Adresse bezieht sich eigentlich auf irgendetwas im
Hauptspeicher.
Also hier im Hauptspeicher.
Dann schaue ich erstmal nach, ist mein Datum, auf das ich zugreifen
will, vielleicht im Cache?
Also suche ich, ob es hier eine Speicherzelle gibt in diesem Cache.
Und zwar in einem dieser Tag-Fields, die die Adresse des zugehörigen
Datenblocks bereits enthält.
Wenn ich Glück habe, ist hier halt irgendwo gerade meine Speicherzelle
vorhanden.
Oder meine Adresse vorhanden, vielleicht in dem Block.
Dann weiß ich, das was dahinter steht in dieser Cache-Line ist der
Block, in dem das Datum sich befindet, auf das ich gerade zugreifen
will.
Dann habe ich hier also Glück gehabt, ich kann auf dieses Datum
zugreifen.
Und hier brauche ich halt den inhaltsorientierten Zugriff.
Dann gibt es dafür verschiedene Möglichkeiten, darauf komme ich gleich
noch, wie man das macht.
Aber ich muss eben hier nach dem Inhalt suchen.
Ich muss wissen, ist also jetzt in so einer Zelle hier die richtige
Block -Adresse schon vorhanden.
Also ist der Block im Cache.
Wenn das nicht der Fall ist, dann muss ich halt woanders suchen.
Dann muss ich eventuell weitersuchen, dann gehe ich halt vielleicht
hier rüber zum Level-2-Cache.
Wenn ich da nicht bin, muss ich noch weiter laufen, muss in den
Hauptspeicher gehen.
Und immer länger wird der Zugriff auf die Speicherzelle.
Im Normalfall gehe ich davon aus, ich habe alle meine Daten, die ich
gerade brauche, also in der überwiegenden Zahl der Fälle im Level-1
-Cache, dann bin ich zufrieden.
Wir kommen auf die Cache-Organisation gleich noch zurück.
Im Hauptspeicher, das ist also meist DRAM, da haben wir dann Daten,
natürlich auch die meisten Daten drin gespeichert, der um Faktor 10
bis 100 langsamer sein kann als die beiden Caches.
Also ein ziemlicher Größenunterschied.
Das heißt, wenn Sie Cache, wenn Sie Ihre Programme so schreiben, dass
der Cache nicht gut genutzt ist, dann haben Sie wieder eine deutliche
Überzögerung.
Stellen Sie sich vor, Sie haben einen Rechner, bei dem Sie Ihre
Pipelines nicht ordentlich nutzen und Ihren Cache nicht ordentlich
nutzen und dann holpert der so vor sich hin und hat eine ganz
schlechte Performance.
Und das ist etwas, was sowohl zu tun hat mit intelligent organisierten
Betriebssystemen, also gutem Laufzeitsystem, gute Speicherverwaltung,
aber auch mit dem Schreiben von Anwendungen.
Wenn man sicher sein muss, dass Rechnungen schnell ausgeführt werden,
muss man auch darauf achten, dass der Cache dabei sinnvoll ausgenutzt
werden kann.
Also, die Arbeitsweise habe ich eben schon erläutert.
Die CPU möchte eine Speicherzelle lesen mit Adresse X, sucht dann im
Cache, also hier hatten wir die CPU, da haben wir den Cache, das war
also hier CPU, das ist jetzt unser Cache, Level 1, dann vielleicht
Level 2 und irgendwo dahinter ist unser Main Memory und wir laufen
halt hier hin und her, je nachdem, wo wir jetzt unser Datum
tatsächlich finden.
Also, falls ein Block im Cache ist, erhält die CPU vom Cache das
gewünschte Datum.
Falls der Block nicht im Cache ist, ein sogenannter Cache Miss, dann
wird er aus dem Hauptspeicher geholt bzw.
aus dem Level 2 Cache.
Das dauert natürlich deutlich länger, aber im Normalfall haben wir
halt einen erheblichen Zeitgewinn durch den Zugriff auf den Cache
gegenüber dem Zugriff auf den Hauptspeicher.
Jetzt ist die Frage, wie funktioniert das denn eigentlich?
Also, wenn wir unser Datum vom Hauptspeicher in den Cache schreiben,
wohin schreiben wir das denn?
Wenn wir ein Assoziativ-Cache haben, dann ist es eigentlich völlig
egal, dann können wir ja dort das an irgendeine Stelle legen.
Aber wir können es auch anders organisieren, wir haben hier das
sogenannte Directly Mapped Verfahren.
Directly Mapped heißt, wir haben unsere Speicheradresse und der Cache
enthalte maximal k Blöcke.
Jetzt können wir einfach unsere Adresse, dieser Block mit Adresse b,
der muss an eine bestimmte Position gelangen, der gelangt an die
Position b mod k.
Das heißt, wir teilen einfach unsere Adresse auf in zwei Bereiche.
Dieses k ist in der Regel eine Zweierpotenz, Adressen sind ja auch
dual dargestellt.
Das heißt, wir haben hier den Bereich b modulo k, das ist der Rest,
das wäre also b mod k und hier vorne haben wir b diff k.
So und jetzt, wenn ich also weiß, ich speichere hier b diff k ab.
Jetzt will die CPU auf einen bestimmten Block zugreifen, der kennt
also diese Adresse, hat man vorhin x genannt, kennt die Adresse x.
Er will sehen, ist jetzt diese Adresse im Cache drin.
Wo schaut er hin?
Dort wird gespeichert b diff k.
Also er kennt seine Adresse, auf die er zugreifen will, das ist das x,
beziehungsweise hier Blockadresse.
Entschuldigung, setzen wir kurz b gleich x.
Also es geht um die Adresse b und wir müssen also nur an der Position
b mod k nachschauen, ob dort der Wert b diff k steht.
Wenn dort der Wert b diff k steht, dann kann das nur die Adresse b
gewesen sein.
Dann wissen wir, dieser Block mit Adresse b ist tatsächlich im
Speicher.
Also die CPU will zugreifen auf Blockadresse b, schaut im Cache nach
an der Adresse b mod k.
Das ist ja eine einfache Berechnung, da brauche ich ja nur die
niedrigsignifikanten Bits mir anzuschauen.
Und dann schaue ich danach, welcher Wert dort steht und wenn dort der
Wert steht, der hier in dem höchstsignifikanten Teil ist, in der
linken Hälfte dieser Adresse, dann ist der Block im Speicher
vorhanden.
Das heißt, so kann ich das mit einem direkten Zugriff realisieren.
Man muss also in dem Fall nur an einer Stelle im Cache suchen, man
muss nicht diesen inhaltsorientierten Zugriff machen.
Bei ungünstigen Zugriffsmustern habe ich allerdings eine sehr hohe
Fehlerrate.
Also wenn ich jetzt an verschiedenen Stellen suche, kann es eben sein,
oder wenn meine Blöcke ungünstig angeordnet sind, auf die ich vom
Programm aus zugreifen muss, dann kann es sein, dass ich eine hohe
Fehlerrate habe.
Und dann habe ich halt häufige Cache-Fehler und damit Verlangsamung
des Programms.
Assoziativ heißt, der Block kann an beliebige Positionen gelangen, da
kommt es ja nicht darauf an, wo er genau steht.
Und dann kann ich diese Position zufällig auswählen.
Also bei dem Directly Mapped habe ich gar keine Wahl, wo ich in meinen
Block reinschreibe.
Die Cache-Line ist festgelegt durch die Adresse.
Beim assoziativen Cache ist im Prinzip die Position völlig egal.
Da kann ich zufällig irgendeine Position auswählen, aber ich würde
natürlich nicht die Cache-Line ersetzen, die als nächstes gebraucht
wird.
Und dann gibt es so einige Erfahrungen damit, welche man in der Regel
braucht.
Und eine Erfahrung ist ein Block, der am längsten nicht benutzt wurde.
Den kann ich ruhig rauswerfen.
Also muss ich mir für jeden Block merken, wie lange es her ist, dass
sie benutzt wurden.
Und den, der am längsten nicht benutzt wurde, den werfe ich raus.
Ersetze den Inhalt der Cache-Line durch den neuen Block.
Das ist nur der Nachteil, dass ich alle Tag-Felder nach dem Block
durchsuchen muss.
Es sei denn, ich habe so eine Zugriffslogik da drin, wie bei dem
Assoziativ -Speicher, der das in einem Schritt ermöglicht.
Macht aber natürlich Hardware-Aufwand.
Der Vorteil ist, dass die zu erwartende Anzahl der Cache-Fehler bei
dieser assoziativen Art der Speicherung deutlich reduziert wird.
Wenn ich nach diesem Least-Recently-Used-Muster vorgehe, ist die
empirische Erfahrung, da reduziert sich die Anzahl der Fehler bei so
typischen Standardprogrammen auf etwa 1-5% der Zugriffe.
Das kann man tolerieren.
Gut, das also zu den Cache-Organisationen.
Und ich sehe, meine Zeit ist leider um.
Deswegen muss ich an dieser Stelle im neuen Jahr weitermachen.
Und jetzt wollte ich eigentlich noch etwas...
Das war gar nicht so einfach mit dem Tablett-PC, wenn man noch nicht
so ganz damit sich auskennt.
Jetzt wollte ich Ihnen noch eine Folie zeigen als Abschluss.
Das ist diese hier.
Ich wollte Ihnen frohe Weihnachten und ein gutes neues Jahr wünschen.
Ich hoffe, Sie alle gesund und munter wiederzusehen.
Am 13.
Januar geht es weiter.
Also in der ersten Woche ist der Montag der 6.
Da fällt die Vorlesung sowieso aus.
Der eigentlich nächste Termin wäre ja nächsten Montag.
Der 23.
Eigentlich hätte ich Sie am 23.
wieder beglücken können mit einer Vorlesung.
Aber da wir ja immer die Mittwochstermine bei unserer Vorlesung schon
vorgezogen haben, haben wir gesagt, dann lassen wir denen einen
Montagstermin ausfallen.
Den Mittwochstermin in der ersten Woche lassen wir auch ausfallen.
Wir haben ja schon die ganzen Mittwochstermine in der ersten Hälfte
des Semesters gemacht.
Einen Mittwochstermin möchte ich doch noch nachholen.
Da ist auch mal einer ausgefallen.
Durch technische Probleme.
Den hole ich am 15.
Januar nach.
Und das heißt, wir sehen uns hier wieder am 13.
Januar.
Also nochmal frohe Weihnachten und ein gutes neues Jahr.