WEBVTT

00:00.000 --> 00:04.800
Guten Morgen, ich begrüße Sie zur Fortsetzung der Vorlesung Grundlagen

00:04.800 --> 00:05.780
der Informatik II.

00:06.320 --> 00:10.380
Ich glaube, es muss ein bisschen lauter, dann ist es, glaube ich,

00:10.400 --> 00:11.100
gleich gut.

00:14.980 --> 00:18.980
Letztes Mal haben wir uns beschäftigt mit Codierung und

00:18.980 --> 00:19.960
Zahlendarstellungen.

00:20.560 --> 00:25.160
Leider war letztes Mal bei mir ein Fehler unterlaufen bei der

00:25.160 --> 00:30.300
Einstellung des Aufnahmewerkzeuges und da hatte ich vergessen, dass

00:30.300 --> 00:35.680
die Default-Einstellung immer ein Format ist, das die

00:35.680 --> 00:38.840
Aufzeichnungssoftware selber anschließend nicht lesen kann.

00:39.380 --> 00:43.640
Deswegen musste dann aus früheren Vorlesungen ein Zusammenschnitt

00:43.640 --> 00:46.220
erstellt werden, der genau das abdeckt, was ich letztes Mal erzählt

00:46.220 --> 00:46.600
habe.

00:47.820 --> 00:50.980
Aber ich denke, das haben meine Mitarbeiter hingekriegt oder kriegen

00:50.980 --> 00:51.440
es noch hin.

00:52.040 --> 00:53.300
Heute ist alles in Ordnung.

00:53.440 --> 00:56.760
Ich habe einen neuen Rechner, auch eine neue Aufzeichnungssoftware,

00:56.760 --> 00:59.360
eine neue Version, bei der das anscheinend besser funktioniert.

01:00.500 --> 01:02.260
Und was haben wir letztes Mal gemacht?

01:03.140 --> 01:05.640
Wir haben uns beschäftigt mit Codierung und Zahlendarstellung.

01:05.740 --> 01:08.620
Ich hoffe, dass Sie sich alle angemeldet haben für die Bonusklausur.

01:09.160 --> 01:10.920
Da werde ich auch am Mittwoch noch einmal darauf hinweisen.

01:11.620 --> 01:15.020
Die Anmeldefrist ist der 8.1., das wissen Sie.

01:15.400 --> 01:19.000
Ich schreibe das einfach noch einmal kurz hier rauf.

01:23.220 --> 01:40.820
Einfügen, Textfeld, also Anmeldung, Bonusklausur bis 8.1.2017.

01:43.360 --> 01:45.220
So, das können wir noch ein bisschen größer machen.

01:52.760 --> 01:54.660
Dann sehen Sie das hoffentlich wirklich.

01:55.800 --> 01:59.040
Also, bitte denken Sie daran, dass Sie sich anmelden.

01:59.280 --> 02:01.700
So, letztes Mal haben wir uns noch einmal mit Codierung und

02:01.700 --> 02:02.800
Zahlendarstellung beschäftigt.

02:02.940 --> 02:03.760
Da steht es auch noch einmal.

02:03.880 --> 02:06.200
Sehen Sie, auf der Folie steht sogar alles noch einmal.

02:08.420 --> 02:11.000
Das waren einige Themen, die wir hier besprochen haben.

02:11.000 --> 02:12.760
Wir sind das ja ganz durchgekommen.

02:13.160 --> 02:17.200
Wir hatten ja, nachdem wir uns mit Codes, Codierungen, Klassen von

02:17.200 --> 02:20.520
Codierungen beschäftigt hatten, hatten wir gesehen, Fano-Bedingungen

02:20.520 --> 02:23.260
sind wichtig für die eindeutige Dekodierbarkeit.

02:23.380 --> 02:26.300
Wir hatten Fehlerkennung und Korrektur angeschaut, hatte ich Ihnen

02:26.300 --> 02:26.980
vorgestellt.

02:27.100 --> 02:30.860
Wir hatten dann angeschaut einen redundanzfreien Code.

02:31.000 --> 02:34.540
Nämlich, wir hatten überlegt, wie man redundanzfrei codieren kann,

02:34.660 --> 02:38.740
wenn man etwas weiß über die Häufigkeiten des Vorkommens von Zeichen.

02:38.740 --> 02:42.900
Das Maß für die Redundanz hatten wir die Codelänge genommen.

02:44.120 --> 02:45.760
Ich hatte dann Beispiele genannt.

02:46.500 --> 02:48.960
Beispiel für deutsche und englische Sprache.

02:49.160 --> 02:52.460
Oder man nimmt einfach einen Text und hat irgendeine

02:52.460 --> 02:56.500
Wahrscheinlichkeitsverteilung und kommt dann eben zu einer Verteilung

02:56.500 --> 02:57.740
der Zeichen.

02:58.340 --> 03:01.860
In diesem Fall hier die zehn Ziffern mit gewissen

03:01.860 --> 03:02.680
Wahrscheinlichkeiten.

03:02.820 --> 03:06.060
Und dann kommen wir zu einer Codierung dieser zehn Ziffern

03:06.060 --> 03:07.400
entsprechend den Häufigkeiten.

03:07.400 --> 03:14.900
Und hier sind dann halt einige Ziffern in diesem Beispiel mit zwei

03:14.900 --> 03:15.800
Bits codiert.

03:16.020 --> 03:19.300
Andere mit fünf Bits, wie die neun zum Beispiel.

03:19.920 --> 03:22.860
Abhängig halt von der Häufigkeitsverteilung, die da angenommen wurde.

03:23.360 --> 03:26.460
Und dann hatten wir uns mit Zeichen und Ziffern beschäftigt.

03:26.520 --> 03:29.680
Wir hatten den ASCII-Code angeschaut, den EPSILIC-Code.

03:30.260 --> 03:35.620
Unicode hatten Zifferndarstellung betrachtet und kamen dann zur

03:35.620 --> 03:36.600
Zahlendarstellung.

03:36.600 --> 03:41.960
Da gab es natürlich die Frage, inwieweit die Operationen auf der

03:41.960 --> 03:47.440
Darstellung genau dementsprechend, was wir außerhalb des Rechners

03:47.440 --> 03:47.740
machen.

03:48.440 --> 03:51.340
Und das ist halt ein ganz wichtiger Punkt, auf den wir auch noch dann

03:51.340 --> 03:52.340
wieder zurückgekommen sind.

03:52.680 --> 03:54.680
Natürlich, Zahlen waren nicht das große Problem.

03:54.840 --> 03:57.300
Ganze Zahlen, muss man sehen, wie man die negativen darstellt.

03:57.840 --> 03:59.220
Mit drei verschiedenen Möglichkeiten.

03:59.220 --> 04:02.340
Ich hatte Ihnen die Zwei-Komplement-Darstellung dann vorgestellt.

04:02.780 --> 04:06.100
Mit den ganzen Eigenschaften, also Komplement zu 2 hoch N.

04:06.600 --> 04:10.640
Dann hatten wir gesehen, nachdem wir hier die Arithmetik durchgegangen

04:10.640 --> 04:15.640
sind, die Eins-Komplement-Darstellung, wo man auf 2 hoch N minus 1 das

04:15.640 --> 04:16.620
Komplement bildet.

04:17.000 --> 04:19.240
Mit leicht anderen Eigenschaften.

04:19.320 --> 04:22.600
Also hier Komplementbildung nur durch Kippen der Bits, ohne dass man

04:22.600 --> 04:23.540
eine Eins addieren muss.

04:23.980 --> 04:26.160
Wenn wir beim Zwei-Komplement eine Eins addieren mussten.

04:26.160 --> 04:30.620
Dafür dann bei der Addition, das kam dann hier nach.

04:30.740 --> 04:37.340
Bei der Addition ist es so, dass wir hier eben den Überlauf addieren

04:37.340 --> 04:37.780
müssen.

04:39.600 --> 04:43.100
Und dadurch, wenn der Überlauf 1 ist, halt noch eine Eins addieren.

04:44.120 --> 04:46.940
Wenn der Überlauf 0 ist, ist es halt ein 0, das ist dann kein Problem.

04:47.840 --> 04:52.660
Also Addition bei der Eins-Komplement-Darstellung mit dem Überlauf,

04:52.800 --> 04:53.420
der addiert wird.

04:53.420 --> 04:57.900
Während beim Zwei-Komplement wurde der Überlauf einfach ignoriert.

04:58.760 --> 05:00.840
Und dann kamen wir zu den reellen Zahlen.

05:00.960 --> 05:03.680
Ich habe Ihnen dargestellt zunächst mal die normierten

05:03.680 --> 05:04.680
Gleitpunktzahlen.

05:04.740 --> 05:07.880
Wir haben dann die Arithmetik betrachtet und gesehen, dass die

05:07.880 --> 05:13.120
Addition von Gleitpunktzahlen eine etwas aufwendigere Operation ist,

05:13.160 --> 05:16.360
weil wir erst die Exponenten vergleichen müssen, dann angleichen,

05:16.840 --> 05:21.020
Mantissen entsprechend addieren und dann noch normieren müssen, wenn

05:21.020 --> 05:25.640
die Summe der Mantissen aus dem normierten Bereich herausfällt.

05:26.620 --> 05:31.280
Und das ist so zunächst mal bei den allgemein normierten

05:31.280 --> 05:32.800
Gleitpunktzahlen alles kein Problem.

05:33.340 --> 05:36.800
Wird aber ein Problem, wenn wir uns mit einer endlich langen

05:36.800 --> 05:38.740
Darstellung der Zahlen beschäftigen müssen.

05:39.460 --> 05:43.840
Wir hatten dann die Dualdarstellung betrachtet, also mit N Bits eine

05:43.840 --> 05:49.600
normierte Gleitpunktzahl darzustellen und hatten dann Beispiele

05:49.600 --> 05:55.120
gesehen, bei denen wir 8 Bits haben zur Verfügung, von denen 4 Bits

05:55.120 --> 06:01.240
für die Mantisse sind, 3 Bits für die Charakteristik und 1 Bit fürs

06:01.240 --> 06:01.820
Vorzeichen.

06:01.920 --> 06:07.620
Charakteristik war ja der verschobene Exponent, sodass der kleinste

06:07.620 --> 06:13.380
Exponent gerade auf die Null abgebildet wird und entsprechend alles

06:13.380 --> 06:20.580
verschoben ist, um eben diesen Betrag halbe Zahlenumfang des

06:20.580 --> 06:21.320
Exponenten.

06:21.600 --> 06:25.000
Das war ein Beispiel, hatten wir uns angeschaut und dann kam die

06:25.000 --> 06:29.060
Gleitpunktdarstellung nach dem Standard mit der einfachen doppelten,

06:29.180 --> 06:32.740
vierfachen Genauigkeit und dann noch die denormalisierten Zahlen,

06:32.740 --> 06:37.540
Darstellung der Null, Darstellung unendlich, Not a Number und Angaben

06:37.540 --> 06:42.200
zu den jeweiligen Umfängen der Zahlen, wobei es eben klar ist, dass

06:42.200 --> 06:49.660
mit einer Steigerung mit größeren Exponenten dann natürlich auch immer

06:49.660 --> 06:56.280
größere Abstände zwischen den darstellbaren Zahlen auftauchen, sodass

06:56.280 --> 06:59.060
wir also immer größere Fehler bekommen in der Zahlendarstellung.

06:59.060 --> 07:05.640
Wir hatten dann gesehen, dass wir bei der Arithmetik aufpassen müssen,

07:06.100 --> 07:11.160
insbesondere gilt eben bei Gleitpunktzahlen nicht mehr die

07:11.160 --> 07:16.280
Assoziativität der Addition, eine ganz wichtige Eigenschaft.

07:16.440 --> 07:20.480
Es kommt hier auf die Reihenfolge der Operationen an und das müssen

07:20.480 --> 07:24.460
Sie sich als ein ganz wichtiges Erkenntnis merken, das müssen Sie

07:24.460 --> 07:27.840
mitnehmen aus dieser Vorlesung, das Rechnen mit Gleitpunktzahlen ist

07:27.840 --> 07:32.100
ein Rechnen mit ungenauen dargestellten Zahlen und das heißt, jedes

07:32.100 --> 07:36.440
Ergebnis aus einer Rechnung, in der Gleitpunktzahlen auftauchen, ist

07:36.440 --> 07:37.860
ein ungenaues Ergebnis.

07:38.660 --> 07:43.920
Es sei denn, Sie rechnen mit Intervallarithmetik, dann können Sie

07:43.920 --> 07:48.020
genaue Aussagen machen zur Ungenauigkeit, aber Sie haben immer

07:48.020 --> 07:52.480
ungenaue Ergebnisse, Sie haben niemals genaue Ergebnisse, wenn Sie mit

07:52.480 --> 07:53.820
Gleitpunktzahlen rechnen.

07:54.140 --> 07:57.460
Und wenn Sie nicht aufpassen, können die Abweichungen vom richtigen

07:57.460 --> 08:01.420
Ergebnis gravierend sein, wie man das eben bei diesem Beispiel gesehen

08:01.420 --> 08:01.660
hat.

08:01.660 --> 08:07.920
Je nachdem, ob Sie eben hier die ersten beiden Summanden erst addieren

08:07.920 --> 08:13.780
oder erst den zweiten und dritten, bekommen Sie einmal den Wert 0 und

08:13.780 --> 08:19.560
das andere Mal den richtigen Wert 10 hoch 14 und das ist sicherlich

08:19.560 --> 08:20.560
ein großer Unterschied.

08:21.620 --> 08:25.960
Das handelt sich hier nicht um kleine Fehler, irgendwie ein paar

08:25.960 --> 08:29.800
Stellen hinter dem Komma, natürlich sind das immer ein paar Stellen

08:29.800 --> 08:32.800
hinter dem Komma, aber da wir große Exponenten haben können, können

08:32.800 --> 08:34.500
die Fehler auch sehr groß sein.

08:35.260 --> 08:37.860
Und wenn es also um statistische Berechnungen geht, um

08:37.860 --> 08:41.740
ingenieurwissenschaftliche Berechnungen, bei denen man irgendwelche

08:41.740 --> 08:45.580
genauen Ergebnisse haben muss bezüglich der Dimensionierung von

08:45.580 --> 08:50.720
irgendwelchen Bauteilen, dann muss man genau wissen, wie ist der

08:50.720 --> 08:52.040
Fehler bei diesen Berechnungen.

08:52.040 --> 08:55.540
Das ist wirklich eine wichtige Erkenntnis, die Sie hier gewinnen

08:55.540 --> 08:59.740
sollen und mitnehmen sollen, dass man bei Gleitpunktzahlen aufpassen

08:59.740 --> 09:00.020
muss.

09:00.440 --> 09:03.420
Dann kam noch, gut das war nochmal die Sonderrolle der 0, auch das

09:03.420 --> 09:06.820
wichtig, dass man eben wegen dieser Ungenauigkeit niemals auf

09:06.820 --> 09:10.020
Gleichheit testen kann bei reellen Zahlen oder niemals testen sollte.

09:10.060 --> 09:12.980
Man kann natürlich testen, kriegt aber nicht das gewünschte Ergebnis,

09:13.600 --> 09:20.040
sondern man sollte immer auf möglichst kleine Abweichung von 0 testen.

09:20.040 --> 09:24.620
Das heißt, man nimmt die Differenz von zwei Zahlen und testet, wie nah

09:24.620 --> 09:29.060
die an 0 ist und kann darüber dann eine Abschätzung machen, wie genau

09:29.060 --> 09:31.540
man denn nun eigentlich die beiden angeglichen hat.

09:32.220 --> 09:35.460
Also da geht man einfach unter den darstellbaren Fehler und hat dann

09:35.460 --> 09:36.680
das, was man wollt.

09:38.400 --> 09:42.680
Dann kam dieser kurze Hinweis auf die Kodierung zur Geheimhaltung, wo

09:42.680 --> 09:46.980
ich eben wie gesagt die nicht im Einzelnen Ihnen vorstelle, sondern

09:46.980 --> 09:50.940
hier nur Folien beigefügt habe, die Sie sich durchschauen können.

09:51.280 --> 09:55.320
Wenn Sie dazu genauere Informationen haben wollen, müssen Sie in

09:55.320 --> 10:01.840
andere Vorlesungen gehen, zum Beispiel in die Vorlesung Algorithms for

10:01.840 --> 10:05.860
Internet Applications, die ja in diesem Semester auch läuft,

10:06.100 --> 10:08.180
allerdings in der Zukunft nicht mehr.

10:08.840 --> 10:12.780
Also insofern müssen Sie sich dann andere Vorlesungen suchen, in denen

10:12.780 --> 10:14.940
das dann präsentiert wird.

10:14.940 --> 10:22.940
Nicht mehr deswegen, weil bei mir das Ende meiner aktiven Dienstzeit

10:22.940 --> 10:26.420
nähert und ich deswegen im nächsten Wintersemester keine Vorlesung

10:26.420 --> 10:26.920
mehr halte.

10:28.060 --> 10:36.260
Also, damit waren wir durch Kapitel 7 durch und kommen dann...

10:36.940 --> 10:38.720
Oh, das brauche ich nicht zu speichern.

10:38.720 --> 10:43.300
Okay, kommen wir damit zu dem nächsten Kapitel, Rechner, Architektur

10:43.300 --> 10:43.940
und Organisation.

10:45.280 --> 10:51.020
Und da wollen wir anfangen mit der ersten Folie, also Rechner,

10:51.120 --> 10:51.980
Architektur und Organisation.

10:52.780 --> 10:58.800
Wir haben uns jetzt beschäftigt, also in diesem Teil, mit

10:58.800 --> 11:00.780
Schaltnetzen, Schaltwerken.

11:00.900 --> 11:04.220
Wir wissen, wie wir Hardware erzeugen können, wie wir das entwerfen

11:04.220 --> 11:04.560
können.

11:04.560 --> 11:08.400
Wir wissen, wie wir Informationen darstellen können, wir wissen, wie

11:08.400 --> 11:10.740
wir Rechnerarithmetik machen können.

11:11.400 --> 11:14.640
Und jetzt kommen wir zur Architektur, wie wir eigentlich einen solchen

11:14.640 --> 11:15.600
Rechner aufbauen.

11:16.060 --> 11:20.020
Und es ist so, dass wir heute immer noch eine Architektur verwenden,

11:20.260 --> 11:27.080
im Prinzip, die Mitte des vorigen Jahrhunderts entwickelt wurde, von

11:27.080 --> 11:31.180
Burks, Goldstein und von Neumann, veröffentlicht 1946.

11:31.800 --> 11:35.580
Das ist das Prinzip eines Universalrechners.

11:35.740 --> 11:43.040
Es gab davor schon den ersten programmgesteuerten Rechner von Konrad

11:43.040 --> 11:43.360
Zuse.

11:44.180 --> 11:50.280
Und der hat nur eine Sache anders gehabt, der hatte getrennte Speicher

11:50.280 --> 11:51.640
für Programm und Daten.

11:52.280 --> 11:54.980
Das ist bei diesem von Neumann-Konzept nicht der Fall.

11:54.980 --> 11:58.980
Das ist die klassische Architektur für Rechenanlagen.

11:59.920 --> 12:02.060
Und damit müssen wir uns jetzt beschäftigen und sehen, wie die

12:02.060 --> 12:03.980
einzelnen Bestandteile zusammenwirken.

12:04.760 --> 12:05.780
Warum müssen wir das?

12:06.200 --> 12:10.380
Weil ich gerne möchte, dass Sie in der Lage sind zu beurteilen, welche

12:10.380 --> 12:14.080
Eigenschaften eigentlich wichtig sind, wenn Sie sich einen Rechner

12:14.080 --> 12:14.660
aussuchen.

12:15.220 --> 12:19.020
Für Ihren privaten Gebrauch oder für Ihre Firma oder für Beweis, wo

12:19.020 --> 12:20.380
der eingesetzt werden muss.

12:20.380 --> 12:25.100
Dann sollten Sie wissen, welche Parameter eigentlich die

12:25.100 --> 12:28.880
Leistungsfähigkeit eines Rechners beeinflussen.

12:29.380 --> 12:34.120
Zum Beispiel Cache und Prozessortakt und all so verschiedene Dinge,

12:34.200 --> 12:36.480
die werden Sie noch genauer kennenlernen.

12:36.960 --> 12:39.260
Und das sind halt jetzt einige Teile, die wir uns hier anschauen

12:39.260 --> 12:39.500
müssen.

12:39.660 --> 12:41.200
Wir haben eine Reihe Bestandteile.

12:41.280 --> 12:44.920
Wir haben ein Speicher, das Speicherwerk, da sind Programme und Daten

12:44.920 --> 12:45.180
drin.

12:45.180 --> 12:55.160
Wir haben ein Rechenwerk, da muss ich erstmal den Stift einschalten.

13:03.040 --> 13:07.900
Also Rechenwerk, da in der Mitte, da wird gerechnet.

13:07.900 --> 13:13.540
Da sind die Rechner-Arithmetikeinheiten, in der Regel keine Bit

13:13.540 --> 13:16.460
-seriellen Modifiziere, sondern Bit-parallele Modifiziere und

13:16.460 --> 13:17.680
Gleichpunkteinheiten usw.

13:18.700 --> 13:24.220
Dann haben wir das Leitwerk oder auch Steuerwerk, im Englischen häufig

13:24.220 --> 13:28.320
Control Unit genannt und manchmal fälschlicherweise als

13:28.320 --> 13:29.960
Kontrolleinheit bezeichnet.

13:30.480 --> 13:35.580
Aber Control heißt auf Deutsch Steuern oder Leitwerk oder Steuerwerk.

13:35.580 --> 13:40.540
Also da wird bestimmt, wie Programme ausgeführt werden.

13:41.020 --> 13:44.180
Wie wir tatsächlich Operationen durchführen können, auch das müssen

13:44.180 --> 13:48.380
Sie verstehen, damit Sie wissen, was passiert, wenn ein Programm im

13:48.380 --> 13:49.480
Rechner ausgeführt wird.

13:50.500 --> 13:54.180
Und schließlich wollen wir auch Dinge in den Rechner hineingeben

13:54.180 --> 13:57.420
können und etwas ausgeben können aus dem Rechner heraus.

13:57.560 --> 14:00.480
Auch das muss möglich sein, ansonsten wäre das ein schwarzer Kasten,

14:00.600 --> 14:03.960
der einfach irgendwas vor sich hin rechnet, das interessiert uns

14:03.960 --> 14:04.200
nicht.

14:04.200 --> 14:06.220
Wir müssen etwas ein- und ausgeben können.

14:06.900 --> 14:08.380
Das schauen wir uns jetzt genauer an.

14:09.560 --> 14:13.560
Also zunächst mal ist das ein Universalrechner, wie die universelle

14:13.560 --> 14:14.380
Turing -Maschine auch.

14:14.440 --> 14:17.040
Wir können ein Programm eingeben, bei der universellen Turing-Maschine

14:17.040 --> 14:20.400
konnten wir eine Turing-Maschinen-Beschreibung aus Eingabeband

14:20.400 --> 14:20.880
schreiben.

14:21.460 --> 14:26.460
Hier schreiben wir ein Programm in den Speicher und dann haben wir

14:26.460 --> 14:28.820
außerdem noch Programme und Daten im selben Speicher.

14:28.820 --> 14:31.820
Das ist natürlich durchaus etwas, was man sich überlegen muss.

14:32.200 --> 14:33.800
Macht das eigentlich Sinn?

14:34.640 --> 14:38.820
Wenn ich ein Programm im Speicher habe und die Daten auch, dann kann

14:38.820 --> 14:43.760
ich mit dem Programm Befehle ausführen, die in der Lage sind, jede

14:43.760 --> 14:46.580
Speicherzelle zu verändern.

14:47.140 --> 14:49.500
Dann kann ja ein Programm auch sich selbst verändern.

14:50.200 --> 14:51.440
Das sieht gefährlich aus.

14:52.020 --> 14:53.900
Kann es sein, kann aber auch sehr sinnvoll sein.

14:53.900 --> 14:57.080
Dass Sie eben während der Ausführung das Programm praktisch erst

14:57.080 --> 15:00.600
erzeugen und dann dieses erzeugte Programm ausführen.

15:01.460 --> 15:05.000
Solche Dinge sind wichtig, dass man das kann und das geht halt in

15:05.000 --> 15:05.540
diesem Fall.

15:06.180 --> 15:10.060
Sie können also sowohl Programme verändern, als auch Daten verändern.

15:10.220 --> 15:16.260
Wird von einigen Personen oder Akteuren ausgenutzt, um Programme so zu

15:16.260 --> 15:17.520
verändern, wie wir das nicht wollen.

15:17.520 --> 15:23.300
Das sind dann die Viren und ähnliche Angriffe auf unsere Rechner, in

15:23.300 --> 15:27.660
denen Programme verändert werden, um irgendwelche externen Zwecke zu

15:27.660 --> 15:28.260
verfolgen.

15:29.020 --> 15:30.880
Dagegen muss man sich dann entsprechend schützen.

15:31.340 --> 15:34.380
Also wenn wir Programme und Daten in unterschiedlichen Speichern

15:34.380 --> 15:36.740
hätten, wäre das nicht so sehr das Problem.

15:36.880 --> 15:40.540
Da könnten die Programme nicht verändert werden durch irgendein

15:40.540 --> 15:43.720
Programm, das im Rechner ausgeführt wird.

15:44.440 --> 15:46.760
Aber das ist das, was wir uns einkaufen damit.

15:46.760 --> 15:50.240
Okay, wir haben die Speicherzellen, die werden adressiert.

15:50.720 --> 15:55.060
Wir haben also hier einen großen Speicher und da haben wir alle

15:55.060 --> 15:56.220
möglichen Zellen drin.

15:56.760 --> 15:59.760
Und wir können jeweils auf die einzelnen zugreifen.

16:00.720 --> 16:03.080
Da können es sein, dass wir hier irgendwas 4 haben, da unten 17.

16:04.360 --> 16:07.640
Adressen, unterschiedliche Adressen, sodass wir auf die Zellen eines

16:07.640 --> 16:08.840
Speichers zugreifen können.

16:09.120 --> 16:10.640
Natürlich hat er mehr als 17 Zellen.

16:11.460 --> 16:16.740
Aber wichtig ist, dass wir mit Adressen auf Speicherzellen zugreifen

16:16.740 --> 16:17.160
können.

16:17.680 --> 16:19.160
Anders als die Turing-Maschine.

16:19.560 --> 16:24.280
Die Turing-Maschine konnte nur sequenziell durch das Band laufen und

16:24.280 --> 16:25.740
lesen, was auf dem Band steht.

16:26.740 --> 16:31.520
Der von Neumann-Rechner kann auf jede Zelle des Speichers direkt

16:31.520 --> 16:32.220
zugreifen.

16:34.160 --> 16:37.800
Normalerweise sind die aufeinanderfolgenden Befehle in einem Programm

16:37.800 --> 16:41.700
in aufeinanderfolgenden Zellen eines Speichers.

16:42.200 --> 16:46.640
Das heißt, ich brauche die Befehlsadresse, also die Adresse, den

16:46.640 --> 16:51.420
Pointer auf den aktuell auszuführenden Befehl, nur um eins zu erhöhen,

16:51.480 --> 16:52.780
um den nächsten Befehl zu haben.

16:53.400 --> 16:57.160
Es sei denn, ich möchte gerne im Programm hin und her springen.

16:57.260 --> 17:00.480
Es kann ja sein, dass ich von hier wieder da vorne hin zurückspringen

17:00.480 --> 17:00.820
möchte.

17:00.820 --> 17:03.740
Dafür muss ich ein Sprungbefehl haben können.

17:04.240 --> 17:07.360
Und dann brauche ich noch unbedingte Sprungbefehle und bedingte

17:07.360 --> 17:11.060
Sprungbefehle, die nur unter einer gewissen Bedingung einen Sprung

17:11.060 --> 17:11.620
erlauben.

17:12.000 --> 17:16.380
Zum Beispiel, wenn ein gewisser Test den Wert wahr hat, dann gehen wir

17:16.380 --> 17:19.960
hier zu diesem Label, zu der Marke im Programm und können dann

17:19.960 --> 17:21.920
entsprechend dort weitermachen.

17:22.060 --> 17:25.320
Wir brauchen also Sprünge, um im Programm verzweigen zu können an

17:25.320 --> 17:26.220
andere Orte.

17:26.220 --> 17:29.180
Das werden wir alles noch genauer kennenlernen, wenn wir uns mit

17:29.180 --> 17:31.420
Maschinensprachen und December-Sprachen beschäftigen.

17:31.780 --> 17:33.360
Das kommt dann auch noch ein bisschen später.

17:34.740 --> 17:37.880
Programm und Daten sind natürlich im Rechner binär kodiert, wie auch

17:37.880 --> 17:38.260
sonst.

17:38.400 --> 17:40.740
Alles, was wir machen im Rechner, ist binär kodiert.

17:41.240 --> 17:45.000
Das heißt, wenn wir uns ein Programm anschauen, so wie der Rechner es

17:45.000 --> 17:47.440
ausführen muss, ist das eine Folge von Nullen und Einzen.

17:47.960 --> 17:53.620
In der Regel schauen Sie ein Programm an, schön in der problemnahen

17:53.620 --> 17:54.460
Art formuliert.

17:55.200 --> 17:57.720
Das können Sie alles lesen, da brauchen Sie sich mit den Nullen und

17:57.720 --> 17:58.740
Einzen nicht zu beschäftigen.

17:59.300 --> 18:03.840
Aber das, was ausgeführt wird, ist nicht das schöne Java- oder C++

18:03.840 --> 18:07.480
-Programm, das Sie lesen, sondern das ist ein Maschinenprogramm im

18:07.480 --> 18:07.820
Rechner.

18:07.900 --> 18:11.640
Und Sie hoffen, dass das Maschinenprogramm im Rechner genau dem

18:11.640 --> 18:15.480
entspricht, was Sie in Java oder C++ oder in was weiß was für einer

18:15.480 --> 18:17.080
Sprache programmiert haben.

18:18.020 --> 18:19.740
Das muss halt entsprechend umgesetzt werden.

18:19.880 --> 18:22.720
Und Sie vertrauen darauf, dass diese Umsetzung korrekt ist.

18:23.180 --> 18:25.620
Es ist in der Regel nicht bewiesen, dass es korrekt ist.

18:25.680 --> 18:31.740
Es gibt wenige verifizierte Compiler-Übersetzer, die genau nachweisen,

18:31.860 --> 18:32.680
dass sie richtig sind.

18:33.800 --> 18:38.700
Dieses Prinzip ist heute immer noch gültig, auch wenn die Rechner sich

18:38.700 --> 18:39.880
sehr weiterentwickelt haben.

18:39.880 --> 18:43.300
Im Prinzip tauchen genau diese Einheiten auf.

18:43.400 --> 18:46.200
Die Struktur sieht nicht genau so aus, wie ich das gerade eben gezeigt

18:46.200 --> 18:46.620
habe.

18:47.200 --> 18:48.900
Aber im Prinzip sind das diese Einheiten.

18:49.000 --> 18:51.520
Wir haben einen Arbeitsspeicher, wir haben ein Rechenwerk und eine

18:51.520 --> 18:55.620
Steuereinheit, die beide zusammengefasst werden zur zentralen

18:55.620 --> 18:58.880
Recheneinheit oder Central Processing Unit, CPU.

19:00.020 --> 19:03.460
Der Speicher ist extra von der CPU.

19:04.040 --> 19:07.800
Dann haben wir eine Ein-Ausgabe-Einheit, irgendwas, Keyboard oder

19:07.800 --> 19:08.060
sowas.

19:08.060 --> 19:09.780
Wir haben interne Datenwege.

19:10.440 --> 19:13.400
Das waren gerade eben irgendwelche Verbindungen zwischen diesen

19:13.400 --> 19:14.380
einzelnen Werken.

19:14.920 --> 19:19.280
Das sind in der Regel irgendwelche Busse, Datenwege, die die

19:19.280 --> 19:22.120
Informationen austauschen können zwischen den Funktionseinheiten.

19:22.540 --> 19:25.040
Und hier sehen Sie, das sieht also etwas anders aus.

19:25.120 --> 19:28.720
Da haben Sie einen solchen Bus, Datenbus, Adressbus, Steuerbus oder

19:28.720 --> 19:29.380
Kontrollbus.

19:30.040 --> 19:33.420
Und Sie haben die einzelnen Einheiten, die angesprochen werden können

19:33.420 --> 19:37.630
über Daten, die Sie über den Bus schicken, mit gewissen Adressen

19:37.630 --> 19:38.150
versehen.

19:38.290 --> 19:42.150
Dann werden die entsprechend, wenn das Steuerwerk hier irgendetwas

19:42.150 --> 19:45.430
braucht aus dem Speicher, wird dann etwas hier raufgeschrieben auf den

19:45.430 --> 19:46.090
ganzen Bus.

19:46.570 --> 19:49.250
Der Speicher merkt, dass er angesprochen ist, schickt wieder etwas

19:49.250 --> 19:51.050
zurück und das geht zum Steuerwerk zurück.

19:52.590 --> 19:54.990
Und in der Regel haben wir nicht nur ein Rechen- oder Steuerwerk,

19:55.070 --> 19:55.770
sondern mehrere.

19:56.450 --> 19:59.870
Wenn Sie in Ihre normalen Smartphones schauen, da haben Sie in der

19:59.870 --> 20:01.750
Regel acht Steuerwerke drin mittlerweile.

20:01.750 --> 20:07.630
Also hochparallele Rechner und nicht nur ein einziges Steuerwerk.

20:07.710 --> 20:11.390
Aber im Prinzip ist es immer noch ein von Neumann Rechner.

20:12.290 --> 20:14.570
Und die Kommunikation, wie gesagt, über den zentralen Bus.

20:15.370 --> 20:17.830
Und das ist das, was ich hier angedeutet habe.

20:18.630 --> 20:24.290
Das Funktionsprinzip ist, dass Sie eine Folge von Zustandsänderungen

20:24.290 --> 20:24.530
machen.

20:24.530 --> 20:30.910
Der Zustand eines Rechners ist der Inhalt aller Register, aller

20:30.910 --> 20:32.650
Speicher in diesem Rechner.

20:32.910 --> 20:35.650
Dadurch wird bestimmt, was der Rechner als nächstes tut.

20:36.310 --> 20:37.330
Und damit ist das der Zustand.

20:37.430 --> 20:40.710
Und durch die Ausführung eines Befehls ändert sich der Zustand eines

20:40.710 --> 20:41.170
Rechners.

20:41.870 --> 20:44.930
Das heißt, das ist eine lange Folge von solchen Zustandsänderungen.

20:45.510 --> 20:46.770
Und das werden wir genauer anschauen.

20:47.270 --> 20:49.090
Wir fangen nochmal an mit dem Arbeitsspeicher.

20:49.970 --> 20:53.070
Also hier, das ist das Speicherwerk.

20:54.110 --> 20:57.070
Hier nochmal in der klassischen Architektur des von Neumann Rechners

20:57.070 --> 20:57.650
dargestellt.

20:59.070 --> 21:03.150
Der Hauptspeicher, Primärspeicher oder eben einfach Speicher.

21:03.630 --> 21:11.410
Wir haben viele Speicherelemente, die durchnummeriert sind.

21:12.470 --> 21:14.950
Jedes Speicherelement hat eine Adresse.

21:14.950 --> 21:25.970
0 ist häufig eine Adresse im Rechenwerk, ganz nah beim Steuerwerk,

21:26.630 --> 21:28.670
also direkt im Rechenwerk ein Register.

21:29.350 --> 21:30.930
Auf jeden Fall sind dort Adressen.

21:31.530 --> 21:33.510
Und die Adressen haben ein bestimmtes Format.

21:35.030 --> 21:37.610
Jedes Speicherelement hat ein festes Format.

21:37.710 --> 21:42.130
Die Speicherelemente haben eine feste Anzahl von Bits.

21:43.470 --> 21:49.270
Üblicherweise sind das 8-Bit oder 16-Bit, 32-Bit oder 64-Bit Rechner.

21:49.750 --> 21:54.630
Wobei wenn wir sagen ein 64-Bit Rechner, dann heißt das, die Adressen

21:54.630 --> 21:58.390
sind auch 64-Bit Zahlen.

21:58.530 --> 22:02.630
Und damit haben sie den Umfang der Speicherzellen, die sie adressieren

22:02.630 --> 22:04.310
können, mit einem Wort.

22:05.050 --> 22:09.010
Das heißt ein 64-Bit Rechner hat deutlich mehr adressierbaren Speicher

22:09.010 --> 22:10.870
als ein 32-Bit Rechner.

22:10.870 --> 22:15.810
Weswegen es keinen Sinn macht, zum Beispiel beim 32-Bit Rechner 8

22:15.810 --> 22:17.350
Gigabyte Speicher einzubauen.

22:17.650 --> 22:19.010
Der wird sowieso nicht adressiert.

22:19.430 --> 22:21.310
Der kann nur 4 Gigabyte adressieren.

22:22.270 --> 22:24.930
Und insofern, solche Dinge muss man einfach wissen.

22:25.750 --> 22:31.770
Also, Byte, 8-Bit, Wort, in der Regel 32-Bit.

22:32.570 --> 22:37.830
Also ist ein Synonym für Speicherelement.

22:38.810 --> 22:42.150
Und sie haben halt 2, 4 oder 8 aufeinanderfolgende Bytes.

22:43.090 --> 22:47.310
Also die klassische Bezeichnung ist, dass wir 4 Bytes haben, also 32

22:47.310 --> 22:47.870
-Bit.

22:48.170 --> 22:51.130
Also eine Wortbreite, deswegen ja auch bei der Gleitpunktdarstellung.

22:51.690 --> 22:56.570
Einfach lang hieß 32-Bit-Darstellung, doppelt lang hieß 64-Bit

22:56.570 --> 22:56.970
-Darstellung.

22:57.950 --> 22:59.930
Also mit 8, das ist ein Doppelwort.

23:01.210 --> 23:05.930
Und wenn Sie Prozessrechner anschauen, kleine eingebettete Systeme.

23:07.370 --> 23:10.450
Die meisten Rechner, die wir auf der Welt haben, sind irgendwelche

23:10.450 --> 23:11.030
kleinen Prozessrechner.

23:11.990 --> 23:14.290
Das sind häufig 8-Bit oder 16-Bit-Rechner.

23:14.970 --> 23:18.510
Also mit deutlich kleineren Speicherumfang, weil die auch nicht so

23:18.510 --> 23:19.350
sehr viel tun müssen.

23:20.190 --> 23:22.950
Und die können dann halt sehr effizient, sehr preiswert hergestellt

23:22.950 --> 23:23.270
werden.

23:26.770 --> 23:31.390
Die Nummer des Speicherelements ist die Adresse.

23:32.410 --> 23:35.510
Die Speicherelemente sind die kleinsten adressierbaren Einheiten.

23:35.730 --> 23:38.490
Allerdings, wenn Sie hier also so eine Adresse A haben und das ist

23:38.490 --> 23:42.550
hier Ihr Speicherwort, manchmal ist man tatsächlich in der Lage, auch

23:42.550 --> 23:47.190
noch auf einzelne Teile zu adressieren innerhalb eines Wortes.

23:48.010 --> 23:52.010
Normalerweise reden wir davon, dass die kleinste adressierbare Einheit

23:52.010 --> 23:53.930
eben dann ein Wort ist.

23:54.870 --> 24:00.370
Jetzt gibt es die Notwendigkeit, mehr Adressen zur Verfügung zu haben,

24:00.650 --> 24:02.190
als Ihr Hauptspeicher bereitstellt.

24:03.430 --> 24:06.570
Dafür haben wir in der Regel virtuelle Adressen.

24:06.730 --> 24:07.890
Warum braucht man das?

24:08.270 --> 24:12.650
Sie haben hier Ihren Rechner und dann brauchen Sie eventuell noch eine

24:12.650 --> 24:17.070
Festplatte oder irgendeinen externen Speicher, vielleicht irgendeine

24:17.070 --> 24:20.190
SSD oder vielleicht auch irgendein Band.

24:21.390 --> 24:24.730
Das heißt, Sie haben weitere Speicherelemente im Hintergrund,

24:24.870 --> 24:30.590
insbesondere eine Festplatte oder eben ein Solid-State-Disk.

24:31.530 --> 24:39.970
Also sekundäre Speichereinheiten und deren Dateninhalte sollen ja auch

24:39.970 --> 24:42.530
mit durch ein Programm adressierbar sein.

24:42.530 --> 24:47.390
Und deswegen haben wir dafür einen virtuellen Adressraum.

24:47.530 --> 24:52.790
Da kommen wir später noch drauf, wie man dann mit den virtuellen

24:52.790 --> 24:56.610
Adressen umgeht und dafür sorgt, dass eine Informationseinheit, die

24:56.610 --> 25:00.810
hier irgendwo abgelegt ist, dass die im Hauptspeicher dann auch

25:00.810 --> 25:05.190
richtig zur Verfügung gestellt werden kann, damit die CPU auf das

25:05.190 --> 25:06.490
Datum zugreifen kann.

25:07.150 --> 25:12.530
Sie werden sehen, warum das wichtig ist, weil nämlich die Zeiten, um

25:12.530 --> 25:17.250
auf einen Speicher zuzugreifen, also den Hauptspeicher oder auf eine

25:17.250 --> 25:21.210
Festplatte, die liegen um mehrere Größenordnungen auseinander.

25:22.010 --> 25:24.670
Das eine ist im Nanosekundenbereich, das andere ist im

25:24.670 --> 25:25.770
Millisekundenbereich.

25:26.170 --> 25:30.410
Das sind 10 hoch 6 Unterschiede in den Zeiten.

25:31.350 --> 25:34.670
Und das sind einfach Dinge, die man wissen muss, wenn man sich über

25:34.670 --> 25:36.050
Rechnerarchitektur unterhält.

25:36.210 --> 25:37.150
Deswegen erzähle ich Ihnen das.

25:37.970 --> 25:42.330
Dann haben wir natürlich, sagte ich schon, Random Access Memory oder

25:42.330 --> 25:43.670
auch RAM-Speicher.

25:44.210 --> 25:46.190
Wir können also wahlfrei zugreifen.

25:47.090 --> 25:49.490
Wobei, wenn Sie auf ein Band zugreifen, haben Sie natürlich wieder

25:49.490 --> 25:50.450
sequenziellen Zugriff.

25:50.530 --> 25:53.450
Aber wenn wir uns den Hauptspeicher hernehmen, haben wir direkten

25:53.450 --> 25:53.970
Zugriff.

25:53.970 --> 25:59.530
Und wenn wir also hier zum Beispiel die Zahlen 28, 6 oder 33 in

25:59.530 --> 26:05.030
Dualdarstellung im Speicher stehen haben, an den Adressen hier 513 bis

26:05.030 --> 26:09.570
515, dann sieht das etwa so aus, wie hier angegeben, wenn Sie davon

26:09.570 --> 26:12.150
ausgehen, dass wir 16-Bit-Rechner hätten.

26:12.590 --> 26:15.850
Dann hätten wir 16-Bit jeweils und wir hätten hier entsprechend die

26:15.850 --> 26:22.070
Zahl 28, das ist die Zahl 6 und das hier ist die Zahl 33, 32 plus 1.

26:22.650 --> 26:24.130
Entsprechend, ja, Sie haben eine Frage.

26:32.550 --> 26:35.330
Das geht jetzt über das hinaus, was ich Ihnen hier erzählen kann.

26:35.670 --> 26:39.170
Also die einzelnen Rechner-Architekturen, die sind leicht

26:39.170 --> 26:39.890
unterschiedlich.

26:40.550 --> 26:43.910
Sie können das natürlich unterschiedlich machen.

26:44.030 --> 26:47.790
Sie können also variable Adressen definieren.

26:48.350 --> 26:52.170
Aber Sie müssen immer eine Möglichkeit haben, im Programm auf

26:52.170 --> 26:57.430
definierte Art und Weise auf die Speicheradressen zu definieren und

26:57.430 --> 26:58.610
auf die Speicher zuzugreifen.

26:59.490 --> 27:03.390
Dass es dafür leicht unterschiedliche Architekturen gibt, das ist

27:03.390 --> 27:03.650
klar.

27:03.730 --> 27:05.650
Die Realisierungen sind leicht unterschiedlich.

27:06.190 --> 27:13.950
Es gibt eine Vielfalt von Bezeichnungen für Rechner-Architekturen in

27:13.950 --> 27:19.090
Bezug auf die Art, welche Busse auf welche Speichereinheiten zugreifen

27:19.090 --> 27:19.470
usw.

27:20.330 --> 27:26.570
Logisch, vom Entwurfsprinzip her, sind die alle aufgebaut nach dem

27:26.570 --> 27:27.890
Prinzip des von Norman-Rechners.

27:28.510 --> 27:31.910
Wie dann ein spezieller Rechner funktioniert, den Sie in Ihrem

27:31.910 --> 27:35.550
Smartphone haben, da sollten Sie in die Spezifikation reingucken und

27:35.550 --> 27:36.750
dann wissen Sie darüber genaueres.

27:37.170 --> 27:39.470
Also wenn ich Ihnen darüber genaueres erzählen sollte, dann müsste ich

27:39.470 --> 27:41.650
Ihnen eine eigene Vorlesung halten über Rechner-Architektur.

27:42.070 --> 27:44.490
Da kann man dann auf die verschiedenen Varianten wesentlich genauer

27:44.490 --> 27:44.850
eingehen.

27:50.430 --> 27:52.950
Speicherhierarchie sieht so aus, wie ich das hier schon angedeutet

27:52.950 --> 27:54.890
habe, aber jetzt ohne externen Speicher.

27:55.050 --> 27:56.730
Eben hatte ich die Platte aufgemalt.

27:57.490 --> 28:01.450
Und wir haben also selbst zwischen der CPU, also Rechenwerk

28:01.450 --> 28:05.970
-Steuerwerk, und dem Arbeitsspeicher, da gibt es noch zwei Stufen.

28:06.610 --> 28:09.990
Da gibt es einerseits die Register, das ist ein Register im

28:09.990 --> 28:10.630
Rechenwerk.

28:11.830 --> 28:14.590
Natürlich haben wir den Arbeitsspeicher und dazwischen gibt es den

28:14.590 --> 28:15.430
Cache -Speicher.

28:16.550 --> 28:19.050
Und Sie sehen, dass hier unterschiedliche Eigenschaften angegeben

28:19.050 --> 28:23.890
sind, die Preise pro Bit, die Zugriffszeiten und die Kapazität der

28:23.890 --> 28:24.910
jeweiligen Speicher.

28:25.730 --> 28:31.010
Und es ist so, dass je näher Sie an die CPU rankommen, desto schneller

28:31.010 --> 28:33.390
wollen Sie zugreifen können auf die Daten.

28:34.810 --> 28:40.370
Weil Sie ja möglichst wenig eine Rechnung verlangsamen wollen,

28:40.490 --> 28:43.810
dadurch, dass Sie auf den Speicher zugreifen müssen.

28:44.790 --> 28:48.330
Deswegen soll die Zugriffszeit möglichst niedrig sein bei der CPU.

28:48.930 --> 28:51.750
Je weiter Sie wegkommen, desto höher darf sie werden.

28:52.450 --> 28:58.350
Die Kapazität, wenn der Preis hoch ist pro Bit, dann wird man nicht so

28:58.350 --> 28:59.810
große Speicher dort aufbauen.

28:59.810 --> 29:05.130
Wenn der Preis niedrig ist, kann man auch große Speicher bauen.

29:06.010 --> 29:09.470
Also, Register sind unmittelbar der CPU zugeordnet, liegen im

29:09.470 --> 29:10.550
Rechenwerk in der Regel.

29:11.750 --> 29:14.650
Arbeitsspeicher unten besteht aus zwei Teilen.

29:14.710 --> 29:18.670
Wir haben einerseits das Read-Only-Memory, ganz wichtig.

29:19.490 --> 29:24.810
Sie wollen ja, wenn Sie den Rechner einschalten, gerne erreichen, dass

29:24.810 --> 29:26.390
der in der Lage ist, loszulaufen.

29:27.790 --> 29:32.670
Das heißt, es muss Informationen geben, die im Speicher fest abgelegt

29:32.670 --> 29:36.190
sind, die dazu führen, dass der Rechner anfängt zu arbeiten.

29:37.150 --> 29:40.570
Und dann, das braucht man also zum Booten des Systems.

29:40.910 --> 29:47.410
Der zieht sich praktisch selbst nach oben durch das, was er hier in so

29:47.410 --> 29:49.430
einem Read-Only-Memory lesen kann.

29:50.050 --> 29:52.690
Und dann holt er sich sukzessive weitere Informationen von der

29:52.690 --> 29:56.530
Festplatte rüber oder von dem Hintergrundspeicher.

29:57.530 --> 29:59.510
Bei das Holostate-Disk geht es halt deutlich schneller.

29:59.910 --> 30:01.070
Rein in den Hauptspeicher.

30:02.170 --> 30:06.270
Und dann kann er, der Hauptspeicher, der Random Access Memory, ist

30:06.270 --> 30:11.030
halt leider ein Speicher, der seinen Inhalt vergisst, wenn der Strom

30:11.030 --> 30:14.950
abgeschaltet ist, bis auf dieses Read-Only-Memory.

30:15.610 --> 30:18.490
Deswegen müssen Sie immer wieder die ganzen Daten aus dem externen

30:18.490 --> 30:20.490
Speicher in den Hauptspeicher holen.

30:20.490 --> 30:23.230
Und erst dann können Sie richtig losrechnen.

30:28.920 --> 30:34.560
Beim BIOS können Sie ja auch einige Dinge noch verändern.

30:35.780 --> 30:43.960
Es gibt aber auch einen Teil des Speichers, es gibt auch die

30:43.960 --> 30:48.940
Möglichkeit, dass Sie im Rechner eine Batterie haben, ist dort häufig

30:48.940 --> 30:52.180
mit vorhanden, die dafür sorgt, dass ein gewisser Bereich des

30:52.180 --> 30:56.280
Speichers die Information halten kann.

30:57.120 --> 30:58.980
Der ist dann nicht flüchtig.

30:59.580 --> 31:02.780
Und dann ist das also etwas mehr als ein Read-Only-Memory.

31:03.320 --> 31:05.280
Denn BIOS können Sie überschreiben.

31:06.080 --> 31:11.100
Aber das ist ein Bereich, der permanent diese Inhalte zur Verfügung

31:11.100 --> 31:11.380
hat.

31:15.040 --> 31:18.300
Wir reden noch über die Art, wie wir aus dem Hintergrundspeicher in

31:18.300 --> 31:19.780
den Hauptspeichersachen hineinbekommen.

31:20.280 --> 31:24.060
Das, was Sie als Bindeglied brauchen, zwischen dem Arbeitsspeicher und

31:24.060 --> 31:28.440
der CPU, ist noch ein sogenannter Cache-Speicher.

31:29.620 --> 31:30.540
Der steht hier in der Mitte.

31:33.220 --> 31:36.640
Und diese Speicherarten sind in unterschiedlicher Technologie

31:36.640 --> 31:37.440
ausgeführt.

31:37.440 --> 31:39.690
Das hier sind DRAMs.

31:40.220 --> 31:42.480
Da hatte ich Sie schon einmal darauf hingewiesen, als wir uns mit

31:42.480 --> 31:44.200
Transistoren beschäftigt haben.

31:44.680 --> 31:46.280
Und das hier ist SRAM.

31:47.160 --> 31:50.060
Ganz konkret haben Sie da noch weitere Spezifikationen dran.

31:50.620 --> 31:54.920
Nicht nur einfach DRAM und SRAM, aber das eine sind statische Speicher

31:54.920 --> 31:57.560
und das andere sind dynamische Speicher.

31:58.040 --> 32:01.980
Die statischen Speicher brauchen deutlich mehr Hardwareaufwand,

32:02.060 --> 32:06.260
brauchen mehr Transistoren, weil die Inhalte statisch zur Verfügung

32:06.260 --> 32:06.560
stehen.

32:06.700 --> 32:09.780
Und deswegen ist ein Zugriff schneller möglich als bei einem

32:09.780 --> 32:12.700
dynamischen Speicher, wo der Inhalt wieder aufgefrischt werden muss

32:12.700 --> 32:13.680
nach einem Lesevorgang.

32:14.860 --> 32:18.540
Und deswegen ist der Arbeitsspeicher preiswerter als der Cache

32:18.540 --> 32:18.980
-Speicher.

32:19.080 --> 32:20.360
Der liegt hier irgendwo in der Mitte.

32:22.240 --> 32:23.840
Zugriffszeit ist deutlich niedriger.

32:24.480 --> 32:28.360
Und die Kapazität ist eben auch niedriger als beim Arbeitsspeicher.

32:29.200 --> 32:32.120
Und Sie werden später noch sehen, wie man mit dem Cache tatsächlich

32:32.120 --> 32:32.640
umgeht.

32:33.220 --> 32:39.100
Das Problem ist, wenn Sie in Ihrem Rechner den Cache nicht sinnvoll

32:39.100 --> 32:43.520
ausnutzen, wenn er zu klein ist oder wenn Sie Programme schreiben, die

32:43.520 --> 32:50.000
Ihre Daten so ungünstig holen aus dem Hauptspeicher oder aus dem

32:50.000 --> 32:54.820
externen Speicher, dass Sie immer wieder das Problem haben, dass die

32:54.820 --> 32:57.060
Daten, die Sie brauchen, gerade nicht im Cache liegen.

32:57.060 --> 33:01.620
Dann haben Sie eine Laufzeitverzögerung, die kann um Faktor 10 oder

33:01.620 --> 33:06.960
noch mehr größer sein als die Laufzeit, die Sie hätten, wenn Sie den

33:06.960 --> 33:09.340
Cache -Speicher sinnvoll ausnutzen.

33:10.040 --> 33:13.720
Auch das ist also entscheidend für die Leistungsfähigkeit eines

33:13.720 --> 33:14.220
Rechners.

33:14.680 --> 33:19.880
Wie gut nutzen die Programme diese Möglichkeit aus, Daten in den Cache

33:19.880 --> 33:25.180
zu schreiben, obwohl sie eigentlich alle nur im Arbeitsspeicher

33:25.180 --> 33:25.440
liegen.

33:25.440 --> 33:29.120
Da liegen sie zunächst mal drin und dann werden Daten in den Cache

33:29.120 --> 33:33.440
-Speicher geholt, um sie näher an dem gerade ausgeführten Programm zu

33:33.440 --> 33:33.740
haben.

33:34.880 --> 33:36.520
Und wie man das macht, werden wir später noch sehen.

33:37.120 --> 33:40.880
Wenn Sie den Cache-Speicher nicht nutzen, haben Sie einen deutlich

33:40.880 --> 33:45.180
langsameren Rechner, weil Sie bei jeder Ausführung eines Befehls

33:45.180 --> 33:48.960
mehrfach auf den Speicher zugreifen müssen und das dauert sehr viel

33:48.960 --> 33:52.800
länger als die Ausführung eines Befehls in der CPU.

33:53.980 --> 33:57.480
Also, das ist hier auch ein wichtiger Punkt.

33:58.560 --> 34:01.640
Die schlechte Ausnutzung kann Rechner erheblich verlangsamen.

34:02.600 --> 34:06.780
Andererseits, wenn Sie einen Echtzeitrechner brauchen, wenn Sie

34:06.780 --> 34:09.620
Echtzeitrechnungen machen, wo Sie feste Zeitschranken einhalten

34:09.620 --> 34:13.080
müssen, dann dürfen Sie keinen Cache verwenden, weil Sie bei

34:13.080 --> 34:19.080
Verwendung eines Caches eventuell mit Fehler rechnen müssen, weil die

34:19.080 --> 34:22.520
Daten, auf die Sie zugreifen wollen, nicht im Cache sind.

34:22.600 --> 34:24.580
Dann müssen Sie noch auf den Arbeitsspeicher zugreifen.

34:24.940 --> 34:25.740
Das dauert länger.

34:26.840 --> 34:32.140
Und dann haben Sie garantierte Zugriffszeiten auf den Speicher, eben

34:32.140 --> 34:34.240
nur wenn Sie nicht den Cache ausnutzen.

34:34.500 --> 34:37.520
Wenn Sie den Cache ausnutzen, können Sie mal schneller sein, aber Sie

34:37.520 --> 34:39.380
können nicht garantieren, dass Sie schneller sind.

34:39.920 --> 34:44.900
Und dann ist es besser, wenn man keinen Cache hat.

34:44.900 --> 34:48.040
Aber normalerweise brauchen Sie einen möglichst großen Cache, damit

34:48.040 --> 34:50.780
Sie schnell rechnen können.

34:50.960 --> 34:52.880
Wir gehen darauf aber noch genauer ein, wenn wir uns mit

34:52.880 --> 34:55.300
Speicherhierarchie genauer beschäftigen.

34:56.420 --> 34:58.280
Das war zunächst mal genug zum Speicher.

34:58.340 --> 35:00.660
Wie gesagt, wir haben noch einen ganzen Abschnitt, der sich nur mit

35:00.660 --> 35:01.840
Speichern beschäftigen wird.

35:02.500 --> 35:03.460
Kommt das Rechenwerk.

35:03.580 --> 35:06.300
Und im Rechenwerk geht es darum, die Daten zu verarbeiten.

35:07.620 --> 35:10.200
Wir wollen Operationen ausführen, arithmetische, logische.

35:10.200 --> 35:13.240
Wir wollen Vergleiche machen können von Zahlen.

35:13.860 --> 35:16.460
Wir haben dann alle möglichen Register und Funktionseinheiten da drin.

35:16.560 --> 35:19.940
Zum Beispiel die sogenannte ALU, Arithmetic Logic Unit.

35:21.160 --> 35:23.540
Da gibt es dann irgendwelche Register A und B.

35:24.380 --> 35:26.980
Und einen Operantenregister, ein Ergebnisregister.

35:27.860 --> 35:31.560
Und dann wird eine Addition oder Subtraktion oder Multiplikation

35:31.560 --> 35:35.320
ausgeführt, je nachdem, was gerade ansteht.

35:35.840 --> 35:38.660
Und Sie haben sogenannte Statusregister, das ist dieses SR.

35:39.570 --> 35:45.920
Und die Funktionseinheit, also die Arithmetic Logic Unit, die ALU,

35:46.100 --> 35:51.960
verknüpft die Operanten gemäß dem gerade auszuführenden Befehl zu

35:51.960 --> 35:53.020
einem Ergebnis.

35:53.660 --> 35:58.140
In der Regel haben Sie heute nicht nur eine, sondern mehrere.

35:58.200 --> 35:59.280
Habe ich hier aber gar nicht drauf.

35:59.900 --> 36:05.580
Wir haben hier in der Regel mehrere solche arithmetisch-logische

36:05.580 --> 36:06.100
Einheiten.

36:06.100 --> 36:17.300
Insbesondere gibt es normalerweise extra Gleitpunkt-Einheiten.

36:17.460 --> 36:19.000
Also Gleitpunkt-Arithmetik-Einheiten.

36:20.080 --> 36:27.800
Oder Sie haben eine GPU, Graphical Processing Unit, für spezielle

36:27.800 --> 36:32.560
Operationen, die ausgeführt werden, wenn Sie Bildverarbeitung machen.

36:32.560 --> 36:36.200
Was heute zum Beispiel bei Spielen ganz wichtig ist, dass Sie Echtzeit

36:36.200 --> 36:39.960
ganz viel auf ein Bild verändern können.

36:40.340 --> 36:43.720
Dazu brauchen Sie sehr schnelle Funktionsbausteine, das sind dann

36:43.720 --> 36:45.140
Graphical Processing Units.

36:45.920 --> 36:47.860
Die Dinge sind alle in heutigen Rechnern drin.

36:50.620 --> 36:55.980
Im Prinzip ist das nur eine Art Funktionseinheit, die Operationen

36:55.980 --> 36:56.620
ausführen kann.

36:56.900 --> 36:58.980
Wie gesagt, es gibt davon in der Regel mehrere.

37:00.920 --> 37:05.500
Und was wir machen müssen, ist halt Transfer von Daten zwischen

37:05.500 --> 37:07.840
Rechenwerk und Speicherwerk.

37:08.360 --> 37:14.400
Wir wollen Bullshit-Operationen machen können oder Verknüpfungen

37:14.400 --> 37:15.380
machen können von Bits.

37:16.440 --> 37:19.320
Wir wollen arithmetische Operationen ausführen können.

37:19.860 --> 37:22.480
Schiebeoperationen, nach links, rechts schieben, also Multiplikationen

37:22.480 --> 37:24.440
mit Zweierpotenzen.

37:25.140 --> 37:28.120
Dafür, hatten Sie schon mal gesehen, gibt es Schieberegister und

37:28.120 --> 37:28.700
ähnliches.

37:30.160 --> 37:34.640
Und dann müssen wir sehen, wie wir so ein Rechenwerk steuern können.

37:35.180 --> 37:41.060
Wir haben also Steuersignale, die vom Steuerwerk in das Rechenwerk

37:41.060 --> 37:41.860
gegeben werden.

37:41.980 --> 37:45.440
Dadurch wird festgelegt, welche Operation die ALU jetzt gerade

37:45.440 --> 37:46.320
ausführen soll.

37:46.320 --> 37:51.820
Und die Ergebnisse, etwa zum Beispiel Division durch 0 oder Not a

37:51.820 --> 37:56.880
Number oder all solche Dinge, die werden über Statusregister an das

37:56.880 --> 38:00.100
Steuerwerk zurückgegeben, sodass man dann entsprechend darauf

38:00.100 --> 38:00.980
reagieren kann.

38:02.220 --> 38:04.200
Also, das sind Dinge, die wir hier drin haben.

38:04.340 --> 38:07.380
Wir müssen natürlich auch vom Rechenwerk auf das Speicherwerk

38:07.380 --> 38:08.360
zugreifen können.

38:10.660 --> 38:13.620
Wir werden uns den Ablauf gleich noch genauer anschauen.

38:13.620 --> 38:15.480
Wir haben dann das Steuerwerk.

38:16.340 --> 38:23.080
Das Steuerwerk soll die Befehle ausführen, die im Programm stehen.

38:23.760 --> 38:26.260
Das Programm steht zunächst mal irgendwo im Speicher.

38:26.820 --> 38:33.160
Im Steuerwerk muss ich also einerseits einen Befehlszähler haben, oder

38:33.160 --> 38:39.700
auch Program Counter, der mir sagt, an welcher Stelle im Speicher der

38:39.700 --> 38:41.760
aktuell auszuführende Befehl liegt.

38:41.760 --> 38:46.560
Und dieser aktuell auszuführende Befehl steht im Instruktionsregister.

38:48.960 --> 38:53.020
Das ist unser Instruktionsregister.

38:53.820 --> 38:57.120
Da liegt ein Befehl drin, der natürlich irgendeinen Op-Code hat,

38:57.180 --> 38:58.240
Operations -Code.

38:58.380 --> 39:03.100
Und hier haben wir dann Operation 1, Operant 1, Operant 2, vielleicht

39:03.100 --> 39:03.980
mehrere Operanten.

39:04.900 --> 39:08.820
In der Regel 1 bis 3 Operanten in einem Befehl.

39:08.820 --> 39:11.840
Und das steht alles im Instruktionsregister drin.

39:12.860 --> 39:16.800
Und damit das Steuerwerk das auch alles richtig macht, muss das

39:16.800 --> 39:22.640
Steuerwerk erstmal in der Lage sein, einen Befehl zu holen aus dem

39:22.640 --> 39:23.180
Speicher.

39:24.100 --> 39:25.000
Das ist der erste Schritt.

39:27.820 --> 39:29.820
Dann steht der Befehl im Instruktionsregister.

39:30.920 --> 39:33.100
Dann muss dieser Befehl entschlüsselt werden.

39:33.100 --> 39:35.560
Er ist nicht irgendwie verschlüsselt.

39:35.640 --> 39:39.100
Es geht nur darum festzustellen, dass ist hier die Operation zum

39:39.100 --> 39:41.140
Beispiel eine Addition.

39:42.620 --> 39:46.100
Und hier steht vielleicht die Zahl 7 und da steht vielleicht irgendwie

39:46.100 --> 39:48.100
ein I17.

39:50.500 --> 39:54.140
Und das heißt, das eine ist vielleicht eine ganz normale Adresse eines

39:54.140 --> 39:58.640
Registers und das I17 ist eine indirekte Adresse, um in der Zelle 17

39:58.640 --> 40:01.640
erstmal nachzuschauen, wo die Adresse des Operanten liegt.

40:03.400 --> 40:08.340
Also, entschlüsseln heißt hier, Zerlegung des Befehls, der im

40:08.340 --> 40:12.300
Instruktionsregister steht, in seine Bestandteile, den Opcode und die

40:12.300 --> 40:12.880
Operanten.

40:14.800 --> 40:18.560
Erkennen der Befehlsart, Zerlegung in die Bestandteile.

40:19.880 --> 40:23.220
Und dann, wenn man das erkannt hat, was dort drin steht, müssen die

40:23.220 --> 40:25.140
entsprechenden Rechnungen ausgeführt werden.

40:25.920 --> 40:30.700
Es muss also ausgeführt werden, das was im Befehl vorgeschrieben ist.

40:30.700 --> 40:36.040
Dazu müssen die Operanten erstmal in das Rechenwerk geholt werden.

40:36.780 --> 40:39.680
Das kann ja sein, dass die erst noch irgendwo im Speicher liegen und

40:39.680 --> 40:43.120
dass im Speicher erst die Adresse liegt, aus der ein tatsächlich

40:43.120 --> 40:44.740
Operant geholt werden muss.

40:45.560 --> 40:49.200
Die müssen also geladen werden aus dem Speicher in das Rechenwerk.

40:49.340 --> 40:53.800
Es sei denn, das kann auch passieren, dass ein Operant direkt, also

40:53.800 --> 40:56.180
die Zahl, die dort steht, direkt verwendet werden soll.

40:57.000 --> 40:59.520
Dann müssen die Operationen ausgeführt werden.

40:59.700 --> 41:02.440
Das Ergebnis muss gespeichert werden in einem Register.

41:02.600 --> 41:04.600
Also es ist in dem Ergebnisregister drin.

41:05.100 --> 41:08.680
Kann sein, dass das reich kann sein, dass das Ergebnis in eine

41:08.680 --> 41:11.620
definierte Stelle im Speicher wieder geschrieben werden muss.

41:12.400 --> 41:15.780
Und es muss anschließend der Befehlszähler, der Program-Counter

41:15.780 --> 41:18.500
verändert werden, um 1 erhöht werden.

41:18.500 --> 41:24.080
Oder bei einem Sprungbefehl auf den Wert der Befehlsadresse gesetzt

41:24.080 --> 41:26.780
werden, die als nächstes ausgeführt werden soll.

41:28.460 --> 41:34.100
Und das hier ist das, was abläuft, wenn ein Programm ausgeführt wird.

41:34.560 --> 41:40.700
Es wird jeder einzelne Befehl in die CPU geholt, wird ausgeführt und

41:40.700 --> 41:46.740
das heißt, wir haben immer diese Bestandteile Fetch, Decode, Execute.

41:47.740 --> 41:55.080
Auch wieder eine ganz zentrale Erkenntnis, wenn ein Programm

41:55.080 --> 41:59.980
ausgeführt wird, dann muss jeder Befehl eines Programms aus dem

41:59.980 --> 42:04.920
Speicher in die CPU geholt werden, muss dort entschlüsselt werden und

42:04.920 --> 42:05.960
wird dann ausgeführt.

42:06.240 --> 42:11.020
Dadurch, dass entsprechend Steuersignale an das Rechenwerk gegeben

42:11.020 --> 42:14.780
werden und das Rechenwerk führt dann entsprechend diese Operationen

42:14.780 --> 42:18.620
aus und die Ergebnisse sind dann wieder irgendwo abzulegen.

42:19.000 --> 42:20.240
Das dauert.

42:20.820 --> 42:23.240
Wir werden uns jetzt genauer mal drüber anschauen, was dort eigentlich

42:23.240 --> 42:23.700
passiert.

42:24.140 --> 42:29.020
Der Maschinenbefehlszyklus ist eigentlich der Kern der Ausführung von

42:29.020 --> 42:35.860
Programmen und das sollte man auch wissen, wie ein Programm

42:35.860 --> 42:37.000
tatsächlich ausgeführt wird.

42:37.000 --> 42:40.200
Pause können wir gleich machen.

42:40.560 --> 42:42.400
Oh, wir können auch jetzt eine Pause machen, meinetwegen.

42:43.160 --> 42:43.720
Ist in Ordnung.

46:01.920 --> 46:05.780
So, ich denke, wir können uns dann mal die Aufgabe hier kurz angucken.

46:06.340 --> 46:10.940
Nur als kleine Wiederholung zu der Zahlendarstellung.

46:11.940 --> 46:16.660
Welche der folgenden Codierungsarten wird bei der IEEE 754 Darstellung

46:16.660 --> 46:18.860
verwendet, um den Exponenten zu codieren?

46:19.700 --> 46:23.100
Das habe ich Ihnen ja schon angegeben.

46:23.400 --> 46:29.040
Also BCD-Codierung wäre sehr ineffizient, wäre viel zu lang.

46:30.380 --> 46:34.620
XS-Cuda-Codierung, haben zwei richtig gesagt, das ist die, die man

46:34.620 --> 46:40.840
nimmt, hat halt den großen Vorteil gegenüber der unten angegebenen 1

46:40.840 --> 46:44.380
-Komplement - oder 2-Komplement-Codierung, dass wir die Größe

46:44.380 --> 46:50.820
vergleichen können, also die Größe der codierten Exponenten, nämlich

46:50.820 --> 46:54.200
die Charakteristiken in ihrer Größe vergleichen können und wir kriegen

46:54.200 --> 46:58.220
das gleiche Ergebnis, als wenn wir eben die Original-Exponenten

46:58.220 --> 47:04.660
verglichen hätten in ihrer Größe, also dabei die negativen und die

47:04.660 --> 47:09.500
positiven halt einfach nur verschoben werden und nicht bei der

47:09.500 --> 47:10.960
Codierung vertauscht werden.

47:11.860 --> 47:17.380
Also, das dazu ist irgendwie etwas dunkler geworden, ist das richtig?

47:18.400 --> 47:19.240
Etwas seltsam?

47:20.740 --> 47:22.020
Keine Ahnung, woran das liegt?

47:23.160 --> 47:25.900
Ah, wieder besser.

47:27.840 --> 47:33.980
So, und jetzt ist aber das Schöne...

47:36.050 --> 47:43.630
Hier alles verschwunden, das wollten wir haben und wir wollten das

47:43.630 --> 47:44.290
hier haben.

47:44.930 --> 47:45.590
Was ist das denn?

47:45.650 --> 47:48.690
Das hat einer überall hier noch...

47:48.690 --> 47:51.870
Bei den anderen meinten sie, das wäre auch richtig, aber die verwenden

47:51.870 --> 47:52.630
wir natürlich nicht.

47:52.750 --> 47:55.730
Wir verwenden weder die Icon- oder 2-aus-5-Codierung, das waren

47:55.730 --> 47:58.450
Codierungen von Ziffern und nicht von Zahlen.

47:59.310 --> 48:03.150
Kann man auch machen, wäre aber viel zu lang, wäre nicht effizient.

48:04.070 --> 48:10.390
Und wir haben also die XSQ-Codierung und nicht die Icon-Codierung,

48:10.650 --> 48:14.530
nicht die 2-aus-5-Codierung und eben auch nicht die 1-Kompliment- oder

48:14.530 --> 48:20.590
2 -Kompliment-Codierung, sondern nur die Nummer 2 ist richtig, die XSQ

48:20.590 --> 48:21.110
-Codierung.

48:21.350 --> 48:25.550
Weil wir damit Gleitpunkt-Operationen, Additionen insbesondere,

48:26.470 --> 48:28.450
deutlich effizienter machen können.

48:28.450 --> 48:33.050
Wir können den Vergleich der Exponenten damit schneller machen, als

48:33.050 --> 48:35.590
wenn wir das anders realisieren würden.

48:36.590 --> 48:40.370
Lassen Sie uns zurückkommen zur Vorlesung der Maschinenbefehlszyklus.

48:40.930 --> 48:46.050
Ganz wichtige Erkenntnis, wie Befehle im Rechner ausgeführt werden.

48:46.550 --> 48:50.690
Das ist eben ein ING-Pass im Rechner, die müssen alle dort irgendwie

48:50.690 --> 48:51.570
ausgeführt werden.

48:51.570 --> 48:57.470
Jetzt schauen wir uns das mal an, was passiert, wenn wir einen Befehl

48:57.470 --> 49:02.010
haben, wir sollen den Inhalt einer Speicherzelle 500 um 16 erhöhen.

49:03.150 --> 49:10.650
Dann ist hier im Programme-Counter steht also hier 1000 drin.

49:11.650 --> 49:21.530
Es steht in der Speicherzelle irgendwo im Speicher an Adresse 1000 der

49:21.530 --> 49:22.870
zu bearbeitende Befehl.

49:23.750 --> 49:32.390
Also dieser Befehl, das kann ein Additionsbefehl sein, wo eben dann

49:32.390 --> 49:38.090
der Inhalt der Speicherzelle 500 um 16 zu erhöhen ist.

49:38.870 --> 49:44.890
Wir haben als Inhalt von Speicherzelle 500 zum Beispiel den Wert 17.

49:46.250 --> 49:49.490
Jetzt wird der Befehl geholt, ich hole den Inhalt aus dem

49:49.490 --> 49:50.370
Speicherwerk.

49:51.670 --> 49:55.830
Dazu muss ich natürlich zunächst mal zugreifen auf das Speicherwerk,

49:55.950 --> 49:57.450
muss dem Speicherwerk etwas sagen.

49:57.450 --> 50:08.410
Das Speicherwerk muss antworten und muss eben den Befehl in unser

50:08.410 --> 50:10.110
Instruktionsregister hineinschreiben.

50:10.770 --> 50:13.690
Und dann muss da eben stehen, dass hier das ein Additionsbefehl ist

50:13.690 --> 50:17.330
und dann steht da wahrscheinlich auch noch die 16 irgendwie und die

50:17.330 --> 50:18.670
Speicherzelle 500.

50:19.890 --> 50:24.610
So, dann muss das erst mal alles dekodiert werden, das hatte ich

50:24.610 --> 50:25.530
gerade eben gemacht.

50:26.610 --> 50:28.950
Ich muss erkennen, dass es sich um eine Addition handelt, dass die

50:28.950 --> 50:33.090
Speicherzelle 500 oder der Inhalt zu holen ist und es soll die

50:33.090 --> 50:36.670
konstante Zahl 16 darauf addiert werden.

50:37.350 --> 50:41.750
Dann muss ich entsprechend den Inhalt der Speicherzelle 500 holen.

50:42.270 --> 50:45.370
Das heißt, ich muss zunächst mal zugreifen auf den Speicher.

50:45.370 --> 50:47.130
Der muss antworten.

50:48.250 --> 50:53.470
Dann habe ich den Inhalt der Speicherzelle 500, also die 17, steht

50:53.470 --> 50:55.430
dann hier irgendwo im Rechenwerk drin.

50:56.550 --> 50:59.810
Nicht die 17, natürlich doch die 17, also Inhalt der Speicherzelle

50:59.810 --> 51:00.190
500.

51:00.970 --> 51:06.090
Und dann will ich addieren die 16 dazu.

51:06.090 --> 51:13.250
Dann kommt da halt entsprechend gerade raus 33 und die 33 muss ich

51:13.250 --> 51:17.170
dann entsprechend wieder reinschreiben in den Rechner.

51:18.370 --> 51:24.070
Das heißt, wir haben mehrfach zugreifen müssen auf den Speicher, um

51:24.070 --> 51:26.320
den Inhalt zu holen.

51:27.350 --> 51:30.090
Die Anzahl der Speicherzugriffe hier ist relativ hoch.

51:30.090 --> 51:37.990
Wir mussten den Befehl holen, wir mussten den Operanten holen aus dem

51:37.990 --> 51:40.970
Speicher und anschließend etwas zurückschreiben in den Speicher.

51:41.050 --> 51:47.090
Das sind also in diesem Fall drei Speicherzugriffe.

51:47.790 --> 51:48.510
Das war nichts.

51:48.770 --> 51:50.430
Drei Speicherzugriffe.

51:51.750 --> 51:54.730
Um einen einfachen Befehl auszuführen.

51:55.070 --> 51:56.510
Drei Speicherzugriffe.

51:57.290 --> 52:01.230
Und ich hatte schon gesagt, der Zugriff auf einen Speicher ist um

52:01.230 --> 52:03.250
Größenordnungen langsamer.

52:04.070 --> 52:08.670
Also etwa eine Größenordnung langsamer als die Ausführung einer

52:08.670 --> 52:11.250
Addition im Rechenwerk.

52:12.050 --> 52:16.190
Das heißt, wir haben eine Verlangsamung durch den Zugriff auf den

52:16.190 --> 52:16.630
Speicher.

52:18.130 --> 52:21.850
Das ist häufig bezeichnet als zum Beispiel Frontside-Bus.

52:22.390 --> 52:27.070
Wenn Sie sich anschauen, die Frequenz, mit der Sie über den Frontside

52:27.070 --> 52:35.090
-Bus auf Ihren Speicher zugreifen können, dann ist die Frequenz der

52:35.090 --> 52:40.070
Zugriffe in der Regel deutlich niedriger als die Taktfrequenz Ihres

52:40.070 --> 52:40.510
Rechners.

52:41.310 --> 52:48.010
Das heißt, die Geschwindigkeit Ihres Frontside-Buses, also der Bus

52:48.010 --> 52:53.010
zwischen Speicherwerk und Rechenwerk, gibt Ihnen an, wie lange es

52:53.010 --> 52:56.130
effektiv eigentlich dauert, um ein Befehl auszuführen.

52:57.890 --> 52:59.950
Die CPU könnte wesentlich schneller sein.

53:00.470 --> 53:04.570
Aber wenn Sie bei jeder Ausführung eines Befehls auf den Speicher

53:04.570 --> 53:07.930
zugreifen müssen, und wir haben gesehen, zumindest mit dem Befehl muss

53:07.930 --> 53:13.590
ich erholen, und dann muss ich noch Operanten holen, das dauert.

53:14.310 --> 53:18.070
Deswegen ist es so wichtig, diese Zeit zu verkürzen, durch Cache und

53:18.070 --> 53:18.570
Ähnliches.

53:20.590 --> 53:22.270
Darauf kommen wir dann nochmal wieder zurück.

53:23.250 --> 53:26.290
Und damit sind wir jetzt zunächst mal bei einer Ausgabeeinheit.

53:26.870 --> 53:29.630
Wir wollen ja auch etwas eingeben und ausgeben können.

53:30.570 --> 53:32.450
Und was haben wir für Eingabeeinheiten?

53:32.590 --> 53:35.930
Nun Vielfalt, vielfältige Dinge, natürlich die Tastatur.

53:36.730 --> 53:39.890
Oder Sie haben eine Maus, oder wie ich hier einen Stift.

53:39.970 --> 53:42.330
Ich kann den schöneren rummalen auf dem Bildschirm, das ist eine

53:42.330 --> 53:43.490
Eingabe in den Rechner.

53:44.350 --> 53:48.830
Oder ich habe Menüauswahl am Bildschirm, oder ich habe Sensoren, ein

53:48.830 --> 53:52.610
Mikrofon, auch das wird verwendet, um hier Eingaben zu machen in den

53:52.610 --> 53:52.950
Rechner.

53:53.770 --> 53:56.710
Oder ich habe vielleicht Druck, Temperatur, ähnliches.

53:56.790 --> 54:01.590
Wenn Sie zum Beispiel Roboter steuern, dann haben Sie sogenannte

54:01.590 --> 54:04.650
haptische Sensoren.

54:04.790 --> 54:08.270
Das heißt, Sie können, wenn Sie mit der Hand eines Roboters ein Glas

54:08.270 --> 54:12.670
aufnehmen wollen, müssen Sie in der Lage sein, mit dem richtigen Druck

54:12.670 --> 54:16.890
tatsächlich mit den Fingern der Hand des Roboters ein Glas anzufassen

54:16.890 --> 54:17.670
und hochzuheben.

54:18.090 --> 54:21.270
Das sind haptische Informationen, die so ähnlich sind wie das, was wir

54:21.270 --> 54:24.710
in unseren Fingern haben, dass wir druckempfindlich sind und

54:24.710 --> 54:27.850
entsprechend unsere Bewegungen anpassen können.

54:28.810 --> 54:32.350
Dann gibt es eine Ausgabe, Bildschirm, Drucker, Lautsprecher, alles

54:32.350 --> 54:33.370
mögliche gibt es.

54:33.450 --> 54:36.730
Auch da können Sie in unterschiedlicher Form Dinge ausgeben.

54:36.730 --> 54:40.090
Sie können auch Nachrichten rausschicken über ein Netz und Ähnliches.

54:41.110 --> 54:45.730
Also Ein- und Ausgabe, Sie können über Netze mit anderen Rechnern

54:45.730 --> 54:49.110
kommunizieren und von denen Informationen bekommen oder etwas

54:49.110 --> 54:49.730
hinschreiben.

54:50.930 --> 54:55.350
Sie haben dann die Sekundärspeicher, Externspeicher, Festplatte,

54:55.470 --> 55:00.590
Flärspeicher, CDs, Kassetten, Magnetband, all das taucht heutzutage

55:00.590 --> 55:01.010
auf.

55:01.010 --> 55:06.610
Und wenn Sie jetzt kommunizieren, ist natürlich wichtig, kommen die

55:06.610 --> 55:09.910
Daten eigentlich genau so an, wie ich sie rausgeschickt habe oder ist

55:09.910 --> 55:11.050
die Reihenfolge anders?

55:11.870 --> 55:15.350
Wenn Sie etwas übers Internet rausschicken, kann die Reihenfolge

55:15.350 --> 55:17.990
völlig anders sein, als die Reihenfolge, in der Sie Daten

55:17.990 --> 55:18.890
rausgeschickt haben.

55:20.270 --> 55:22.870
Also das ist etwas, was wichtig ist.

55:22.870 --> 55:26.990
Wenn das nicht gewährleistet ist, dass die Reihenfolge eingehalten

55:26.990 --> 55:30.570
wird bei der Kommunikation, müssen Sie bei den kommunizierenden

55:30.570 --> 55:33.750
Programmen in der Lage sein, die richtige Reihenfolge

55:33.750 --> 55:34.530
wiederherzustellen.

55:35.410 --> 55:38.770
Erfordert also mehr Aufwand auf der Protokollebene für die

55:38.770 --> 55:39.670
Kommunikation.

55:40.230 --> 55:42.030
Das Format der Daten ist wichtig.

55:42.030 --> 55:47.110
Wie stelle ich eigentlich einen Rechner im Cache da, im Hauptspeicher,

55:47.470 --> 55:50.730
auf einer Festplatte oder auf einer Diskette oder auf der CD?

55:51.270 --> 55:52.990
Wie formatiere ich meine Dateien?

55:53.350 --> 55:54.430
Sehr unterschiedlich.

55:55.150 --> 55:59.050
Das heißt, ich muss meine Datenformate noch anpassen, wenn ich etwas

55:59.050 --> 56:06.650
von der Festplatte oder von der Floppy Disk oder vom Band rüberhole in

56:06.650 --> 56:07.430
den Hauptspeicher.

56:07.430 --> 56:12.130
Da muss ich Datentransformationen machen, muss Formate ändern, um

56:12.130 --> 56:15.930
tatsächlich dann richtig auf die Inhalte zugreifen zu können.

56:16.330 --> 56:21.250
Je nachdem, was für eine Art, wenn Sie also hier eine Festplatte

56:21.250 --> 56:28.790
haben, da werden halt die Daten auf Spuren abgelegt und dort jeweils

56:28.790 --> 56:29.750
in Sektoren eingeteilt.

56:29.750 --> 56:33.350
Das heißt, Sie haben hier gewisse Stücke von zusammenhängenden

56:33.350 --> 56:36.030
Speicherzellen, unterbrochen jeweils.

56:36.810 --> 56:41.870
Und das heißt, Sie müssen Ihre Dateien so organisieren, dass die

56:41.870 --> 56:46.870
jeweils in diese Sektoren oder die Spuren auf einem Sektor genau

56:46.870 --> 56:47.950
abgelegt werden können.

56:48.970 --> 56:51.650
Im Hauptspeicher sieht das völlig anders aus.

56:51.770 --> 56:54.330
Auf einer SSD sieht das auch wieder völlig anders aus.

56:54.750 --> 56:58.350
Das heißt, Sie haben sehr viel Daten hin und her zu transformieren,

56:58.670 --> 57:02.230
wenn Sie Daten zwischen dem Hauptspeicher und einem externen Speicher

57:02.230 --> 57:03.770
hin und her laufen lassen.

57:03.970 --> 57:05.070
Was wir ständig machen.

57:06.170 --> 57:08.450
Da muss der Rechner sehr viel tun, um das sinnvoll zu machen.

57:08.850 --> 57:10.930
Und die Geschwindigkeit ist auch unterschiedlich, da kommen wir noch

57:10.930 --> 57:14.750
später drauf, wenn wir uns mit den Speicherbausteinen noch einmal

57:14.750 --> 57:15.530
genauer beschäftigen.

57:16.290 --> 57:20.910
Eine Frage ist, wie wir eigentlich mit der Ein-Ausgabe-Einheit

57:20.910 --> 57:21.750
arbeiten.

57:22.190 --> 57:25.870
Wir können eine feste Zuordnung haben der CPU zum Ein-Ausgabe-Gerät.

57:26.330 --> 57:30.470
Stellen Sie sich mal vor, die CPU müsste warten, bis Sie auf der

57:30.470 --> 57:32.690
Tastatur ein Zeichen eingegeben haben.

57:33.310 --> 57:36.590
Das wäre eine unendlich lange Wartezeit im Vergleich zu der

57:36.590 --> 57:40.070
Geschwindigkeit, mit der die CPU Informationen verarbeiten könnte.

57:40.690 --> 57:42.710
Das macht eigentlich nicht viel Sinn.

57:42.710 --> 57:46.450
Deswegen haben wir in der Regel eine unterbrechungsgesteuerte Ein

57:46.450 --> 57:47.150
-Ausgabe.

57:47.750 --> 57:54.270
Das heißt, der Rechner, Sie haben also hier Ihren Prozessor, der soll

57:54.270 --> 57:54.870
irgendwas tun.

57:54.990 --> 58:00.590
Jetzt braucht er eine Eingabe und dann muss ein Eingabeprozessor

58:00.590 --> 58:01.170
arbeiten.

58:02.030 --> 58:04.210
Die CPU macht aber mittlerweile was anderes.

58:04.920 --> 58:08.310
Und wenn der hier fertig ist, dann wird eine Information nach oben

58:08.310 --> 58:08.710
geschickt.

58:09.210 --> 58:12.130
Und dann kann der das alte Programm wieder aufnehmen und kann auf die

58:12.130 --> 58:15.610
inzwischen eingetroffene Information reagieren.

58:16.370 --> 58:19.150
Das ist ein unterbrechungsgesteuerter Ein-Ausgabe-Vorgang.

58:19.650 --> 58:23.930
Das heißt, es wird die Ausführung eines Programms unterbrochen, wenn

58:23.930 --> 58:27.290
eine gewisse Information da ist, beziehungsweise wenn eine Information

58:27.290 --> 58:31.710
gebraucht wird, wird das der Ein-Ausgabe-Einheit mitgeteilt.

58:31.710 --> 58:34.810
Und die muss dann dafür sorgen, dass irgendwann die Information

58:34.810 --> 58:35.870
bereitgestellt wird.

58:36.810 --> 58:40.850
Also die CPU ist deutlich schneller als die Ein-Ausgabe.

58:41.930 --> 58:44.530
Und wenn wir uns nur mal anschauen, was das eigentlich heißt.

58:45.370 --> 58:48.630
Stellen Sie sich vor, Sie haben mittlerweile 16 Megabit pro Sekunde,

58:48.710 --> 58:49.570
das ist schon gar nicht mehr so schnell.

58:50.030 --> 58:52.990
Ich hoffe, Sie haben schon 50 Megabit pro Sekunde, aber das ist auch

58:52.990 --> 58:53.730
nicht ganz schlecht.

58:54.390 --> 58:57.630
CPU mit 3 Gigahertz-Takt ist durchaus in Ordnung.

58:57.630 --> 59:03.890
Jetzt haben Sie ein IP-Paket, also ein typisches Datenpaket, minimaler

59:03.890 --> 59:05.790
Größe, 576 Byte.

59:06.530 --> 59:08.690
Das wollen Sie lesen.

59:11.070 --> 59:14.290
Das bekommen Sie von außen geschickt, dieses IP-Paket.

59:16.450 --> 59:20.930
Das dauert genauso lange wie etwa die Ausführung von 900.000

59:20.930 --> 59:21.790
Maschinenbefehlen.

59:22.830 --> 59:28.730
Nur dieses IP-Paket in Ihren Rechner hinein zu bekommen, also das von

59:28.730 --> 59:32.190
extern zu bekommen, das dauert so lange.

59:32.890 --> 59:34.250
Über diese DSL-Leitung.

59:36.190 --> 59:40.430
Sie wollen in der Regel nicht nur ein IP-Paket lesen, sondern viele.

59:41.170 --> 59:46.330
Sie haben Kilobyte, Megabyte an Daten, die Sie hin- und herschieben.

59:46.330 --> 59:51.730
Das dauert lange, das wissen Sie, das dauert lange, um solche Daten

59:51.730 --> 59:52.890
hin - und herzuschieben.

59:54.690 --> 59:57.110
Also macht man das so, das hätte ich schon gesagt.

59:57.950 --> 01:00:02.910
Während der Programmausführung liest die CPU das Statusregister des

01:00:02.910 --> 01:00:09.210
Peripheriegeräts und wenn dort eine Ausgabebereitschaft da ist, dann

01:00:09.210 --> 01:00:13.250
wird ein Interrupt-Händler gestartet, der dann veranlasst, dass die

01:00:13.250 --> 01:00:17.390
nächste Ein-Ausgabe-Informationseinheit geholt wird oder gelesen wird

01:00:17.390 --> 01:00:17.910
oder was immer.

01:00:18.670 --> 01:00:21.970
Und die CPU fährt dann mit der Ausführung dieses Programms oder eines

01:00:21.970 --> 01:00:23.970
anderen Programms weiter fort.

01:00:24.510 --> 01:00:27.170
Ein Programm, das eben schon alle Daten hat.

01:00:27.890 --> 01:00:30.870
Und das Programm, das auf eine Information wartet zum Beispiel, das

01:00:30.870 --> 01:00:36.010
wird dann erstmal in Wartestellung gelegt, in Standby gelegt, sodass

01:00:36.010 --> 01:00:38.970
es erstmal warten muss, bis die Information bereitsteht.

01:00:40.310 --> 01:00:43.150
Wenn Sie 100 Megabit pro Sekunde haben, geht es ein bisschen

01:00:43.150 --> 01:00:43.570
schneller.

01:00:44.610 --> 01:00:47.850
Also statt 16 Megabit 100 Megabit, aber dann haben Sie hier immer noch

01:00:47.850 --> 01:00:50.470
so etwa 140.000 Befehle pro IP-Paket.

01:00:51.050 --> 01:00:54.230
Muss man sich einfach klar machen, Kommunikation mit der Außenwelt ist

01:00:54.230 --> 01:00:56.750
teurer als das, was Sie intern machen können.

01:00:58.310 --> 01:01:04.870
Und wenn Sie noch schneller kommunizieren können, irgendwann sind Sie

01:01:04.870 --> 01:01:07.170
an der Ausführungszeit von Befehlen.

01:01:07.970 --> 01:01:14.070
Dann wird eventuell irgendwann die CPU langsamer als die Datenmengen,

01:01:14.190 --> 01:01:14.750
die kommen können.

01:01:15.690 --> 01:01:21.330
Wenn jetzt also, wie gesagt, das ist hier die Art, wie wir in der

01:01:21.330 --> 01:01:21.850
Regel das machen.

01:01:21.850 --> 01:01:25.490
Wir haben einen Ausgabeprozessor, der kommuniziert mit dem Datennetz

01:01:25.490 --> 01:01:26.310
und wir haben die CPU.

01:01:27.190 --> 01:01:32.730
Und die beiden arbeiten eben nebenläufig, parallel, unabhängig

01:01:32.730 --> 01:01:33.250
voneinander.

01:01:35.170 --> 01:01:39.210
Und wenn man jetzt natürlich die Übertragungsbandbreiten immer weiter

01:01:39.210 --> 01:01:43.790
erhöht, also wir sind im lokalen Netz in der Regel bei 100 Megabit,

01:01:43.790 --> 01:01:51.050
hier am KIT haben wir 1 Gigabit mittlerweile als schnelle

01:01:51.050 --> 01:01:51.990
Datenverbindung.

01:01:52.790 --> 01:01:57.510
Wir können auch bis in den Terabit-Bereich hinein, da ist das, man

01:01:57.510 --> 01:01:58.490
weiß, dass das geht.

01:01:59.250 --> 01:02:03.410
Bei den Backbones, da sind wir im Terabit-Bereich mittlerweile.

01:02:03.850 --> 01:02:06.590
Also sehr große Übertragungsbandbreiten.

01:02:07.150 --> 01:02:10.550
Und da ist dann irgendwann so, dass die Datenmengen, die kommen, so

01:02:10.550 --> 01:02:13.570
groß sind, dass die CPUs nicht mehr schnell genug sind, um die

01:02:13.570 --> 01:02:14.650
tatsächlich zu verarbeiten.

01:02:15.590 --> 01:02:19.610
Also da muss man sehen, wie man das geeignet balanciert, wie man das

01:02:19.610 --> 01:02:20.270
ausgleicht.

01:02:23.270 --> 01:02:27.910
Wenn man jetzt kommuniziert zwischen einzelnen Komponenten, ich sagte,

01:02:28.030 --> 01:02:30.750
der Von-Neumann-Rechner ist aufgebaut, dass eine Menge von Komponenten

01:02:30.750 --> 01:02:35.730
über Busse kommunizieren, da muss man sehen, mit diesen Bussen, wie

01:02:35.730 --> 01:02:37.130
die eigentlich kommunizieren können.

01:02:37.130 --> 01:02:40.330
Sie haben jetzt hier N-Geräte, die wollen alle was schreiben.

01:02:41.690 --> 01:02:42.970
Das ist schwierig.

01:02:43.150 --> 01:02:44.430
Das ist eine elektrische Leitung.

01:02:45.090 --> 01:02:48.450
Diese Leitung wird auf 1 oder 0 gesetzt, die einzelne Bit-Leitung.

01:02:49.190 --> 01:02:51.590
Und dann ist die gesamte Leitung auf 1 oder auf 0.

01:02:52.450 --> 01:02:55.090
Diese Information verbreitet sich über den ganzen Bus.

01:02:55.950 --> 01:03:02.050
Das heißt, Sie haben ein sogenanntes Exclusive Right.

01:03:03.050 --> 01:03:05.050
Es kann aber jeder...

01:03:13.190 --> 01:03:14.770
Einer darf schreiben.

01:03:15.930 --> 01:03:24.570
Es können aber alle, die damit verbunden sind, können lesen, was auf

01:03:24.570 --> 01:03:25.290
dem Bus steht.

01:03:26.090 --> 01:03:28.910
Das heißt, wir haben ein Concurrent Read.

01:03:35.620 --> 01:03:39.800
Das ist das Prinzip einer Buskommunikation.

01:03:40.100 --> 01:03:42.020
Concurrent Read, Exclusive Right.

01:03:42.140 --> 01:03:44.420
Einer darf schreiben, alle dürfen lesen.

01:03:45.060 --> 01:03:47.640
Und dann lesen alle und stellen fest, ob sie angesprochen sind oder

01:03:47.640 --> 01:03:48.000
nicht.

01:03:48.160 --> 01:03:51.080
Und der, der angesprochen ist, holt sich die Information, die anderen

01:03:51.080 --> 01:03:54.120
ignorieren die Information, die dort auf dem Bus steht.

01:03:55.120 --> 01:03:59.200
Und jetzt gibt es für die Organisation der Kommunikation über so einen

01:03:59.200 --> 01:04:00.660
Bus verschiedene Regeln.

01:04:00.660 --> 01:04:03.660
Es muss festgelegt werden, wer schreiben darf.

01:04:04.580 --> 01:04:07.540
Und das macht man dann über verschiedene Arten, die auf der nächsten

01:04:07.540 --> 01:04:08.220
Folie kommen.

01:04:08.960 --> 01:04:12.480
Die Bandbreite des Buses ist die Anzahl der Bitleitungen, die parallel

01:04:12.480 --> 01:04:12.920
sind.

01:04:13.720 --> 01:04:17.420
Und der Vorteil ist, dass Sie das einfacher erweitern können.

01:04:17.580 --> 01:04:22.440
Allerdings, der Engpass wird immer größer für die einzelnen

01:04:22.440 --> 01:04:26.480
Komponente, weil immer mehr versuchen, auf diese beschränkte Ressource

01:04:26.480 --> 01:04:26.800
zuzugreifen.

01:04:26.800 --> 01:04:31.100
Wenn nur einer schreiben darf, müssen die anderen alle warten, das ist

01:04:31.100 --> 01:04:31.620
ein Engpass.

01:04:31.760 --> 01:04:32.920
Und das muss man geeignet steuern.

01:04:34.200 --> 01:04:37.700
Und hier sind nochmal die Daten, also die verschiedenen Busarten

01:04:37.700 --> 01:04:38.380
dargestellt.

01:04:39.040 --> 01:04:44.260
Wir haben Datenbus, Adressbus, Steuerbus, Infoneumannrechner, um also

01:04:44.260 --> 01:04:48.320
einerseits die Daten zu übertragen, also zum Beispiel alle Bits eines

01:04:48.320 --> 01:04:49.720
Arbeitsspeicherelementes.

01:04:50.690 --> 01:04:54.960
Wir müssen über den Adressbus die von der CPU berechneten

01:04:54.960 --> 01:04:57.440
Speicheradressen entsprechend übertragen können.

01:04:58.480 --> 01:05:01.800
Und dann haben wir noch einen Steuerbus, der Steuersignale zwischen

01:05:01.800 --> 01:05:04.720
der CPU und anderen Funktionseinheiten vermittelt.

01:05:04.840 --> 01:05:11.400
Also so ein Bus kann eine etwas kompliziertere Struktur sein, um eben

01:05:11.400 --> 01:05:15.520
diese Komponenten in einer Rechnerarchitektur geeignet zu verbinden.

01:05:16.280 --> 01:05:20.000
Und jetzt kommen wir zu der Frage, wie wir eigentlich den Bus zuteilen

01:05:20.000 --> 01:05:22.200
können, also dieses Exclusive Write.

01:05:22.700 --> 01:05:24.020
Wie wird das eigentlich gemacht?

01:05:24.860 --> 01:05:26.720
Und dazu gibt es halt verschiedene Möglichkeiten.

01:05:27.480 --> 01:05:29.960
Sie haben die verschiedenen Komponenten hier in grün angegeben.

01:05:30.440 --> 01:05:34.420
Und es gibt in der Regel eine Steuer- oder Kontrolleinheit, die die

01:05:34.420 --> 01:05:35.760
Übertragung kontrolliert.

01:05:35.860 --> 01:05:39.280
Das ist eine Möglichkeit, zentral das zu machen.

01:05:40.300 --> 01:05:42.700
Eine andere Möglichkeit ist es, das dezentral zu machen.

01:05:44.720 --> 01:05:46.520
Wie funktioniert das?

01:05:46.620 --> 01:05:52.280
Bei der zentralen Buszuteilung würde jeder Teilnehmer eine eigene

01:05:52.280 --> 01:05:58.680
Meldeleitung erhalten und würde der zentralen Einheit melden, wenn er

01:05:58.680 --> 01:05:59.700
was schreiben will.

01:06:01.060 --> 01:06:01.780
Und bzw.

01:06:02.260 --> 01:06:05.380
die Bussteuereinheit könnte auch Teilnehmerwünsche abfragen.

01:06:05.540 --> 01:06:07.440
Das wäre ein besonderes Polling.

01:06:08.440 --> 01:06:12.400
Da würde dann abgefragt werden, ob jemand schreiben möchte.

01:06:13.320 --> 01:06:15.840
Oder man macht eine zyklische Buszuteilung.

01:06:16.500 --> 01:06:22.800
Jeder hat meinetwegen hier irgendeine Zeitscheibe und die dreht sich

01:06:22.800 --> 01:06:23.180
herum.

01:06:24.300 --> 01:06:30.740
Und jeder hat einen Sektor auf dieser Zeitscheibe, einen

01:06:30.740 --> 01:06:34.100
Zeitintervall, in dem er schreiben darf.

01:06:34.100 --> 01:06:37.820
Und dann bekommt jeder mal die Möglichkeit, etwas raufzuschreiben.

01:06:38.400 --> 01:06:43.100
Aber bis zum nächsten Mal muss man warten, bis man wieder dran ist.

01:06:44.180 --> 01:06:47.100
Und dezentral gibt es jetzt auch verschiedene Möglichkeiten.

01:06:48.020 --> 01:06:52.700
Da habe ich zum Beispiel eine gemeinsame Meldeleitung hier angegeben.

01:06:53.960 --> 01:06:56.960
Also in rot die Meldeleitung.

01:06:57.260 --> 01:06:59.720
Die schreiben alle darauf, dass sie schreiben wollen.

01:07:00.320 --> 01:07:02.060
Da können sie auch alle draufschreiben.

01:07:02.440 --> 01:07:04.900
Da habe ich also mehrere Schreibwünsche.

01:07:05.420 --> 01:07:08.560
Das kommt hier an als ein Wunsch zu schreiben.

01:07:10.220 --> 01:07:17.160
Und dann wird ein Verfügbarkeitssignal geschickt an den Ersten in

01:07:17.160 --> 01:07:18.280
dieser Reihe.

01:07:19.060 --> 01:07:21.800
Und wenn der nicht schreiben möchte, dann reicht er das weiter.

01:07:21.900 --> 01:07:23.680
Wenn der nicht schreiben möchte, dann reicht er das weiter.

01:07:24.060 --> 01:07:26.920
Wenn der schreiben möchte, dann schreibt er auf den Bus.

01:07:28.300 --> 01:07:32.760
Der Verschluckt also dann derjenige, der senden will, der verschluckt

01:07:32.760 --> 01:07:36.920
das Verfügbarkeitssignal, gibt am Ende ein Freigabesignal, dass der

01:07:36.920 --> 01:07:39.600
Bus wieder frei ist, und dann können wieder Schreibwünsche geäußert

01:07:39.600 --> 01:07:40.020
werden.

01:07:40.520 --> 01:07:41.660
Und entsprechend geht das wieder los.

01:07:42.140 --> 01:07:44.400
Und wieder möchte der was schreiben, und wieder möchte der was

01:07:44.400 --> 01:07:44.800
schreiben.

01:07:45.120 --> 01:07:47.620
Das heißt, der arme Kerl hier hinten, der bekommt nie das

01:07:47.620 --> 01:07:49.620
Verfügbarkeitssignal abgeliefert.

01:07:50.120 --> 01:07:50.980
Ist ein Nachteil.

01:07:51.620 --> 01:07:57.120
Nicht fair, der würde also keine Möglichkeit haben, etwas zu

01:07:57.120 --> 01:07:57.500
schreiben.

01:07:58.440 --> 01:07:59.440
Das ist nicht so gut.

01:08:00.160 --> 01:08:01.580
Deswegen gibt es noch andere Möglichkeiten.

01:08:02.480 --> 01:08:04.280
Man kann parallel abfragen.

01:08:05.100 --> 01:08:05.780
Wer möchte alles?

01:08:05.860 --> 01:08:08.660
Das ist so ähnlich wie bei dieser zentralen Einheit.

01:08:08.780 --> 01:08:10.320
Jeder hat eine eindeutige Priorität.

01:08:11.340 --> 01:08:14.020
Und der Sender höchster Priorität darf senden.

01:08:14.880 --> 01:08:17.980
Was Priorität ist, kann man festlegen.

01:08:17.980 --> 01:08:22.280
Das kann Wartezeit sein, kann eine andere Komponente sein, eine andere

01:08:22.280 --> 01:08:24.040
Information sein, die eine Rolle spielt.

01:08:24.700 --> 01:08:25.640
Das ist unterschiedlich.

01:08:26.760 --> 01:08:30.340
Und dann gibt es eine zyklische Buszuteilung, bei der das

01:08:30.340 --> 01:08:34.000
Berechtigungssignal durch die Sender hindurchläuft, ein sogenannter

01:08:34.000 --> 01:08:34.700
Token Ring.

01:08:35.560 --> 01:08:41.480
Token Ring ist eine klassische Architektur für lokale Netze, bei denen

01:08:41.480 --> 01:08:45.020
die Verbindungsleitung, die Kommunikationsleitung im Token Ring

01:08:45.020 --> 01:08:46.640
Verfahren weitergegeben wird.

01:08:46.640 --> 01:08:52.320
Das heißt, jeder bekommt hier bei so einem Ring ein, wo die alle

01:08:52.320 --> 01:08:53.080
dranhängen.

01:08:53.980 --> 01:08:56.220
Die wollen alle gerne schreiben.

01:08:56.940 --> 01:09:00.320
Und dann wird eben ein Token, irgendein Signal, wird hier

01:09:00.320 --> 01:09:01.480
weitergegeben.

01:09:01.580 --> 01:09:05.740
Wenn man diesen Token in der Hand hat, dann darf man schreiben.

01:09:06.260 --> 01:09:10.040
Nur einer hat diesen Token, deswegen haben Sie automatisch die

01:09:10.040 --> 01:09:14.140
Möglichkeit, während Sie den Token haben, zu schreiben.

01:09:14.140 --> 01:09:16.080
Danach geben Sie an den Nächsten weiter.

01:09:16.900 --> 01:09:18.840
Das heißt, das ist eine zyklische Zuteilung.

01:09:19.420 --> 01:09:22.320
Jeder, der schreiben will, schreibt, solange er den Token hat.

01:09:22.440 --> 01:09:23.440
Und danach gibt es weiter.

01:09:23.900 --> 01:09:25.480
Das heißt, jeder kommt irgendwann mal dran.

01:09:26.140 --> 01:09:29.940
Das, was wir vorher hatten, dieses Verhungern am Ende des Busses, das

01:09:29.940 --> 01:09:30.920
taucht hier nicht auf.

01:09:31.680 --> 01:09:34.980
Und dann gibt es ein Verfahren, das Sie eigentlich alle im Prinzip

01:09:34.980 --> 01:09:35.860
ständig nutzen.

01:09:36.420 --> 01:09:39.740
Das Verfahren, das dem Ethernet zugrunde liegt.

01:09:39.740 --> 01:09:43.480
Ein sogenanntes Carrier Sense Multiple Access.

01:09:44.280 --> 01:09:45.600
Da passiert Folgendes.

01:09:46.840 --> 01:09:49.000
Etwas, was Sie übrigens ständig sehen können.

01:09:49.400 --> 01:09:55.400
Wenn Sie die Ethernetleitung einstecken, also die Netzleitung

01:09:55.400 --> 01:09:59.440
einstecken in Ihren Rechner, dann sehen Sie ein grünes und ein gelbes,

01:09:59.820 --> 01:10:01.100
so einen gelben Punkt.

01:10:02.100 --> 01:10:05.300
Und das heißt, dadurch wird angedeutet, dass Sie mit dem Netz

01:10:05.300 --> 01:10:09.960
verbunden sind und dass ab und zu mal Probleme auftauchen.

01:10:11.260 --> 01:10:14.640
Und es ist so, dass ein sendewilliger Teilnehmer sendet, falls der Bus

01:10:14.640 --> 01:10:15.520
frei ist.

01:10:15.960 --> 01:10:19.500
Es kann natürlich sein, wenn Sie hier mehrere sendewillige Teilnehmer

01:10:19.500 --> 01:10:22.980
haben, dass die versuchen gleichzeitig zu schreiben.

01:10:24.420 --> 01:10:26.180
Wenn das passiert, gibt es eine Kollision.

01:10:27.260 --> 01:10:29.620
Und dann muss halt die Nachricht nochmal geschickt werden.

01:10:30.200 --> 01:10:32.500
Wenn die es jetzt beide genau gleichzeitig wieder machen würden, wäre

01:10:32.500 --> 01:10:33.000
das schlecht.

01:10:33.000 --> 01:10:36.900
Das heißt, die warten eine zufällige Zeit und schreiben dann wieder.

01:10:37.360 --> 01:10:39.800
Und dann hofft man, dass dann nicht wieder ein Konflikt auftaucht.

01:10:40.320 --> 01:10:43.000
Das ist also Carrier, Send, Multiple Access.

01:10:43.300 --> 01:10:46.840
Jeder darf jederzeit schreiben, aber wenn es einen Konflikt gibt

01:10:46.840 --> 01:10:52.460
dabei, dann wird das angezeigt, dann merkt man, da haben mehrere

01:10:52.460 --> 01:10:56.160
geschrieben, dann muss ich diesen Schreibwunsch wiederholen, warte

01:10:56.160 --> 01:10:59.560
einen Augenblick und dann hofft man, dass beim nächsten Mal nicht

01:10:59.560 --> 01:11:01.660
wieder zwei gleichzeitig schreiben wollen.

01:11:03.380 --> 01:11:07.880
Also, wenn Sie an einer langen Ethernet-Leitung viele Komponenten dran

01:11:07.880 --> 01:11:11.600
haben, ist die Wahrscheinlichkeit dafür, dass mehrere gleichzeitig

01:11:11.600 --> 01:11:12.760
schreiben, natürlich immer höher.

01:11:13.400 --> 01:11:16.300
Das heißt, Sie bekommen dann häufiger Schwierigkeiten mit der

01:11:16.300 --> 01:11:17.020
Übertragung.

01:11:17.620 --> 01:11:20.800
Also die Kollisionserkennung und Behandlung ist hier ganz wichtig,

01:11:21.520 --> 01:11:24.280
sorgt dafür, dass Sie durchaus mit einer hohen Geschwindigkeit

01:11:24.280 --> 01:11:25.000
schreiben können.

01:11:25.760 --> 01:11:30.040
Aber man muss eben die Kollision erkennen, weil man hier einen

01:11:30.040 --> 01:11:32.980
mehrfachen Zugriff erlaubt.

01:11:33.300 --> 01:11:40.080
Das ist so dieses... Carrier, Send heißt halt, der Träger erkennt, ob

01:11:40.080 --> 01:11:43.060
dort mehrere gleichzeitig schreiben wollen oder nicht.

01:11:43.180 --> 01:11:47.060
Oder Sie bekommen Informationen, ob der Bus gerade frei ist.

01:11:47.120 --> 01:11:51.020
Wenn mehrere sehen, der ist frei, dann schreiben Sie halt drauf,

01:11:51.400 --> 01:11:52.000
eventuell.

01:11:52.780 --> 01:11:54.320
Dann kann es eine Kollision geben.

01:11:55.000 --> 01:11:57.060
Dann gibt es ganz andere Technologien.

01:11:57.640 --> 01:12:00.240
Sie können einen optischen Bus haben.

01:12:00.780 --> 01:12:03.860
Ein optischer Bus hat einen großen Vorteil.

01:12:04.740 --> 01:12:08.980
Da haben Sie erstmal sehr schnell und wenn Sie hier Informationen

01:12:08.980 --> 01:12:12.660
reingeben, dann geht die in einer bestimmten Richtung über den Bus.

01:12:13.400 --> 01:12:19.680
Bei einem Draht, den Sie auf ein Potenzial heben, auf 0 oder 1, da

01:12:19.680 --> 01:12:23.660
haben Sie auf dem gesamten Draht, auf der gesamten elektrischen

01:12:23.660 --> 01:12:27.480
Leitung, das gleiche Potenzial, mehr oder weniger.

01:12:28.600 --> 01:12:30.740
Diese Information verbreitet sich über den gesamten Bus.

01:12:31.920 --> 01:12:37.100
Bei einem optischen Bus wird eine Information über den Bus in eine

01:12:37.100 --> 01:12:38.320
gewisse Richtung geschickt.

01:12:38.320 --> 01:12:42.360
Das heißt, der Nächste kann dann hier etwas abgreifen.

01:12:43.100 --> 01:12:46.700
Und es kann auch sein, dass mehrere Informationen gleichzeitig oder

01:12:46.700 --> 01:12:50.500
nebenläufig über diesen Bus laufen, weil sie nacheinander

01:12:50.500 --> 01:12:51.380
raufgeschickt werden.

01:12:51.420 --> 01:12:55.340
Das heißt, Sie können hier in so einer Art Pipelining auf dem Bus

01:12:55.340 --> 01:12:56.340
Informationen schicken.

01:12:56.480 --> 01:12:58.080
Sie können mehrere Daten nacheinander schicken.

01:12:58.780 --> 01:13:01.440
Sie haben also diese Pipelining-Möglichkeit.

01:13:02.720 --> 01:13:07.140
Aber, wenn der hier etwas rausschickt und es soll hier hinkommen, dann

01:13:07.140 --> 01:13:11.200
brauchen Sie halt einen Ring, damit das hier dann tatsächlich gelesen

01:13:11.200 --> 01:13:11.900
werden kann.

01:13:12.520 --> 01:13:16.380
Das ist wieder ein Nachteil, aber dafür gibt es auch sehr viele

01:13:16.380 --> 01:13:22.640
unterschiedliche optische Kommunikationsarchitekturen, um über diese

01:13:22.640 --> 01:13:27.100
optischen Möglichkeiten besser zu kommunizieren als mit elektrischen

01:13:27.100 --> 01:13:27.380
Bussen.

01:13:28.340 --> 01:13:32.000
Es ist also nicht einfach nur die Möglichkeit, über einen Bus zu

01:13:32.000 --> 01:13:32.620
kommunizieren.

01:13:32.680 --> 01:13:33.840
Da kann man noch sehr viel mehr machen.

01:13:34.220 --> 01:13:36.200
Sehr interessante Kommunikationstechnologie.

01:13:37.140 --> 01:13:40.340
Sie müssen dann aber die Informationen erstmal von den elektrischen

01:13:40.340 --> 01:13:43.720
Informationen in optische Informationen umwandeln.

01:13:44.280 --> 01:13:45.300
Das dauert lange.

01:13:46.260 --> 01:13:50.300
Das heißt, es lohnt sich nur, wenn Sie dann eben wirklich das wieder

01:13:50.300 --> 01:13:53.920
kompensieren können, durch die höhere Geschwindigkeit der Übertragung.

01:13:54.880 --> 01:13:55.200
Okay.

01:13:56.640 --> 01:14:00.440
Und damit sind wir schon durch diese ersten Teile hier durch.

01:14:01.280 --> 01:14:04.540
Das war also die grundlegende Vorstellung des von-Neumann-Rechners.

01:14:05.220 --> 01:14:09.500
Und jetzt muss man doch mal sehen, dass wir es hier mit einem starken

01:14:09.500 --> 01:14:10.680
Engpass zu tun haben.

01:14:12.020 --> 01:14:16.080
Ich habe Ihnen schon gesagt und dargestellt, bei jeder Ausführung

01:14:16.080 --> 01:14:20.980
eines Befehls, also der Befehl kommt aus dem Speicher, müssen

01:14:20.980 --> 01:14:27.460
Informationen zwischen CPU und Speicher hin- und hergeschoben werden.

01:14:27.860 --> 01:14:32.200
Wir haben also hier einen Engpass, weil wir mehrfach hier hin- und

01:14:32.200 --> 01:14:33.000
herlaufen müssen.

01:14:34.780 --> 01:14:37.740
Und das ist der sogenannte physikalische von-Neumann-Engpass.

01:14:38.960 --> 01:14:43.620
Jetzt wissen Sie, alles was gemacht wird, wird im Rechner so

01:14:43.620 --> 01:14:44.300
ausgeführt.

01:14:44.300 --> 01:14:47.940
Wenn Sie also jetzt ein Programm entwerfen, dann haben Sie im Kopf

01:14:47.940 --> 01:14:50.640
drin, alles was wir tun, ist ein sequenzieller Prozess.

01:14:51.600 --> 01:14:55.180
Also werde ich meine Programme so schreiben, dass dieser sequenzielle

01:14:55.180 --> 01:14:57.040
Prozess bestmöglich abläuft.

01:14:58.380 --> 01:15:01.180
Nun habe ich Ihnen aber gesagt, in den Rechnern heutzutage gibt es

01:15:01.180 --> 01:15:03.820
nicht nur eine CPU, sondern eine ganze Reihe.

01:15:04.480 --> 01:15:09.320
Es gibt nicht nur einen Speicher, es gibt mehrere Funktionseinheiten,

01:15:10.040 --> 01:15:12.320
da kann also einiges auch parallel ausgeführt werden.

01:15:12.320 --> 01:15:16.060
Und auch die Reihenfolge der Befehle ausgeführt werden müssen, ist ja

01:15:16.060 --> 01:15:17.160
vielleicht gar nicht so wichtig.

01:15:18.480 --> 01:15:21.840
Wir hatten gesagt, im Prinzip könnten bestimmte Operationen auch in

01:15:21.840 --> 01:15:25.060
der Reihenfolge verändert werden, kann bei den Gleitpunkt-Operationen

01:15:25.060 --> 01:15:26.980
Probleme machen, aber normalerweise geht das.

01:15:28.160 --> 01:15:34.240
Und das heißt, wenn wir im Kopf die Sequenzialisierung haben, dann

01:15:34.240 --> 01:15:37.460
produzieren wir einen weiteren Engpass in unserem Kopf oder beim

01:15:37.460 --> 01:15:38.900
Entwerfen eines Programms.

01:15:38.900 --> 01:15:42.740
Und das ist das, was man den Intellektuellen von Norman Engpass nennt.

01:15:43.340 --> 01:15:48.680
Wenn wir also in einem Programm zu viel festlegen, wie etwas geschehen

01:15:48.680 --> 01:15:53.480
soll, dann reduzieren wir die Möglichkeiten des Betriebssystems, also

01:15:53.480 --> 01:15:58.000
der Rechnerarchitektur, ein Programm schneller auszuführen, als wir

01:15:58.000 --> 01:16:00.080
das in unserem Kopf haben vorstellen können.

01:16:01.360 --> 01:16:04.620
Und deswegen ist es eben wichtig, dass man im Programm nicht streng

01:16:04.620 --> 01:16:05.660
sequenzialisiert.

01:16:06.280 --> 01:16:09.680
Deswegen haben wir objektorientierte Sprachen oder auch funktionale

01:16:09.680 --> 01:16:13.940
Programmiersprachen, in denen man sagt, was gemacht werden soll, aber

01:16:13.940 --> 01:16:15.480
nicht, wie es gemacht werden soll.

01:16:15.580 --> 01:16:18.760
Wenn Sie in ein Restaurant gehen, sagen Sie auch nicht, wie ein

01:16:18.760 --> 01:16:22.100
Gericht hergestellt werden soll, sondern Sie sagen, was Sie gerne

01:16:22.100 --> 01:16:22.660
essen wollen.

01:16:23.660 --> 01:16:25.240
Und der Koch weiß, wie man das macht.

01:16:25.660 --> 01:16:28.340
Wenn Sie dem genau vorschreiben, wie er es zu tun hat, ist er

01:16:28.340 --> 01:16:29.120
sicherlich unglücklich.

01:16:29.820 --> 01:16:33.500
Also, der Intellektuelle von Norman Engpass, der sollte uns möglichst

01:16:33.500 --> 01:16:36.620
nicht stören in dem Entwurf von Programmen.

01:16:37.100 --> 01:16:45.600
Dafür haben wir dann zum Beispiel die objektorientierten oder die

01:16:45.600 --> 01:16:53.240
funktionalen Programmiersprachen.

01:16:55.580 --> 01:16:58.420
Haben Sie eigentlich festgestellt, dass ich heute an keiner einzigen

01:16:58.420 --> 01:17:00.260
Stelle diesen senkrechten Strich hatte?

01:17:01.000 --> 01:17:03.820
Etwas, was mich immer gestört hat, ich habe einen neuen Rechner.

01:17:04.600 --> 01:17:07.240
Der hat anscheinend auch einen neuen Stift und verbesserte Software.

01:17:07.780 --> 01:17:10.520
Also es gibt doch manchmal Verbesserungen bei den Rechnern, die man

01:17:10.520 --> 01:17:11.220
sich neu kauft.

01:17:13.940 --> 01:17:17.400
Also objektorientierte und funktionale Programmiersprachen, die

01:17:17.400 --> 01:17:23.820
erlauben es, etwas zu schreiben, was getan werden soll und nicht so

01:17:23.820 --> 01:17:25.540
sehr, wie es getan werden soll.

01:17:25.980 --> 01:17:29.180
Manchmal wollen wir auch genau sagen können, wie es getan wird.

01:17:29.560 --> 01:17:31.720
Genauso wie ich Ihnen sagte, bei der Hardware wollen wir manchmal

01:17:31.720 --> 01:17:35.560
genau sagen, wie Komponenten nebeneinander liegen sollen, damit wir

01:17:35.560 --> 01:17:37.940
Kontrolle haben über die Datenlaufzeit.

01:17:38.620 --> 01:17:41.720
Aber häufig ist uns das egal und es kommt uns nur darauf an, dass

01:17:41.720 --> 01:17:42.700
etwas getan wird.

01:17:44.240 --> 01:17:48.300
Und jetzt gibt es eine ganze Reihe von Möglichkeiten, den von Neumann

01:17:48.300 --> 01:17:52.780
-Engpass zu vermeiden, indem man bereits auf Hardware-Ebene

01:17:52.780 --> 01:17:54.840
Datenstrukturen zulässt.

01:17:55.220 --> 01:17:59.400
Also zum Beispiel Felder oder Listen oder Bäume.

01:17:59.400 --> 01:18:02.820
Also ich kann meinetwegen hier irgendein Feld haben und ich kann

01:18:02.820 --> 01:18:06.260
sagen, das ist eine Datenstruktur und da sind die einzelnen

01:18:06.260 --> 01:18:10.040
Komponenten direkt zugreifbar und das ist eine Einheit.

01:18:10.820 --> 01:18:15.540
Das ist nicht ein 32-Bit-Wort, sondern irgendeine größere Einheit, ein

01:18:15.540 --> 01:18:18.440
Array oder ein Vektor entsprechend angegeben.

01:18:18.440 --> 01:18:21.560
Oder ich habe eine Liste und da habe ich meinetwegen immer

01:18:21.560 --> 01:18:26.540
Verknüpfungen von einem zum nächsten Element und so weiter.

01:18:27.660 --> 01:18:32.040
Eine sequenziell durchlaufende Liste oder ich habe eine Baumstruktur

01:18:32.040 --> 01:18:39.580
und das sollte möglichst als eine Einheit im Rechner adressierbar

01:18:39.580 --> 01:18:41.900
sein, Hardware-mäßig adressierbar sein.

01:18:42.400 --> 01:18:45.840
Das ist bei Bäumen schon schwierig, bei Arrays und bei Listen durchaus

01:18:45.840 --> 01:18:47.000
machbar.

01:18:47.780 --> 01:18:52.820
Das heißt im von Neumann Rechner habe ich diese Strukturen, Quatsch,

01:18:52.880 --> 01:18:54.940
in höheren Programmiersprachen habe ich diese Strukturen.

01:18:55.440 --> 01:19:00.140
Beim von Neumann Rechner wird das alles abgebildet auf eine Folge von

01:19:00.140 --> 01:19:01.860
Informationen im Speicher.

01:19:02.420 --> 01:19:06.420
Und das muss man vermeiden, indem man eben diese semantische Kluft

01:19:06.420 --> 01:19:06.900
vermeidet.

01:19:06.980 --> 01:19:11.920
Ich möchte gerne Hardware haben, die auch größere oder komplexere

01:19:11.920 --> 01:19:14.720
Objekte direkt übernehmen kann.

01:19:15.740 --> 01:19:20.600
Sie wissen, wenn Sie in Java etwas schreiben oder ein Objekt haben,

01:19:20.740 --> 01:19:25.000
das wollen Sie weitergeben, dann wird es zur Übertragung serialisiert.

01:19:25.660 --> 01:19:28.560
Die ganze Struktur geht dann verloren, Sie haben eine Folge von

01:19:28.560 --> 01:19:32.000
Informationen und der Empfänger muss daraus wieder das Objekt

01:19:32.000 --> 01:19:32.800
konstruieren.

01:19:33.800 --> 01:19:37.120
Das ist sowas ähnliches, dass Sie da also die Struktur erst mal

01:19:37.120 --> 01:19:41.180
vergessen auflösen müssen, um eine sequenzielle Übertragung zu

01:19:41.180 --> 01:19:41.720
ermöglichen.

01:19:42.900 --> 01:19:44.660
Also, das ist die Alternative.

01:19:45.360 --> 01:19:50.380
Wir haben eine Typerkennung auf Hardware-Ebene und können dann auf

01:19:50.380 --> 01:19:53.220
Komponenten direkt zugreifen.

01:19:54.460 --> 01:19:59.100
Und das geht zum Beispiel für ganze Zahlen, Gleitpunktzahlen, komplexe

01:19:59.100 --> 01:19:59.460
Zahlen.

01:19:59.820 --> 01:20:03.240
Komplexe Zahlen bestehen ja aus zwei Gleitpunktzahlen, also aus zwei

01:20:03.240 --> 01:20:04.560
reellen Zahlen.

01:20:04.560 --> 01:20:09.720
Wenn Sie die als vierfache Genauigkeit haben, dann haben Sie also bei

01:20:09.720 --> 01:20:16.500
einer komplexen Zahl acht mal 32 Bit, um eine komplexe Zahl

01:20:16.500 --> 01:20:17.220
darzustellen.

01:20:18.320 --> 01:20:21.420
Das sind schon relativ große Speicherinhalte.

01:20:21.540 --> 01:20:26.520
Oder Sie geben ganze Vektoren oder Matrizen als Objekte an, können Sie

01:20:26.520 --> 01:20:29.800
in Programmiersprachen zum Teil direkt so verwenden.

01:20:29.800 --> 01:20:35.240
Oder Sie haben verkettete Listen, Schlange, Keller, irgendeine Datei

01:20:35.240 --> 01:20:36.300
oder irgendein Objekt.

01:20:36.380 --> 01:20:39.880
Das wird natürlich immer schwieriger, das direkt auf Hardware-Ebene zu

01:20:39.880 --> 01:20:40.540
unterscheiden.

01:20:41.040 --> 01:20:42.860
Da wird die Hardware etwas komplizierter.

01:20:44.020 --> 01:20:49.020
Und wenn ich einen Vektor habe, Vektordatentyp, dann habe ich also zum

01:20:49.020 --> 01:20:53.480
Beispiel hier einen Vektor, das sind die Komponenten eines Vektors.

01:20:54.820 --> 01:21:00.800
Und der hat eine Basisadresse, dann habe ich die Anzahl der Elemente

01:21:00.800 --> 01:21:05.440
in meinem Vektor und ich muss sagen, was habe ich hier für einen

01:21:05.440 --> 01:21:06.400
Datentyp drin stehen.

01:21:07.480 --> 01:21:12.760
Und jetzt will ich gerne auf den Vektor zugreifen.

01:21:13.420 --> 01:21:17.020
Dann brauche ich nur anzugeben, das ist ein Vektor, das steht an der

01:21:17.020 --> 01:21:21.560
Stelle B und hat A Elemente, Datentyp D.

01:21:22.040 --> 01:21:24.300
Dann kann ich damit auf alle diese Elemente zugreifen.

01:21:24.300 --> 01:21:30.020
Und wenn ich jetzt zum Beispiel zwei solche Vektoren habe, dann kann

01:21:30.020 --> 01:21:36.960
ich die schicken zu einer Einheit, die meinetwegen die beiden addiert.

01:21:37.680 --> 01:21:43.880
Und wenn ich also weiß, ich habe Vektoren, dann kann ich also

01:21:43.880 --> 01:21:49.860
einerseits den Vektor insgesamt übertragen und ich kann anschließend

01:21:49.860 --> 01:21:54.600
Vektor -Operationen ausführen, indem ich im Pipelining-Verfahren diese

01:21:54.600 --> 01:21:57.260
ganzen Additionen mache, wenn das reelle Zahlen sind.

01:21:57.360 --> 01:22:01.620
Wir wissen, eine reelle Zahl, wenn die addiert wird, dauert das etwas

01:22:01.620 --> 01:22:02.000
länger.

01:22:02.780 --> 01:22:07.420
Dazu habe ich dann hier eine Gleitpunkteinheit, die im Pipelining

01:22:07.420 --> 01:22:10.280
-Verfahren die Addition schnell macht.

01:22:10.400 --> 01:22:13.320
Das heißt, die kann in jedem Takt eine neue Zahl dort einlesen,

01:22:13.660 --> 01:22:17.160
braucht eine ganze Zeit, um dann die Addition durchzuführen.

01:22:17.160 --> 01:22:21.320
Aber hier unten kommen dann in genau dem gleichen Takt die Ergebnisse

01:22:21.320 --> 01:22:22.540
entsprechend raus.

01:22:22.700 --> 01:22:26.060
Also zwei Vektoren zu addieren mit einer geeigneten Vektor

01:22:26.060 --> 01:22:28.280
-Recheneinheit geht sehr schnell.

01:22:29.140 --> 01:22:33.140
Genauso schnell, als wenn Sie zwei Zahlen einzeln addieren bzw.

01:22:33.480 --> 01:22:36.100
mit der einzelnen Werte kommen, ganz schnell dort raus.

01:22:36.960 --> 01:22:39.660
Das wird in Vektorrechnern verwendet, das ist also das Geheimnis

01:22:39.660 --> 01:22:43.520
hinter Vektorrechnern, dass dort die Daten als Vektoren abgelegt sind

01:22:43.520 --> 01:22:46.780
und dass häufig solche Vektor-Operationen in technisch

01:22:46.780 --> 01:22:48.360
-wissenschaftlichen Anwendungen vorkommen.

01:22:48.920 --> 01:22:52.460
Und deswegen sind Vektorrechner so die ersten Superrechner gewesen,

01:22:52.600 --> 01:22:54.680
die schnell sein konnten.

01:22:55.440 --> 01:23:00.520
Dann gibt es die Möglichkeit, assoziativ zuzugreifen auf Daten.

01:23:01.280 --> 01:23:05.200
Völlig anderes Konzept des Zugriffs auf Daten.

01:23:05.200 --> 01:23:06.900
Was passiert hier?

01:23:07.680 --> 01:23:12.880
Wir haben unseren Speicher, der hat N Speicherzellen.

01:23:14.120 --> 01:23:19.260
Und jetzt sagen wir, wir suchen nach irgendeiner Bit-Kombination.

01:23:20.560 --> 01:23:23.860
Da steht das Werte drin im Suchregister und wir maskieren bestimmte

01:23:23.860 --> 01:23:24.920
Werte dort hinaus.

01:23:25.100 --> 01:23:29.200
Also wir sagen, das was im Suchregister steht an den letzten drei

01:23:29.200 --> 01:23:32.580
Positionen ist das, wonach ich suche.

01:23:32.580 --> 01:23:36.560
Und diese Information wird jetzt verknüpft mit allen Speicherzellen

01:23:36.560 --> 01:23:37.380
gleichzeitig.

01:23:38.300 --> 01:23:42.020
Und dann sehe ich also, aha, hier habe ich einen Treffer und

01:23:42.020 --> 01:23:44.480
vielleicht noch mehr, aber da habe ich einen Treffer und da unten habe

01:23:44.480 --> 01:23:45.180
ich auch einen Treffer.

01:23:45.820 --> 01:23:49.780
Und dann steht in dem Vergleichsindikator anschließend, hier oben eine

01:23:49.780 --> 01:23:52.800
1, da steht eine 1, da steht eine 1.

01:23:52.800 --> 01:23:59.520
Und ich habe mit einem Schritt, mit einem assoziativen Vergleich alle

01:23:59.520 --> 01:24:04.520
Speicherelemente verglichen mit diesen drei Bits und festgestellt, an

01:24:04.520 --> 01:24:08.360
welchen Stellen jetzt diese drei Bits einen Treffer hatten.

01:24:09.240 --> 01:24:12.040
Und dann kann ich damit weitermachen, kann Operationen darauf

01:24:12.040 --> 01:24:13.100
ausführen und ähnliches.

01:24:14.100 --> 01:24:16.920
Das kann man sogar so weit führen, dass man sagt, ich führe

01:24:16.920 --> 01:24:22.240
Operationen an allen Stellen aus im Speicher direkt, in denen

01:24:22.240 --> 01:24:24.160
bestimmte Daten drinstehen.

01:24:24.960 --> 01:24:28.880
Ich kann also assoziativ rechnen, das heißt, ich adressiere

01:24:28.880 --> 01:24:35.640
Speicherzellen nicht über die Adresse, sondern über ihren Inhalt.

01:24:36.680 --> 01:24:40.960
Das ist der wesentliche Punkt, ich habe mir den Inhalt angeschaut und

01:24:40.960 --> 01:24:45.940
ich habe also diese drei Speicherzellen gleichzeitig adressiert über

01:24:45.940 --> 01:24:48.200
den Inhalt, der in ihnen gespeichert ist.

01:24:48.660 --> 01:24:52.480
Und ich adressiere den Inhalt nicht über eine Adresse, sondern über

01:24:52.480 --> 01:24:53.420
den Inhalt.

01:24:54.420 --> 01:24:58.100
Damit kann ich also deutlich mehr machen, offensichtlich habe ich hier

01:24:58.100 --> 01:25:02.920
aber auch einen deutlich höheren Aufwand, um einen solchen

01:25:02.920 --> 01:25:04.860
assoziativen Speicher zu realisieren.

01:25:04.860 --> 01:25:10.780
Die sind durchaus verfügbar, zum Teil als direkte Hardware oder in

01:25:10.780 --> 01:25:13.460
logischer Form, werden dann irgendwie so umgesetzt.

01:25:14.160 --> 01:25:20.360
Also man kann das machen, man kann also Suchvorgänge so ausführen und

01:25:20.360 --> 01:25:22.340
sie brauchen dafür diese komplexe Logik.

01:25:23.320 --> 01:25:27.180
Man kann auch einen ganzen Rechner auf die Art und Weise aufbauen, ist

01:25:27.180 --> 01:25:32.400
auch mal gemacht worden, sogar von einem früheren Mitarbeiter von mir.

01:25:32.920 --> 01:25:36.400
Sie können auch neuronale Netze, wir reden heute über Deep Learning,

01:25:37.140 --> 01:25:40.340
Sie können auch neuronale Netze als eine Art assoziative Speicher

01:25:40.340 --> 01:25:44.760
auffassen, weil Sie dort Informationen reingeben und dann über das,

01:25:44.860 --> 01:25:50.180
was in Ihrem neuronalen Netz gespeichert ist, bestimmte Informationen

01:25:50.180 --> 01:25:52.480
ansprechen und dann Ergebnisse rausbekommen.

01:25:52.480 --> 01:25:58.380
Da müssen Sie nicht Punkte adressieren in Ihrem neuronalen Netz,

01:25:58.680 --> 01:26:02.120
sondern Sie geben die Informationen hinein und es werden die

01:26:02.120 --> 01:26:06.180
entsprechenden Stellen im neuronalen Netz aktiviert, die Ihnen die

01:26:06.180 --> 01:26:08.320
Ausgabe am Ende liefern.

01:26:08.320 --> 01:26:14.180
Das ist also Assoziativ-Speicher und dann sind eben Cache-Speicher,

01:26:14.400 --> 01:26:17.500
auf die wir nächstes Mal noch genauer eingehen werden, noch weitere

01:26:17.500 --> 01:26:24.300
Assoziativ -Vorgänge, Speicher-Zugriffsstrukturen realisiert.

01:26:24.520 --> 01:26:28.100
Das werde ich Ihnen nächstes Mal dann vorstellen, wenn wir uns dann

01:26:28.100 --> 01:26:31.560
mit der Speicherhierarchien oder Speicherstrukturen beschäftigen.

01:26:32.060 --> 01:26:34.680
Nächstes Mal werden wir uns zunächst anschauen, Konzepte der

01:26:34.680 --> 01:26:35.580
Parallelverarbeitung.

01:26:35.580 --> 01:26:38.020
Ich danke Ihnen für die Aufmerksamkeit, das war's für heute.

