100 Übungsaufgaben zu Grundlagen der Informatik: Band II: Technische Informatik 9783486781304, 9783486756968

Die optimale Prüfungsvorbereitung anhand 100 Aufgaben zur Technischen Informatik mit ausführlicher Lösung. Zu jedem Kapi

327 61 1MB

German Pages 218 [219] Year 2013

Report DMCA / Copyright

DOWNLOAD FILE

Polecaj historie

100 Übungsaufgaben zu Grundlagen der Informatik: Band II: Technische Informatik
 9783486781304, 9783486756968

Table of contents :
Vorwort
1 Schaltnetze und Schaltwerke
2 Complementary Metal Oxide Semiconductor (CMOS)
3 Binary Decision Diagram
4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung
5 Darstellungen von Ziffern und Zahlen
6 Rechnerarchitektur, Speicherorganisation und Internettechnologie
7 Programmierung
8 Betriebssysteme
9 Dateiorganisation
Lösungen
A Mathematische Grundlagen
Literaturverzeichnis

Citation preview

100 Übungsaufgaben zu Grundlagen der Informatik Band II: Technische Informatik von

Lukas König

Karlsruher Institut für Technologie (KIT)

Friederike Pfeiffer-Bohnen

Karlsruher Institut für Technologie (KIT)

Prof. Dr. Hartmut Schmeck

Karlsruher Institut für Technologie (KIT)

Oldenbourg Verlag München

Lektorat: Johannes Breimeier Herstellung: Tina Bonertz Grafik: Irina Apetrei Einbandgestaltung: hauser lacour Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.dnb.de abrufbar. Library of Congress Cataloging-in-Publication Data A CIP catalog record for this book has been applied for at the Library of Congress. Dieses Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere die der Übersetzung, des Nachdrucks, des Vortrags, der Entnahme von Abbildungen und Tabellen, der Funksendung, der Mikroverfilmung oder der Vervielfältigung auf anderen Wegen und der Speicherung in Datenverarbeitungsanlagen, bleiben, auch bei nur auszugsweiser Verwertung, vorbehalten. Eine Vervielfältigung dieses Werkes oder von Teilen dieses Werkes ist auch im Einzelfall nur in den Grenzen der gesetzlichen Bestimmungen des Urheberrechtsgesetzes in der jeweils geltenden Fassung zulässig. Sie ist grundsätzlich vergütungspflichtig. Zuwiderhandlungen unterliegen den Strafbestimmungen des Urheberrechts. © 2014 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 143, 81671 München, Deutschland www.degruyter.com/oldenbourg Ein Unternehmen von De Gruyter Gedruckt in Deutschland Dieses Papier ist alterungsbeständig nach DIN/ISO 9706.

ISBN 978-3-486-75696-8 eISBN 978-3-486-78130-4

Inhaltsverzeichnis Vorwort

VII

1

Schaltnetze und Schaltwerke

2

Complementary Metal Oxide Semiconductor (CMOS)

11

3

Binary Decision Diagram

21

4

Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

29

5

Darstellungen von Ziffern und Zahlen

45

6

Rechnerarchitektur, Speicherorganisation und Internettechnologie

57

7

Programmierung

81

8

Betriebssysteme

95

9

Dateiorganisation

105

Lösungen A

1

115 Mathematische Grundlagen

Literaturverzeichnis

201 209

Vorwort Diese Aufgabensammlung in zwei Bänden über die Grundlagen der Informatik ist als Übungsbuch und Nachschlagewerk für Studierende der Informatik und verwandter Studiengänge konzipiert. Sie kann zur Prüfungsvorbereitung, vorlesungsbegleitend oder zur Wissensauffrischung genutzt werden. Der vorliegende zweite Band behandelt die Grundlagen der Technischen Informatik. Dazu gehören die Themen Rechnerarchitektur, Speicherorganisation, CMOS, Schaltnetze, Schaltwerke, Dateiorganisation, Betriebssysteme, Kodierung, Zahlendarstellung, Fehlererkennung und -korrektur, Verschlüsselung, Programmierung und Internettechnologie. Entstehung Die Aufgabensammlung ist in den Jahren 2009 bis 2013 im Rahmen der Vorlesung „Grundlagen der Informatik II“ entstanden, die als Grundlagenvorlesung für die Studiengänge Wirtschaftsingenieurwesen, Technische Volkswirtschaftslehre und Wirtschaftsmathematik am Karlsruher Institut für Technologie (KIT) üblicherweise für das dritte Semester angeboten wird. Dabei wurde dem Wunsch der Studierenden nach einer größeren Aufgabenfülle zur Prüfungsvorbereitung und nach Aufgaben, die den Stoff in verständlicher und intuitiver Weise veranschaulichen, nachgegangen. Es ist jedoch schwierig, gerade Anfängern eine intuitive Veranschaulichung der sehr formalen Inhalte zu ermöglichen, die erst über mehrere Ecken ihren praktischen Nutzen entfalten. Oft entsteht eine Kluft zwischen den Dozenten, die eine korrekte, in das Gesamtbild passende Sicht vermitteln wollen, und den Studierenden, denen dieses Gesamtbild zu Beginn noch nicht verständlich ist und für die eine schrittweise Heranführung, möglicherweise über Umwege, hilfreicher wäre. Um diesem Problem zu begegnen, wurden die Ideen für die Mehrzahl der Aufgaben und deren Lösungen nicht von Dozenten geliefert, sondern von Tutoren, also von studentischen Hilfskräften, die zur Unterstützung des Übungsbetriebs eingesetzt werden. Diese sind hauptsächlich Studierende, welche selbst die Vorlesung im Vorsemester gehört haben. So entstanden Aufgaben, die sich aus Studierendensicht mit den essentiellen Verständnisproblemen der jeweiligen Inhalte beschäftigen und auch in Studierendensprache die Lösung dieser Probleme darstellen. Die Aufgaben wurden teilweise in den vergangenen zwei Vorlesungszyklen den Studierenden zur Prüfungsvorbereitung angeboten und stießen dabei auf sehr gute Resonanz. Natürlich entziehen sich die Autoren dennoch nicht der Verantwortung, ausgewogene, hochwertige und fehlerfreie Aufgaben in diesem Buch zur Verfügung zu stellen. Die Aufgaben, die jetzt den Hauptteil dieser Aufgabensammlung bilden, wurden aus einem noch größeren Pool studentischer Aufgaben ausgewählt, sie wurden einzeln mehrfach überarbeitet, korrigiert, ergänzt und in ein einheitliches Format gebracht. Struktur Jeder Band der Aufgabensammlung ist in zwei Hauptteile gegliedert, von denen der erste eine Zusammenfassung der theoretischen Grundlagen und die Aufgabenstellungen enthält und der zweite Lösungen zu den Aufgaben. Der erste Hauptteil ist inhaltlich nach Kapiteln gegliedert,

VIII

Vorwort

die jeweils mit einer Einführung in das Thema und einer Erläuterung aller für das Lösen der Aufgaben nötigen Voraussetzungen beginnen. In diesem Rahmen wurde auch versucht, auf typische Probleme und Missverständnisse einzugehen, die Studierende erfahrungsgemäß häufig mit den jeweiligen Inhalten haben. Im Anschluss an die Einführung folgt in jedem Kapitel der Aufgabenteil, der Aufgabenstellungen unterschiedlicher Schwierigkeitsgrade enthält. Die Schwierigkeit einer Aufgabe wird zu deren Beginn durch die Symbole  leicht,  mittel oder 



schwer 

gekennzeichnet. Einige wenige Aufgaben sind durch das Symbol  als sehr schwer bezeichnet; die Lösung dieser Aufgaben kann unter Umständen sehr viel Zeit beanspruchen und sollte nicht unterschätzt werden. Zu jeder Aufgabe gibt es im zweiten Hauptteil einen Lösungsvorschlag mit ausführlichen Erklärungen und Rechenwegen. Allgemeine Grundlagen werden ganz am Ende jedes Bandes im Anhang behandelt. Vorlesungsaufzeichnungen Die Vorlesung „Grundlagen der Informatik II“, auf deren Inhalten die Aufgabensammlung beruht, wird seit Jahren aufgezeichnet, und die Videos sind für den öffentlichen Zugriff freigeschaltet. Im Rahmen der Arbeit an diesem Buch wurden die Videos neu zusammengeschnitten, sodass sie thematisch zu den Kapiteln passen. Am Ende der Einführung jedes Kapitels ist ein Link abgedruckt, unter dem man zu dem entsprechenden Thema das Vorlesungsvideo abrufen kann. Das Video kann sowohl im Browser angesehen als auch im AVI-Format heruntergeladen werden. Diskussionsforum Im Rahmen der Forschung im Bereich der Verbesserung der Lehre in universitären Großveranstaltungen wurde in den Vorlesungszyklen der Wintersemester 2011/12 und 2012/13 der Vorlesung „Grundlagen der Informatik II“ ein Konzept entwickelt, das die Diskussion von Lösungen und Problemen einzelner Aufgaben zwischen Studierenden und Dozenten ermöglicht [Pfe+12]. Im Zentrum steht ein Forum, das für jede Aufgabe einen Thread enthält, in dem die Aufgabe diskutiert werden kann. Dieses Forum wird für die Buchversion der Aufgabensammlung fortgeführt und kann unter der folgenden Adresse abgerufen werden: http://www.dasinfobuch.de/links/Forum.html

Um eine bestimmte Aufgabe im Forum wiederzufinden, ist jeder Aufgabe eine fünfstellige ID vorangestellt, beispielsweise „END-AA“. Die Threads des Forums sind mit genau diesen IDs

Vorwort

IX

betitelt, die Diskussion zur Aufgabe END-AA findet also im Thread END-AA des Forums statt. Im Forum können die in der Vergangenheit bereits in über 2000 Beiträgen diskutierten Themen eingesehen oder neue eigene Beiträge verfasst werden. Selbstverständlich werden auch zukünftig die Dozenten im Forum weiter mitdiskutieren und die Probleme und Lösungen kommentieren. Zusammen mit Vorlesungsaufzeichnungen und Diskussionsforum stellt diese Aufgabensammlung ein interaktives Gesamtkonzept dar, mit dem die Autoren hoffen, der Leserin und dem Leser auf eine ansprechende und verständliche Art die Grundlagen der Informatik nahebringen zu können. In diesem Sinne wünschen sie ihnen eine angenehme Lektüre und viel Erfolg beim Lernen und beim Lösen der Aufgaben. Danksagung Die Autoren bedanken sich für die kreative Mitwirkung an den Aufgaben bei Jonas Benterbusch, Philippe Blättchen, Marcel Braith, Leonard Brauck, Johannes Burchardt, Jose Antonio Cepeda, Vivian Cheng, Jacob Eberhardt, Theresa Euring, Yvonne Freytag , Philip Grefe, Anna-Lena Hau, Christiane Haubitz, Matthias Hauser, Stefanie Häuser, Michael Heck, Jonas Hemlein, Patrick Henkes, Yannick Hilgers, Lisa Hoffmann, Julian Holz, Lukas Jansen, Maximilian Jentsch, Fabian Jost, Claus Kadelka, Tobias Käfer, Nico Kaltenbacher, Fabian Kerstholt, Christian Kiefer, Isabelle Krämer, Martin Kreuser, Daniel Kübler, Melanie Lampert, Tobias Lurz, Florian Mägerlein, Christina Marx, Bastian Prell, Jördis Rappl, Adam Rodacki, Benedict Schendzielorz, Sebastian Schienle, Irena Schips, Sven Schömer, Marcel Schrumpf, Anja Schuler, Alexander Sigmund, Birgit Spitz, Eva Steffes, Tobias Stengel, Michael Vormittag, Simon Wiedemann, Lea Wild und Kai Windscheid. Für Arbeiten an den Vorlesungsaufzeichnungen und der Verlinkung des Forums danken sie Solveig Gronau und Caroline Strunz. Für das Durchsehen der Texte hinsichtlich Grammatik und Stil danken sie Christian Gitte, Christian Hirsch, Sebastian Kochanneck, Ingo Mauser, Sabrina Merkel, Marc Mültin, Daniel Pathmaperuma, Fabian Rigoll, Felix Vogel und Micaela Wünsche. Karlsruhe, September 2013 Lukas König, Friederike Pfeiffer-Bohnen, Hartmut Schmeck

1

Schaltnetze und Schaltwerke

Einführung Schaltnetze und Schaltwerke werden genutzt, um Boolesche Abbildungen technisch umzusetzen. Als logische Bausteine finden sie Verwendung in Prozessoren, Speicherplatinen und anderen Bauteilen moderner Computer, Smart-Phones usw. Dafür werden auf CMOS-Technologie (vgl. Kapitel 2) basierende Realisierungen von Elementarfunktionen für logische Verknüpfungen wie AND, OR, NOT, NAND, NOR, XOR usw. zusammengefügt, um komplexere Funktionalitäten zu erfüllen. Das können beispielsweise Berechnungen wie Addition, Subtraktion, Multiplikation und Division auf Dualzahlen sein, logische Operationen wie das Verschieben von Werten im Speicher oder die Speicherung einzelner Bits in sogenannten Flipflops. Schaltalgebra Der Arbeitsweise von Schaltnetzen und Schaltwerken liegt eine Logik zugrunde, die durch die sogenannte Schaltalgebra definiert wird. Um ihren Zweck zur Beschreibung des Verhaltens elektronischer Bauteile zu erfüllen, die aus Elementen wie Schaltern, Relais, Transistoren usw. bestehen, muss die Schaltalgebra das Verhalten und Zusammenspiel dieser Elemente formalisieren. Die Elemente der Schaltalgebra werden mit den Schaltzuständen bistabiler Schaltelemente, beispielsweise Schalter, Relais, Dioden und Transistoren, identifiziert. Bistabile Schaltelemente weisen zwei stabile Schaltzustände auf, die je nach Kontext als offen/geschlossen, nichtleitend/leitend, hohes/niedriges Potential usw. bezeichnet werden. Diesen beiden Zuständen werden die sogenannten Schaltwerte (oder Schaltkonstanten) 0 ( f alse) und 1 (true) zugeordnet. Daher kann die Menge M, auf der die Schaltalgebra beruht, mit der Booleschen Menge identifiziert werden: M = B. Die Verknüpfungen der Schaltalgebra werden bezeichnet als • ∧ (Boolesches Produkt, Konjunktion; realisiert durch Reihenschaltung von Schaltelementen), • ∨ (Boolesche Summe, Disjunktion; realisiert durch Parallelschaltung von Schaltelementen), • x (Boolesches Komplement oder Negation; realisiert durch Ruhekontaktschaltung). Man überzeugt sich leicht, dass diese Operationen den Axiomen der Booleschen Algebra genügen; die so definierte Schaltalgebra (B; ∧, ∨, x) ist also eine Boolesche Algebra (vgl. Anhang A.5). Wir bezeichnen als (binäre) Schaltvariable eine Variable, die genau zwei Werte annehmen kann und somit mit der Menge B identifizierbar ist. Eine Funktion f : Bn → B bezeichnen wir als n-stellige Schaltfunktion und deren technische Realisierung als Schaltung mit n Eingängen und einem Ausgang.

2

1 Schaltnetze und Schaltwerke

Schaltungen zur Realisierung spezieller (ausgezeichneter) schaltalgebraischer Verknüpfungen nennt man Schaltgatter oder Gatter. Gatter werden als Rechtecke dargestellt, die eine Beschriftung zur Identifikation tragen und (meist) links einen waagerechten Strich pro Eingang und (meist) rechts einen waagerechten Strich für den Ausgang haben. Zu den Gattern zählen wir insbesondere die elementaren Gatter: • AND-Gatter (Konjunktionsglied): Realisierung von f : B2 → B : (a, b) → a ∧ b; Darstellung:

& • OR-Gatter (Disjunktionsglied): Realisierung von f : B2 → B : (a, b) → a ∨ b; Darstellung:

1 • NOT-Gatter (Negationsglied): Realisierung von f : B → B : a → a; Darstellung:

1 Weitere gebräuchliche Gatter sind: • NOR-Gatter (Peirce-Funktion): Realisierung von f : B2 → B : (a, b) → a ∨ b; Darstellung:

1 • NAND-Gatter (Sheffer-Funktion): Realisierung von f : B2 → B : (a, b) → a ∧ b; Darstellung:

& • XOR-Gatter (Antivalenz/Paritätsfunktion): Realisierung von f : B2 → B : (a, b) → (a ∧ b) ∨ (a ∧ b); Darstellung:

2k+1

Einführung

3

Für die zweistelligen unter diesen Gattern können, unter Verallgemeinerung der zugehörigen Schaltfunktion, auch mehr als zwei Eingänge realisiert werden, da die zugrunde liegenden Funktionen alle assoziativ sind. Die Schaltalgebra erlaubt weiterhin die Verknüpfung mehrerer Gatter zu einer komplexeren Schaltstruktur, wobei auf Darstellungsebene einfach die Ausgänge von Gattern mit den Eingängen anderer Gatter verbunden werden. Daraus ergeben sich Schaltnetze oder Schaltwerke, die beliebig viele Eingänge und Ausgänge und eine beliebig komplexe Verknüpfungslogik haben können. Solange es dabei keine Rückkopplungen gibt, reden wir von Schaltnetzen, sonst von Schaltwerken. Im Folgenden werden Schaltnetze und Schaltwerke formal definiert. Schaltnetze Ein Schaltnetz F ist die technische Realisierung einer Abbildung f : Bn → Bm : (a1 , a2 , . . . , an ) → f (A) = ( f1 (A), f2 (A), . . . , fm (A)) mit • A =de f (a1 , a2 , . . . , an ); • a1 , a2 , . . . , an : Eingaben (Werte an den Eingängen) des Schaltnetzes F; • f1 , f2 , . . . , fm : n-stellige Schaltfunktionen, die die Ausgaben (Werte an den Ausgängen) f1 (A), f2 (A), . . . , fm (A) des Schaltnetzes definieren. Die Funktion f ist also eine Zusammenfassung von m jeweils n-stelligen Schaltfunktionen, und das Schaltnetz F ist eine Kombination aus m Schaltungen. Das Schaltverhalten von F ist dabei „kombinatorisch“, d. h. die Ausgaben hängen nur von den Eingaben ab (vgl. Schaltwerke). Gatter sind spezielle Schaltnetze mit m = 1 und beliebig vielen Eingaben. Als Verallgemeinerung von Gattern stellen wir auch Schaltwerke als Rechtecke mit Eingängen und Ausgängen dar, oder wir zeichnen die inneren Verbindungen zwischen den an dem Schaltwerk beteiligten Gattern. a A

...

F

...

f(A)

b c

& 1

f(a,b,c)

Die von einem Schaltnetz berechneten Funktionen können beispielsweise durch eine Wertetabelle angegeben werden, die für jeden der n Eingänge und m Ausgänge eine Spalte und insgesamt 2n Zeilen enthält. Außerdem kann man für jede Boolesche Funktion einen Booleschen Ausdruck angeben (vgl. Anhang A.5) oder ein Binary Decision Diagram (BDD) berechnen (vgl. Kapitel 3). (Synchrone) Schaltwerke Schaltwerke stellen eine Verallgemeinerung von Schaltnetzen dar, indem die Ausgaben hier

4

1 Schaltnetze und Schaltwerke

nicht nur von den aktuellen Eingaben abhängen, sondern zusätzlich von endlich vielen vorausgegangenen Eingaben. Dafür ist ein „Gedächtnis“ notwendig, das bei Schaltwerken in Form sogenannter innerer Zustände vorhanden ist (in dieser Hinsicht hängen Schaltwerke eng mit endlichen Automaten zusammen, vgl. Band 1, Kapitel 2). Auf Darstellungsebene kann man sich die Realisierung dieser inneren Zustände durch die Rückführung von Ausgängen eines Schaltnetzes zu Eingängen seiner Teilschaltungen vorstellen. Takt F

Verz. Z(t)

Z(t+1)=g(A(t),Z(t)) Schaltnetz

A(t)

f(A(t),Z(t))

Formal ist ein Schaltwerk F die technische Realisierung zweier Abbildungen: f : Bn × Br → Bm : (A, Z) → f (A, Z) = ( f1 (A, Z), f2 (A, Z), . . . , fm (A, Z)) mit A =de f (a1 , a2 , . . . , an ) und Z =de f (z1 , z2 , . . . , zr ) sowie g : Bn × Br → Br : (A, Z) → g(A, Z) = (g1 (A, Z), g2 (A, Z), . . . , gr (A, Z)) mit • a1 , a2 , . . . , an : Eingaben des Schaltwerkes F; • z1 , z2 , . . . , zr : innere Zustände des Schaltwerkes F; • f1 , f2 , . . . , fm : Schaltfunktionen, die die Ausgaben f1 (A, Z), f2 (A, Z), . . . , fm (A, Z) des Schaltwerkes definieren; • g1 , g2 , . . . , gr : Schaltfunktionen, die den Übergang zu den neuen inneren Zuständen g1 (A, Z), g2 (A, Z), . . . , gr (A, Z) des Schaltwerkes definieren. Der Zustand eines Schaltwerkes heißt stabil, falls g(A, Z) = Z und sonst instabil. Zur Rückführung der den inneren Zustand darstellenden Schaltnetzausgänge werden Verzögerungsglieder genutzt, die eine Verzögerung der Übertragung eines Signals um eine gewisse Zeit τ ermöglichen. Wir denken uns diese Glieder allerdings implizit an den rückführenden Leitungen und verzichten oft auf eine explizite Darstellung. Um eine klar definierte sequentielle Abfolge von Zuständen und Ausgaben eines Schaltwerkes zu erhalten, nutzen wir ein Taktsignal als zusätzliche Eingabe (daher „synchrone“ Schaltwerke; bei asynchronen Schaltwerken ist es zunächst unklar, wann man ein Ergebnis „abrufen“ kann und wann es sich stattdessen um einen instabilen Zwischenzustand handelt). Das Taktsignal (oder einfach Takt) wechselt periodisch zwischen den Werten 0 und 1, wobei eine Periode die konstante Zeit τ dauert. Nun betrachten wir nur noch diskrete Zeitpunkte t · τ mit t ∈ N0 und

Einführung

5

nennen diese Taktzeitpunkte (vereinfachend spricht man meist von Taktzeitpunkten t anstatt von t · τ). Die Zeitspanne τ heißt Taktzeit und wird folgendermaßen bestimmt: Die Zeit, bis das Schaltnetz aus einer Eingabe A den Ausgabevektor f (A) erzeugt hat, heißt Schaltzeit τ s ; beträgt τ s höchstens τmax Zeiteinheiten, so wählt man τ ≥ τmax . Zustandsänderungen erfolgen nun nur noch während der Taktzeiten, und erst beim Takt „erscheint“ das neue Z(t) = g(A(t−1), Z(t−1)) am Ausgang des Verzögerungsgliedes. Der Takt wirkt also wie eine „Schleuse“ für das zu übertragende Signal. Der innere Anfangszustand Z(0) des Schaltwerkes kann unbekannt sein oder fest mit Anfangswerten initialisiert. Schaltwerke können insbesondere zur zeitlichen Speicherung von Signalen genutzt werden, beispielsweise bei der Realisierung von Registern. Zu diesem Zweck werden sogenannte Flipflops genutzt, die jeweils genau einen Wert (0 oder 1) für eine gewisse Dauer speichern. Wir betrachten dabei (synchrone) RS-, JK- und MS-Flipflops und nutzen für diese die folgenden Schaltzeichen: RSFlipflop s

JKFlipflop q

t

j

MSFlipflop q

t r

q

d

s

q

t k

q

r

Alle synchronen Flipflops haben einen Takteingang t. Bei RS-Flipflops bewirkt der Takteingang, dass in den Speicher nur geschrieben werden kann, wenn das Taktsignal eine 1 liefert. Die zusätzlichen beiden Eingänge s und r werden zum Einstellen des gespeicherten Werts benutzt. Wird s („set“) auf 1 gesetzt, wird der Wert 1 im Flipflop gespeichert. Der Wert bleibt solange erhalten, bis der Rücksetzeingang r („reset“) auf 1 gesetzt wird, was zum Speichern einer 0 im Flipflop führt. Solange r = s = 0 ist, wird der gespeicherte Wert erhalten. Setzund Rücksetzeingang dürfen beim RS-Flipflop nie gemeinsam auf 1 gesetzt werden. Ein JKFlipflop hat zusätzlich zum Takt ebenfalls zwei Eingänge, die j und k genannt werden (die Namensgebung „JK“ ist nicht sicher überliefert; häufig wird es mit „jump“/„kill“ assoziiert). Es verhält sich wie ein RS-Flipflop für alle Eingangskombinationen, die bei diesem erlaubt sind, wobei j dem Eingang s entspricht und k dem Eingang r. Zusätzlich ist beim JK-Flipflop auch die Kombination j = k = 1 erlaubt, die dazu führt, dass der gespeicherte Wert negiert wird („toggle“). Ein MS-Flipflop besteht aus zwei zusammengeschalteten RS-Flipflops mit demselben Takt, die Vorspeicherflipflop (VF; „master“) und Hauptspeicherflipflop (HF; „slave“) genannt werden. Das MS-Flipflop hat neben dem Takteingang nur einen weiteren Eingang d. Ist t = 1, sind die Eingänge des HF gesperrt und d wird in das VF übernommen. Ist t = 0, sind die Eingänge des VF gesperrt und das HF übernimmt den Schaltzustand des VFs. Ein Einschreiben in den Speicher ist also nur möglich, wenn t = 1 gilt, ein Auslesen nur, wenn anschließend t = 0 gilt. Der Speicherinhalt kann bei allen beschriebenen Flipflop-Typen über den Ausgang q ausgelesen werden. Bei RS- und JK-Flipflops gibt es zusätzlich den Ausgang q (auch q), der den negierten Speicherinhalt liefert. Weitere Informationen zu Schaltnetzen und Schaltwerken sowie speziell zu Flipflops können in der Vorlesungsaufzeichnung oder beispielsweise im Buch von Bernhard Eschermann gefunden werden [Esc93].

6

1 Schaltnetze und Schaltwerke

Themen dieses Kapitels Die sieben Aufgaben dieses Kapitels beschäftigen sich mit dem theoretischen Aufbau von Schaltnetzen und Schaltwerken, der Erstellung von Schaltnetzen für bestimmte Funktionalitäten sowie deren Darstellung durch Wertetabellen und Boolesche Ausdrücke. Darüber hinaus wird die Erstellung von Schaltwerken über eine Definition der gewünschten Funktionalität durch endliche Automaten behandelt.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Schaltnetze-Schaltwerke.html

Aufgaben

7

Aufgaben Aufgabe 1 Schaltnetze 

CMO-AG 



a) Welche Aufgaben haben folgende zwei Konstrukte? 1) Flipflop 2) Register b) Geben Sie an, wie man durch Verwendung von ausschließlich NOR-Gattern die folgenden Gattertypen darstellen kann. 1) AND-Gatter 2) OR-Gatter c) Geben Sie an, wie man das XOR-Gatter ausschließlich durch Nutzung der folgenden Gattertypen darstellen kann. 1) OR-, AND- und NOR-Gatter 2) OR-, AND- und NOT-Gatter → Lösung: S. 115

Aufgabe 2 Schaltnetze 

SCH-AA 



Ein Volladdierer realisiert auf Schaltkreisebene die Addition von zwei Eingabebits a, b und einem eventuell in früheren Additionen aufgetretenen Übertrag c. Als Ausgabe liefert er ein Summenbit S und ein Übertragsbit C für eventuelle künftige Additionen. a) Geben Sie eine Wertetabelle für einen Volladdierer an. b) Ermitteln Sie jeweils eine konjunktive Normalform (KNF) für die beiden Ausgänge. Wie weit kann man diese vereinfachen? c) Geben Sie eine Realisierung des vereinfachten Schaltnetzes an, indem Sie ausschließlich 2-stellige AND-, OR- und XOR-Gatter verwenden. Legen Sie dabei für C die disjunktive Normalform (DNF) zugrunde und vereinfachen Sie diese. → Lösung: S. 116

8

1 Schaltnetze und Schaltwerke Aufgabe 3

SCH-AC

Schaltnetze 





Entwerfen Sie ein Schaltnetz, welches zwei vierstellige Dualzahlen x = (d, c, b, a), x = (d , c , b , a ) ∈ B4 addiert und sich in Abhängigkeit der Einsen im Ergebnis folgendermaßen verhält: bei gerader Anzahl soll am Ausgang A eine 0 anliegen, bei ungerader Anzahl eine 1. Hinweise: • Für den Zahlenwert der Bitstrings gilt: wert(x) = d · 23 + c · 22 + b · 21 + a · 20 , wert(x ) = d · 23 + c · 22 + b · 21 + a · 20 • Benutzen Sie als Bausteine die üblichen Gatter AND, OR, NOT, XOR, . . . sowie den Halbaddierer HA und den Volladdierer VA. • Beachten Sie, dass auch der letzte Übertrag zum Ergebnis gehört. → Lösung: S. 117

Aufgabe 4 Schaltnetze 

SCH-AB 





Eine Lampe wird von drei Schaltern s1 , s2 , und s3 an- oder ausgeschaltet. Die Lampe soll leuchten, wenn • s1 aus, s2 an, s3 an, oder • s1 an, s2 aus, s3 an, oder • s1 an, s2 an, s3 an ist. In allen anderen Fällen soll die Lampe nicht leuchten. a) Stellen Sie eine Wahrheitstabelle auf, die beschreibt, wie sich der Zustand der Lampe L als Funktion B3 → B von s1 , s2 , s3 verhält. Dabei soll der Zustand „aus“ mit 0 und „an“ mit 1 kodiert werden. b) Geben Sie die Schaltfunktion von L in disjunktiver Normalform (DNF) an. c) Geben Sie die Schaltfunktion von L in konjunktiver Normalform (KNF) an. → Lösung: S. 118

Aufgaben

9

Aufgabe 5

SCH-AE 

Schaltwerke 



a) Skizzieren Sie den prinzipiellen Aufbau eines getakteten Schaltwerkes. b) Skizzieren Sie ein Schaltwerk, das genau dann eine 1 am Ausgang anliegen hat, wenn die bisher erfolgte Eingabe zwei aufeinander folgende Einsen enthält, also für Wörter der Sprache L = {{0, 1}m 11{0, 1}n | m, n ∈ N0 }. Benutzen Sie dafür nur AND-, OR- und NOT-Gatter sowie getaktete RS-Flipflops. → Lösung: S. 118

Aufgabe 6

SCH-AF 

Schaltwerke 



Skizzieren Sie ein Schaltwerk bei dem genau dann eine 1 am Ausgang a anliegt, wenn die am Eingang E bisher erfolgte Eingabefolge Element folgender Sprache ist: L = {w ∈ {0, 1} | |w|1 mod 2 = 1} Hinweis: Das Schaltwerk erhält pro Takt t ein Signal 0 oder 1, die Länge dieser Eingabe ist unbegrenzt. → Lösung: S. 120

Aufgabe 7

SCH-AD 

Schaltwerke 



Gegeben seien der unvollständig definierte endliche Automat

A = ({0, 1}, {s00 , s01 , s10 , s11 }, δ, s00 , {s11 }) δ:  

und das folgende Schaltwerk:

 

 

 

10

1 Schaltnetze und Schaltwerke

t E

1 1 1 1

& &

1 1

1

&

s

q

r

q

s

q

r

q

a

t

1

b

t

&

1

a) Vervollständigen Sie das Zustandsüberführungsdiagramm von A mithilfe des Schaltwerkes, sodass sich bei sukzessiver Abarbeitung eines Wortes w ∈ {0, 1} (das über E in das durch t getaktete Schaltwerk eingegeben wird) der Automat genau dann in Zustand sab befindet, wenn die aktuelle Ausgabe des Schaltwerkes (a, b) ist, wobei a, b ∈ {0, 1}. b) Geben Sie einen regulären Ausdruck α an, sodass L(α) = L(A). → Lösung: S. 120

2

Complementary Metal Oxide Semiconductor (CMOS)

Einführung Die CMOS-Technologie ist heute eine wichtige Grundlage für die Herstellung integrierter Schaltungen. Insbesondere Speicherelemente, Mikroprozessoren und Sensoren werden oft in CMOS-Technologie gefertigt. Dabei wird ein sogenannter Halbleiter (meist Silizium), also ein Stoff, dessen elektrische Leitfähigkeit zwischen der von Metallen und der von Isolatoren liegt, genutzt, um elektrische Schalter zu generieren, die über ein Eingangssignal in die beiden Zustände leitend („geschlossen“) und nichtleitend („offen“) geschaltet werden können. Solche Schalter bilden die physikalische Grundlage, um Gatter und Schaltnetze/Schaltwerke zu realisieren (vgl. Kapitel 1). Dabei werden Schalter unterschieden, die beim Anliegen einer „1“ (also einer positiven Spannung, die eine bestimmte Grenzspannung Ut überschreitet) am Schaltungseingang (Gate) leiten und sonst nicht leiten, und der dazu komplementären Variante, bei der beim Anliegen einer „0“ (also bei Unterschreitung der Grenzspannung) geleitet wird und sonst nicht. Das wesentliche Bauelement hochintegrierter Schaltungen ist dabei der Metal-Oxide-Semiconductor-Field-Effect-Transistor (MOSFET), auf dem der NMOS- und der PMOS-Transistor beruhen. NMOS-Transistor Der NMOS-Transistor repräsentiert die bei 1 leitende Variante der elektrisch steuerbaren Schalter in der CMOS-Technologie. Wir wollen hier nicht weiter auf die physikalischen Grundlagen und Eigenschaften von MOSFET-Transistoren eingehen (diese können in der Vorlesungsaufzeichnung studiert werden), sondern beschränken uns auf deren Funktionsweise auf der abstrakteren Ebene der Schaltungslogik. Der NMOS-Transistor verfügt über die drei Anschlüsse Gate G, Source S und Drain D, die im Schaltzeichen des NMOS-Transistors folgendermaßen angeordnet sind: D G

S

Dabei ist G der Schaltungseingang, dessen Spannung bestimmt, ob der Weg von D nach S durchlässig ist. Wenn bei G eine 1 anliegt, ist der Schalter geschlossen, also besteht eine elektrische Leitfähigkeit des Transistors zwischen D und S. Liegt bei G eine 0 an, ist der Schalter offen und der Transistor ist nicht durchlässig, also nichtleitend.

12

2 Complementary Metal Oxide Semiconductor (CMOS)

PMOS-Transistor Der PMOS-Transistor verhält sich auf Ebene der Schaltungslogik exakt komplementär zum NMOS-Transistor. Wieder ist G der Schaltungseingang, dessen Spannung bestimmt, ob diesmal der Weg von S nach D durchlässig ist. Hier bedeutet jedoch eine 0 an G, dass sich der Schalter in einem durchlässigen oder leitenden Zustand befindet, also geschlossen ist, und eine 1 an G, dass er nichtdurchlässig, nichtleitend bzw. geöffnet ist. Das Schaltzeichen eines PMOS-Transistors sieht wie folgt aus: S G

D

CMOS als Kombination von NMOS- und PMOS-Transistoren Während es grundsätzlich möglich ist, Schaltungen ausschließlich aus NMOS- oder ausschließlich aus PMOS-Elementen zu bauen, ist es vor allem in Bezug auf den Energieverbrauch vorteilhaft, beide Transistor-Typen gleichzeitig zu nutzen. Daher beruht die CMOS-Technologie auf einer Kombination von NMOS- und PMOS-Transistoren, die in zueinander komplementärer Weise mit der positiven Spannung VDD (entspricht 1) und der Masse GND (entspricht 0) zu einer Schaltung verbunden werden. Dabei liegen alle PMOS-Elemente nahe an VDD und alle NMOS-Elemente nahe an GND. Die Eingänge der Schaltung werden mit den Gate-Eingängen der PMOS- und NMOS-Elemente verbunden, sodass je nach Eingangsbelegung entweder von VDD oder von GND aus eine leitende Verbindung mit dem Ausgang der Schaltung besteht. Der Ausgang wird dabei üblicherweise „in der Mitte“, also an den Drain-Verbindungen zwischen dem NMOS- und dem PMOS-Teil abgegriffen. Der Ausgang einer Schaltung kann wieder als Eingang einer neuen Schaltung oder eines Schaltungsteils dienen. Zu jedem NMOS-Transistor gehört also ein PMOS-Transistor, wobei sich die komplementären Transistoren gegenseitig insofern ergänzen müssen, als einerseits verhindert werden muss, dass in der Schaltung zu irgendeinem Zeitpunkt VDD mit GND leitend verbunden wird (Kurzschluss), und andererseits gewährleistet sein muss, dass immer entweder von VDD oder von GND aus eine leitende Verbindung zum Ausgang besteht (sonst unklares Ausgangssignal). Die beiden Bereiche einer CMOS-Schaltung (PMOS/NMOS) können gemeinsam entworfen werden, da sich die Struktur der Verknüpfungen des einen Bereichs aus denen des anderen durch die komplementäre Bauweise ergeben. So kann man beispielsweise zunächst die PMOSSchaltung entwerfen und erhält danach die zugehörige NMOS-Schaltung, indem für jede Parallelschaltung in PMOS eine Reihenschaltung in NMOS umgesetzt wird und umgekehrt. (Heute werden aus Effizienzgründen auch Schaltungen eingesetzt, die nicht in exakt dieser komplementären Weise aufgebaut sind; diese werden hier aber nicht betrachtet.) Bemerkung: Studierende haben zu Beginn ihrer Beschäftigung mit der CMOS-Technologie häufig die etwas irreführende Vorstellung, dass, ähnlich wie bei der Darstellung von Schaltnetzen, Signale „von links nach rechts fließen“, also aus den Eingängen über die MOS-Elemente an die Ausgänge weitergeleitet werden. Auf einer abstrakten logischen Ebene ist das zwar richtig, hilfreicher ist es in diesem Zusammenhang allerdings, sich vorzustellen, dass die Belegung

Einführung

13

der Eingänge und die Verknüpfungslogik bestimmen, ob das Signal 1 von VDD aus oder das Signal 0 von GND aus an den Ausgang geleitet wird. Betrachten Sie als Beispiel dafür die folgende Abbildung einer Schaltung in CMOS-Technologie, die das Gatter NOR realisiert. Die PMOS-Reihenschaltung gewährleistet, dass nur dann eine 1 am Ausgang anliegt, wenn an beiden Eingängen a und b eine 0 anliegt. Auf der komplementären NMOS-Seite gewährleistet die Parallelschaltung, dass immer dann eine 0 am Ausgang anliegt, wenn an mindestens einem Eingang eine 1 anliegt. Insbesondere ist durch die komplementäre Bauweise automatisch sichergestellt, dass es für jede Kombination der Eingangssignale ein klar definiertes Ausgangssignal gibt. VDD a

1 von VDD b a NOR b

0 von GND

GND

Themen dieses Kapitels Die zehn Aufgaben dieses Kapitels behandeln die Generierung von CMOS-Schaltungen für bestimmte Schaltfunktionen bzw. die Extraktion der Schaltfunktion für eine gegebene CMOSSchaltung. Darüber hinaus werden allgemeine Fragen zur Struktur von CMOS-Schaltungen und die Schnittstelle zu Schaltnetzen behandelt.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Complementary-Metal-Oxide-Semiconductor.html

14

2 Complementary Metal Oxide Semiconductor (CMOS)

Aufgaben Aufgabe 8

CMO-AA



CMOS 



Vervollständigen Sie das folgende CMOS-Schaubild eines 3-stelligen NAND-Gatters, also ein NAND-Gatter mit drei Eingängen. Zeichnen Sie das Gatter auf Transistorebene und nutzen Sie hierzu die Schaltzeichen von NMOS- und PMOS-Transistoren. V DD

a b

f

c

GND

→ Lösung: S. 120

Aufgaben

15

Aufgabe 9

CMO-AF



CMOS 



Zeichnen Sie eine CMOS-Schaltung, die ein OR-Gatter realisiert. → Lösung: S. 121

Aufgabe 10

CMO-AC



CMOS 



a) Wofür steht die Abkürzung CMOS? b) Warum ist PMOS immer an VDD und NMOS immer an GND angeschlossen? c) Gegeben sei die Boolesche Funktion f : B3 → B mit f (a, b, c) = (¬a ∧ ¬b) ∨ c Geben Sie eine CMOS-Schaltung für f an. → Lösung: S. 122

Aufgabe 11 CMOS 



CMO-AH





Gegeben sei die Boolesche Funktion f : B3 → B mit f (a, b, c) = a ∨ b ∨ c Zeichnen Sie eine CMOS-Schaltung für f . → Lösung: S. 123

16

2 Complementary Metal Oxide Semiconductor (CMOS)

Aufgabe 12

CMO-AB



CMOS 



Gegeben sei folgende Schaltfunktion f : B4 → B mit f (a, b, c, d) = (¬a ∧ ¬b) ∨ (¬c ∧ ¬d) a) Geben Sie eine CMOS-Schaltung für f an. b) Geben Sie ein Schaltnetz für diese Funktion an, indem Sie nur den Baustein NOR verwenden. Benutzen Sie diesen als „Blackbox“. → Lösung: S. 124

Aufgabe 13 CMOS 



CMO-AI







Gegeben sei die Boolesche Funktion f : B3 → B mit f (a, b, c) = (¬a ∧ b) ∨ (b ∧ ¬c) ∨ (¬a ∧ c) a) Geben Sie eine CMOS-Schaltung für die Funktion f an. Zeichnen Sie dabei nur den PMOS-Bereich auf Transistorebene. Verwenden Sie eine Blackbox für den NMOSBereich und stellen Sie durch geeignete Leitungen eine Verbindung zwischen NMOSund PMOS-Bereich her. b) Beschreiben Sie in einem Wort, wie Sie den NMOS-Bereich bei einer CMOS-Schaltung im Vergleich zum PMOS-Bereich aufbauen würden. → Lösung: S. 125

Aufgaben

17

Aufgabe 14

CMO-AE



CMOS 



Welche Funktionen f : B2 → B : (a, b) → f (a, b) bzw. f : B → B : a → f (a) geben folgende CMOS-Schaltungen aus? Geben Sie die Booleschen Funktionen hierfür an. a)

b) V DD

V DD a

a

f

f b

b

GND

GND

c)

d) V DD

V DD

a f

a

f

b

GND

GND

e) Welches Problem könnte sich ergeben, wenn bei einer Schaltung PMOS an GND und NMOS an VDD angeschlossen wären? → Lösung: S. 126

18

2 Complementary Metal Oxide Semiconductor (CMOS)

Aufgabe 15

CMO-AD



CMOS 



Gegeben sei folgende CMOS-Schaltung, die eine Boolesche Funktion f : B3 → B : (a, b, c) → f (a, b, c) realisiert. V DD a

b

f

c GND

Geben Sie die Funktion f als Booleschen Ausdruck und als Wahrheitstabelle an. → Lösung: S. 126

Aufgabe 16 

CMOS 

CMO-AJ 



Gegeben sei eine Boolesche Funktion f : B3 → B : (a, b, c) → f (a, b, c), die durch die abgebildete CMOS-Schaltung definiert wird. Geben Sie die Funktion f als Term in Boolescher Algebra an.

Aufgaben

19 V DD

a

b

f

c

GND

→ Lösung: S. 127

Aufgabe 17 Aussagenlogik, Schaltungen und CMOS 

VER-AA 



Wahr

Falsch

Die Aussagenlogik, die Mengenalgebra und die Schaltalgebra sind Boolesche Algebren. Daher gelten für sie äquivalente Axiome und Umformungsgesetze.





Es kann vorkommen, dass durch zwei verschiedene Verknüpfungsbasen ein und derselben Funktionsmenge unterschiedliche Anzahlen von Funktionen darstellbar sind.





Systeme, die aus ASICs bestehen, können nachträglich nicht umprogrammiert werden, solche aus FPGAs schon.





NMOS-Transistoren liegen in CMOS näher an GND als an VDD .





Durch Dotierung werden Eigenschaften des Siliziumkristalls geändert, sodass er als Transistor verwendet werden kann





→ Lösung: S. 127

3

Binary Decision Diagram

Einführung Das Binary Decision Diagram (BDD) ist, wie Schalt- oder Wertetabellen und Booleschen Ausdrücken, eine weitere Möglichkeit, Boolesche Funktionen darzustellen. Die anderen Darstellungsverfahren haben oft das Problem, dass sie sich in verschiedener Hinsicht exponentiell in der Anzahl der Variablen aufblähen. So hat eine Schalttabelle bei n Variablen immer genau 2n Zeilen, was bei wachsendem n für viele Anwendungen unbrauchbar ist. Auch disjunktive oder konjunktive Normalformen von Booleschen Ausdrücken haben sogar in vereinfachter Form oft exponentielle Größe in der Anzahl der Variablen. Dabei wächst der Aufwand zur Lösung vieler auf Boolesche Funktionen bezogener Probleme (beispielsweise Erfüllbarkeit, vgl. S AT Problem) bei Darstellung durch Boolesche Ausdrücke mindestens linear mit der Größe des Ausdrucks; potentiell kann das ein weit über lineares Wachstum in der Anzahl der Variablen sein. BDDs liefern für viele wichtige Anwendungsgebiete eine platzsparende Darstellung, die darüber hinaus weitere günstige Eigenschaften bei der Untersuchung Boolescher Funktionen hat. In den letzten Jahrzehnten (seit 1986) hat daher diese Darstellungsform Boolescher Funktionen starke Bedeutung für den rechnergestützten Schaltungsentwurf bzw. für die Untersuchung von Eigenschaften Boolescher Funktionen erlangt. BDDs sind außerdem die wesentliche Datenstruktur heutiger CAD-Werkzeuge. Entwicklungssatz für Boolesche Funktionen Die Darstellung als BDD beruht auf der Beobachtung, dass man von jeder mehrstelligen Booleschen Funktion einzelne Variablen wie folgt abspalten kann, um zwei einfachere, durch „+“ verknüpfte Funktionen daraus zu erhalten: Seien • f : Bn → B eine beliebige Boolesche Funktion, • x1 , . . . , xn beliebige Boolesche Variablen. Dann gilt:

f (x1 , . . . , xn ) = x1 · f (1, x2 , . . . , xn ) + x1 · f (0, x2 , . . . , xn )

Beispielsweise gilt: f (a, b, c) = (ac + b) · (a + b c) = a · ((c + b) · b c) +a · (b)   f (1,b,c)

f (0,b,c)

Wenn man diese Prozedur des Abspaltens rekursiv fortsetzt, bis nur noch konstante Funktionen 0 und 1 übrigbleiben, erhält man eine baumförmige Aufspaltung der ursprünglichen Funktion f . Auf diesen Baum werden nun folgende Regeln von den Blättern aus „bottom-up“ wiederholt angewendet, bis sich der entstandene Graph nicht mehr ändert:

22

3 Binary Decision Diagram a) Verschmilz identische Teilgraphen; b) Eliminiere einen Knoten, falls beide Kanten auf denselben Nachfolger zeigen.

Dabei entsteht ein eindeutig bestimmter reduzierter Funktionsgraph, den wir BDD nennen. Das BDD ist allerdings nur bei fester Abspaltungsreihenfolge der Variablen eindeutig. Bei vorgegebener Variablenreihenfolge (a → b → c) kann man für die 3-stellige XORFunktion f (a, b, c) = a ⊕ b ⊕ c beispielsweise folgendermaßen zunächst eine Baumdarstellung und dann schrittweise ein BDD ableiten (wobei die einzelnen Schritte für das Verschmelzen der Konstanten 0 und 1 zusammengefasst sind):  

 











  





















 





 



 



   



 



 







 



















  

 



 









 

 









   

 



 





 

Allgemein hat ein BDD der n-stelligen XOR-Funktion bei geeigneter Variablenreihenfolge genau 2n + 1 Knoten (inklusive der Senkenknoten 0 und 1), während die konjunktive und die disjunktive Normalform jeweils eine Größe von Θ(2n ) haben, also exponentiell größer sind.

Einführung

23

Eigenschaften der Darstellung als BDD Unterschiedliche Reihenfolgen der Variablen können zu sehr unterschiedlichen BDDs führen, wobei es ein NP-vollständiges Problem ist, die Variablenreihenfolge zu finden, die zum kleinstmöglichen BDD führt. Auch gibt es Beispiele für Funktionen, bei denen sich für jede Variablenreihenfolge ein exponentiell großes BDD ergibt (beispielsweise bei der Berechnung der mittleren Bits bei der Multiplikation). Dennoch ist für viele praktische Funktionen die Darstellung als BDD auf polynomiellem Platz möglich. Wenn, wie in diesem Buch angenommen, in einem BDD für jeden Weg von der Wurzel zu den Blättern (bzw. von der Quelle zu den Senken des Graphen) die Reihenfolge der Variablen gleich ist, heißt dieses BDD auch geordnet oder OBDD („ordered BDD“). Themen dieses Kapitels Die sieben Aufgaben dieses Kapitels behandeln die Generierung von BDDs aus gegebenen Funktionen bzw. die umgekehrte Berechnung der zu einem gegebenen BDD gehörenden Booleschen Funktion. Darüber hinaus werden die Darstellungen Boolescher Funktionen als Wahrheitstabelle und Boolescher Ausdruck sowie allgemeine Eigenschaften von BDDs thematisiert.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Binary-Decision-Diagram.html

24

3 Binary Decision Diagram

Aufgaben Aufgabe 18

BIN-AA 

Binary Decision Diagram (BDD) 



Die Boolesche Funktion f : B3 → B sei durch folgenden Baum gegeben.

  











   

 











 

   

 

 

a) Erzeugen Sie das zu f gehörende BDD. Nutzen Sie die im Baum dargestellte Variablenreihenfolge. b) Geben Sie die Boolesche Funktion f als Wahrheitstabelle und als Booleschen Ausdruck an.

→ Lösung: S. 128

Aufgabe 19

BIN-AB 

Binary Decision Diagram (BDD) 

Die Boolesche Funktion f : B3 → B sei durch folgenden Baum gegeben.



Aufgaben

25  

  



















 



















 





a) Geben Sie das zu f gehörende BDD an. Nutzen Sie die im Graph dargestellte Variablenreihenfolge. b) Geben Sie die Funktion f als Booleschen Ausdruck an. → Lösung: S. 129

Aufgabe 20

BIN-AG 

Binary Decision Diagram (BDD) 





Die Boolesche Funktion f : B4 → B sei durch den unten abgebildeten Graphen definiert.  



      

 













 



 

 





















 



  

















 

 



  

 

 

a) Erzeugen Sie das zu f gehörende BDD. Nutzen Sie dazu die im Graph dargestellte Variablenreihenfolge. b) Geben Sie die Funktion f : B4 → B als Booleschen Ausdruck an. → Lösung: S. 130

26

3 Binary Decision Diagram

Aufgabe 21

BIN-AF 

Binary Decision Diagram (BDD) 



Die Funktion f : B3 → B sei durch den abgebildeten Graphen gegeben.   











   

 





 



 

   

 

 

a) Erzeugen Sie das zu der Funktion f gehörende BDD. Nutzen Sie die im Graphen dargestellte Variablenreihenfolge. b) Geben Sie die Boolesche Funktion f als Wahrheitstabelle und als Booleschen Ausdruck an. → Lösung: S. 132

Aufgabe 22

BIN-AE

Binary Decision Diagram (BDD) 







Gegeben sei folgende Boolesche Funktion f : B3 → B mit f (a, b, c) = (a ⊕ b ⊕ c) + a Erzeugen Sie zu f ein BDD mit der Variablenreihenfolge a → b → c. Geben Sie hierzu zuerst die Wahrheitstabelle für f an. → Lösung: S. 133

Aufgaben

27

Aufgabe 23

BIN-AH 

Binary Decision Diagram (BDD) 



Gegeben sei die Boolesche Funktion f : B3 → B mit f (a, b, c) = (a · b + a · c ) + (b ⊕ c) Geben Sie eine Wahrheitstabelle zur Funktion f an und erzeugen Sie das zugehörige BDD. Verwenden Sie hierbei die Variablenreihenfolge a → b → c. → Lösung: S. 134

Aufgabe 24

BIN-AD 

Binary Decision Diagram (BDD) 



Gegeben sei die Boolesche Funktion f : B3 → B mit f (a, b, c) = (a + b ) · (a + b + c ) · (b + c ) Geben Sie das zu f gehörende BDD mit der Variablenreihenfolge a → b → c an. Verwenden Sie hierfür den Entwicklungssatz für Booleschen Funktionen: f (x1 , x2 , . . . , xn ) = x1 · f (1, x2 , . . . , xn ) + x1 · f (0, x2 , . . . , xn )

→ Lösung: S. 136

4

Fehlererkennung und -korrektur, häufigkeitsabhängige Kodierung und Verschlüsselung

Einführung Dieses Kapitel behandelt drei wesentliche Anforderungen an zu kodierende Informationen in Rechnern, die gerade im Zeitalter des Internets besondere Bedeutung erlangt haben. So ist es bei Datenübertragungen zwischen Rechnern (beispielsweise über LAN oder WLAN) unvermeidbar, dass ab und zu Übertragungsfehler auftreten. Da Rechner mit fehlerhaften Informationen nicht korrekt arbeiten können (von Ausnahmen abgesehen), ist es wichtig, Kodierungen zu haben, die eine Fehlererkennung und im besten Fall auch eine Fehlerkorrektur ermöglichen. Das Konzept des Hammingabstands liefert dabei ein wichtiges Werkzeug zur Berechnung der Fehlererkennbarkeit und -korrigierbarkeit einer Kodierung sowie der Erzeugung einer Kodierung, die einen gewünschten Grad an Sicherheit bei der Übertragung garantiert. Darüber hinaus sollen Kodierungen nicht zu viel Speicherplatz verbraucht; unnötig platzverschwenderische Kodierungen blockieren nicht nur sinnlos den Speicher, sondern erzeugen auch lange Übertragungszeiten zwischen Rechnern oder zwischen den verschiedenen Speichern eines einzelnen Rechners. Die Huffman-Kodierung bietet eine Möglichkeit, eine Zeichenkette mit asymptotisch geringstmöglichem Platzverbrauch zu speichern. Die dritte wichtige Anforderung an Kodierungen ist der Schutz von Informationen vor unbefugtem Zugriff. Dies kann auf Softwareebene durch Verschlüsselung erfolgen. Beachten Sie zu den im Folgenden verwendeten Notationen auch Anhang A.6. Fehlererkennung und -korrektur Ein wichtiges Kriterium für die Güte einer Kodierung ist die Möglichkeit zur Fehlerbehandlung. Das Ziel ist, auftretende Fehler (also die ungewollte Veränderung eines Zeichens in einem Codewort durch Fehler bei Übertragung, Kodierung o. ä.) zu erkennen und möglichst auch zu korrigieren. Wir beschränken uns in diesem Zusammenhang auf die Betrachtung von n-BitKodierungen. Für eine n-Bit-Kodierung c : A → Bn und Wörter x = x1 . . . xn , y = y1 . . . yn ∈ c(A) heißt die Anzahl der Stellen, an denen sich x und y unterscheiden, Hammingabstand zwischen x und y. Dieser ist definiert durch h(x, y) =de f

n  i=1

⎧ ⎪ ⎪ ⎨1 falls xi  yi h(xi , yi ) mit h(xi , yi ) = ⎪ ⎪ ⎩0 sonst

30

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Die Hammingzahl hc des Codes ist definiert durch hc =de f min {h(x, y) | x, y ∈ c(A), x  y} Die Kodierung c wird genau dann k-fehlererkennbar genannt, wenn durch Verfälschung von bis zu k Bits eines Codewortes kein anderes Codewort entstehen kann, also wenn ∀x ∈ c(A) ∀y ∈ Bn : h(x, y) ≤ k ⇒ y  c(A) Die Kodierung c wird genau dann k-fehlerkorrigierbar genannt, wenn aus einem durch Verfälschung von bis zu k Stellen eines Codewortes entstandenen Wort das richtige Codewort eindeutig ermittelt werden kann, also wenn ∀x, y ∈ c(A) ∀z ∈ Bn : x  y ∧ h(x, z) ≤ k ⇒ h(y, z) > k Daraus ergibt sich hc ≥ k + 1 ⇒ Kodierung ist k-fehlererkennbar hc ≥ 2k + 1 ⇒ Kodierung ist k-fehlerkorrigierbar   Jede Kodierung c ist also (hc −1)-fehlererkennbar und hc2−1 -fehlerkorrigierbar. Um die Hammingzahl einer Kodierung zu erhöhen, kann man beispielsweise für jedes ursprüngliche Codewort durch Anhängen eines Paritätsbits (0, falls die Summe der Einsen im Wort gerade ist, 1 sonst) ein neues Codewort erzeugen; die so entstehende Kodierung ist immer mindestens 1-fehlererkennbar. Um die Hammingzahl weiter zu erhöhen, kann man auch mehrere Paritätsbits hinzufügen, die gerade bzw. ungerade Parität bestimmter Stellen des Codewortes sichern. Häufigkeitsabhängige Kodierungen, Huffman-Kodierung Häufigkeitsabhängige Kodierungen werden zur Datenkompression eingesetzt. Dabei liegt die Idee zugrunde, die Häufigkeiten der verwendeten Zeichen in einem Text, wenn diese bekannt sind, bei der Kodierung zu berücksichtigen und kurze Codewörter für „häufige“ Zeichen zu generieren und lange Codewörter für „seltene“ Zeichen.  Für ein Alphabet A, eine Häufigkeitsverteilung p : A → [0, 1] mit a∈A p(a) = 1 und eine injektive, die Fano-Bedingung erfüllende Kodierung c : A → B heißt  • LA,p (c) =de f a∈A p(a) · |c(a)| Codelänge von c und • die Kodierung c optimal (bezüglich A und p) genau dann, wenn LA,p (c) minimal bezüglich aller möglichen Kodierungen ist. Eine optimale Kodierung ist im Allgemeinen nicht eindeutig bestimmt. Ein Standardverfahren zur häufigkeitsbasierten Datenkompression, mit dem stets eine optimale Kodierung zu einem gegebenen Alphabet mit zugehöriger Häufigkeitsverteilung generiert werden kann, ist die Huffman-Kodierung. Dafür baut man zunächst iterativ „bottom-up“ einen gerichteten Binärbaum auf, dessen Knoten durch Wahrscheinlichkeiten bewertet sind; er heißt Huffman-Baum. Dabei geht man folgendermaßen vor: Zu Beginn wird für jedes Zeichen a ∈ A ein Knoten Ka angelegt und diesem die Wertigkeit p(Ka ) =de f p(a) zugeordnet; dies sind die späteren Blattknoten des Huffman-Baums. In jedem

Einführung

31

weiteren Iterationsschritt werden nun die beiden geringstwertigen Knoten K, K  , die noch „frei“ sind (das sind Knoten, die bisher noch keine eingehenden Kanten haben), mit einem neu hinzugefügten Knoten K  verbunden, dem die Wertigkeit p(K  ) =de f p(K) + p(K  ) zugeordnet wird. Wenn es im Graphen nur noch einen einzigen freien Knoten, den Wurzelknoten, gibt, ist der Huffman-Baum vollständig. Die Huffman-Kodierung c : A → B ergibt sich, indem jedes Zeichen a ∈ A auf das Codewort c(a) abgebildet wird, das durch das Durchführen folgender Prozedur entsteht: verfolge im Huffman-Baum von der Wurzel aus den Weg zu Knoten Ka und notiere (beispielsweise) bei jeder „Linksabzweigung“ eine 1 und bei jeder „Rechtsabzweigung“ eine 0. Das Wort, das durch das Hintereinanderhängen der notierten Zeichen entsteht, ist c(a). Da die Bedeutung von „Rechtsabzweigung“ und „Linksabzweigung“ von der Darstellung des Baums abhängt, ist es letzlich unerheblich, welches Zeichen (0 oder 1) beim Übergang von einem Knoten zum nächsten gewählt wird. Zu gewährleisten ist nur, dass beim selben Übergang für alle zu kodierenden Zeichen a ∈ A dasselbe Zeichen genommen wird und bei jedem Knoten eine seiner beiden ausgehenden Kanten eine 0 zugeordnet bekommt und die andere eine 1. In Darstellungen des Huffman-Baums schreiben wir jeweils das für die Kodierung genutzte Zeichen an die entsprechende Kante. Die folgende Abbildung zeigt einen Huffman-Baum mit absoluten Häufigkeiten an jedem Knoten (um die Häufigkeitsverteilung zu erhalten, müsste jede dieser Zahlen durch die Summe 29 geteilt werden) und einer Kodierung der Zeichen an den Blättern. Das zugrunde liegende Alphabet ist A = {E, R, F, S , C, H, U, T, O, N} und für die Häufigkeiten gilt (siehe rechte obere Ecke der Blattknoten) p(E) = 8/29, p(R) = p(F) = 4/29, p(S ) = p(C) = p(H) = 3/29 und p(U) = p(T ) = p(O) = p(N) = 1/29.    



 





















 

 















 











  



























 





32

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Bemerkung: Wenn der Huffman-Baum „von Hand“ gezeichnet wird, kann es vorteilhaft sein, zunächst die Blätter oben zu zeichnen und sich nach unten zur Wurzel vorzuarbeiten; der Baum steht dann „auf dem Kopf“. Verschlüsselung Informationen werden verschlüsselt, um bestimmte Daten vor unbefugten Personen geheimzuhalten. Dabei soll unter anderem folgendes gewährleistet werden: • Vertraulichkeit: Schutz elektronischer Dokumente und der Kommunikation vor unberechtigtem Zugriff (Schutz vor „Spionage“), • Integrität: Prüfung der Gültigkeit von Informationen in elektronischen Dokumenten (Angebote, Verträge, . . . ; Schutz vor „Sabotage“), • Authentifizierung: Prüfung der Identität des Autors bzw. Absenders eines Dokuments (Schutz vor „Maskerade“). Der Text, der geheim gehalten und deshalb verschlüsselt werden soll, wird Klartext genannt, das Ergebnis der Verschlüsselung Geheimtext, Chiffretext, Chiffrat oder Code. Oft und im Folgenden wird der Sender einer geheimen Nachricht Alice (A), der (erwünschte) Empfänger Bob (B) und ein potentieller Angreifer Eve (E) genannt. Im Allgemeinen geht man davon aus, dass sowohl A und B als auch E den Verschlüsselungsalgorithmus kennen, dass aber die Schlüsselparameter für den Algorithmus nur A und B bekannt sind. Nutzen A und B denselben Schlüssel, spricht man von symmetrischer, sonst von asymmetrischer Verschlüsselung. Somit muss ein guter Verschlüsselungsalgorithmus ohne Kenntnis der Schlüsselparameter „schwer“ zu knacken sein. Genauer gesagt muss der Aufwand für das unbefugte Entschlüsseln des Codes durch E größer sein als der Wert der chiffrierten Nachricht für E. Bei einer verschlüsselten Kommunikation lassen sich vier Stufen der Kompromittierung durch E (in absteigender Reihenfolge des Informationsgewinns) unterscheiden. 1) Knacken des Schlüssels: Der Angreifer findet den geheimen Schlüssel. 2) Globale Lösung: Ein Verfahren zur Entschlüsselung wird entwickelt, ohne dass der Schlüssel bekannt ist. 3) Lokale Lösung: Eine einzelne Nachricht kann entschlüsselt werden. 4) Informationsgewinn: Partielle Informationen über Schlüssel oder Klartext können gewonnen werden. Zu den einfachen Verschlüsselungsmethoden gehört die Tabellen-Chiffre oder einfache Substitution. Dabei wird jeder Buchstabe gemäß einer Permutationstabelle des Alphabets durch einen anderen ersetzt. Ein Spezialfall davon ist die sogenannte Cäsar-Chiffre, bei der jeder Buchstabe um 3 Stellen im Alphabet nach hinten versetzt wird (modulo Alphabetgröße). Die Tabellen-Chiffre ist unzuverlässig, da sie durch Häufigkeitsanalyse von Zeichen und Zeichenkombinationen leicht zu entschlüsseln ist. Eine Verallgemeinerung der Tabellen-Chiffre ist die Vigenère-Chiffre oder polyalphabetische Substitution, wobei mehr als eine Tabelle zur Bestimmung der Permutation verwendet wird. Beispielsweise kann ein kurzer Schlüssel wie „GOLD“ zyklisch über einen Klartext gelegt und jeder Klartextbuchstabe um den Buchstabenwert des zugehörigen Schlüsselbuchstabens im Alphabet (modulo Alphabetgröße) verschoben werden, z. B.:

Einführung Klartext Schlüssel Wert Code

33 V G 6 B

E O 14 S

R L 11 C

S D 3 V

C G 6 I

H O 14 V

L L 11 W

U D 3 X

E G 6 K

S O 14 G

S L 11 D

E D 3 H

L G 6 R

U O 14 I

N L 11 Y

G D 3 J

Während solche einfachen Versionen der Vigenère-Chiffre relativ leicht zu knacken sind, kann man durch Verwendung eines Schlüssels, der ebenso lang ist wie der Klartext (One-TimePad, individueller oder Wegwerfschlüssel) das Verfahren beweisbar unknackbar machen. Das Problem dabei ist allerdings, dass der Schlüssel zwischen A und B auf einem sicheren Kanal ausgetauscht werden muss. Da er genauso lang ist wie die Botschaft, gibt es nur wenige Anwendungen, wo es nicht sinnvoller ist, auf dem sicheren Kanal gleich die Botschaft selbst auszutauschen. Heutige Standardverfahren zur symmetrischen Verschlüsselung sind: • Data Encryption Standard (DES): fortlaufende Verschlüsselung von 64-Bit-Blöcken mit 56-Bit-Schlüssel; entwickelt von IBM gemeinsam mit der NSA (National Security Agency); seit 1977 empfohlen als „ausreichend sicherer“ Verschlüsselungsstandard für die USA (außer für „streng geheime“ Informationen). Seit Mai 2002 abgelöst durch den Advanced Encryption Standard (AES). • Triple-DES: Mehrfachverschlüsselung mit DES, Schlüssellänge 112 oder 168 Bits. (Achtung: Im Allgemeinen kann eine Mehrfachverschlüsselung ein Verfahren auch unsicherer statt sicherer machen.) • International Data Encryption Algorithm (IDEA): entwickelt von 1990 bis 1992 an der ETH Zürich; Blocklänge 64 Bits, Schlüssellänge 128 Bits. • CAST: entwickelt in Kanada; Schlüssellänge 64 Bits oder 128 Bits; verwandt mit DES, aber erheblich sicherer. • IDEA, Triple-DES und CAST werden in PGP verwendet (Pretty Good Privacy; freies Softwarepaket zur sicheren Kommunikation und Verschlüsselung). Das am weitesten verbreitete asymmetrische Verschlüsselungsverfahren, auf dem ein Großteil der Internet-Verschlüsselung basiert, ist RSA, benannt nach den Erfindern Rivest, Shamir und Adleman. Bei RSA wird das als „schwer“ geltende Problem der Faktorisierung ganzer Zahlen als Grundlage für die Schlüsselerzeugung verwendet. (Allerdings ist nicht einmal bekannt, ob dieses Problem NP-vollständig ist; im Gegenteil wird heute allgemein angenommen, dass es nicht NP-vollständig ist, weil sonst NP = Co-NP gelten würde (vgl. Band 1, Kapitel 10) – das bedeutet, dass es keinen mathematischen Anhaltspunkt dafür gibt, dass RSA sicher ist!) Weitere asymmetrische Verschlüsselungsverfahren sind das Merkle-Hellman-System, das auf dem NP-vollständigen Rucksackproblem beruht und das Rabin-System, das ebenfalls auf der Faktorisierung ganzer Zahlen beruht. Allerdings gibt es für keines dieser Verfahren einen Beweis ihrer Sicherheit – nicht einmal, wenn man davon ausgeht, dass für eine globale Lösung die Kenntnis des Schlüssels erforderlich ist. Die Forschungsgebiete, die sich mit der Verschlüsselung von Informationen befassen, sind die Kryptographie und die Kryptanalyse. Die Inhalte daraus können hier aus Platzgründen nur angeschnitten werden; für weiterführende Informationen siehe Vorlesungsaufzeichnung und [Wob01].

34

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Themen dieses Kapitels Die sechzehn Aufgaben dieses Kapitels beschäftigen sich mit den Grundbegriffen der Kodierung, der Fehlerbehandlung auf Basis des Hamming-Abstands, der Datenkompression durch das Verfahren von Huffman und der Verschlüsselung von Informationen durch die VigenèreVerschlüsselung.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Kodierung-Verschlüsselung.html

Aufgaben

35

Aufgaben Aufgabe 25

KOD-AB 

Fehlerkennbarkeit, Fehlerkorrigierbarkeit 



a) Erklären Sie den Begriff Hammingabstand. b) Bestimmten Sie den Hammingabstand der Wörter: • Hu f f man • Ho f mann c) Erklären Sie die Begriffe k-Fehlererkennbarkeit und k-Fehlerkorrigierbarkeit für k ∈ N. d) Wie kann man die sichere Übertragung eines Codes (im Sinne von Teilaufgabe c) erhöhen? → Lösung: S. 136

Aufgabe 26

KOD-AL 

Fehlerkennbarkeit, Fehlerkorrigierbarkeit 



Gegeben seien zwei Darstellungen der Codewörter x, y, z ∈ {0, 1} und ihres „Abstands“ voneinander. Erklären Sie den Zusammenhang zwischen dem euklidischen Abstand in den Darstellungen und dem Hammingabstand zwischen den Codewörtern. Wie lassen sich aus den Darstellungen die Formeln für die k-Fehlererkennbarkeit bzw. die k-Fehlerkorrigierbarkeit von Codes herleiten?

y

x

y

x

z z

→ Lösung: S. 137

36

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Aufgabe 27

KOD-AO

Blockkodierungen, Fehlererkennbarkeit, Fehlerkorrigierbarkeit 





Gegeben sei folgende 16-Bit-Kodierung c : α → − B16 mit α = {A, B, C, D, E, F, G, H}. c(A) = 1111 0000 0000 0000 c(B) = 0000 1111 0000 0000 c(C) = 0000 0000 1111 0000 c(D) = 0000 0000 0000 1111 c(E) = 1100 1100 0000 0000 c(F) = 0000 0000 1100 1100 c(G) = 0000 1100 1100 0000 c(H) = 1100 0000 0000 1100 a) Bestimmen Sie die Hammingzahl hc von c. b) Die Kodierung c sei k-fehlererkenn- und j-fehlerkorrigierbar. Bestimmen Sie k und j. c) Wäre es möglich, die Hammingzahl durch Anhängen eines Paritätbits zu vergrößern? d) Erfüllt c die Fano-Bedingung? e) Ist die Kodierung c injektiv? Ist die natürliche Fortsetzung von c injektiv? → Lösung: S. 138

Aufgabe 28

KOD-AN 



Fehlerkennbarkeit, Fehlerkorrigierbarkeit 



Gegeben sei eine Kodierung c mit c : α → B7 und α = { f, i, l, n, o, s, t, !}. Zeichen Code

f 0111111

i 0010011

l 0100101

n 0000000

Zeichen Code

o 1001101

s 1111001

t 1010100

! 1100010

a) Erfüllt c die Fano-Bedingung? Begründen Sie Ihre Antwort kurz. b) Berechnen Sie die Hammingzahl hc für c. Was bedeutet Ihr Ergebnis für die Fehlererkennbarkeit und die Fehlerkorrigierbarkeit des Codes?

Aufgaben

37

c) Folgende Zeichenkette wurde übertragen: 001001101000000111111100110100100111111001 101010010101001001101010010101001011100010 Was wurde hier übertragen? War die Übertragung fehlerfrei? Wenn nein, welches Zeichen wurde falsch übertragen und was sollte eigentlich übertragen werden? → Lösung: S. 139

Aufgabe 29

KOD-AP 

Kodierung, Fehlererkennbarkeit, Fehlerkorrigierbarkeit 



Es sei folgende 4-Bit-Kodierung c : α → B4 mit α = {a, b, c, d, e, f } gegeben. Zeichen Code

a 1010

b 1000

c 0010

d 1111

e 0110

f 0101

a) Ist die Kodierung c injektiv? b) Erfüllt c die Fano-Bedingung? c) Ist die natürliche Fortsetzung c der Kodierung injektiv? d) Geben Sie die Hammingzahl hc des Codes und seine Fehlererkennbarkeit sowie Fehlerkorrigierbarkeit an. e) Ändern Sie die Codewörter c(b) und c(c) so, dass die dabei entstandene Kodierung c 1-fehlererkennbar ist. f) Fügen Sie jedem Codewort der Kodierung c zwei zusätzliche Bits hinzu, sodass diese 1-fehlerkorrigierbar wird. a b c d e f

1 0 1 1 0 0

0 0 0 1 1 1

1 0 0 1 1 0

0 0 1 1 0 1 → Lösung: S. 139

38

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Aufgabe 30

KOD-AC 

Fehlererkennbarkeit, Fehlerkorrigierbarkeit 



Betrachten Sie im Folgenden den Aiken-Code c : α → B4 mit α = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Ziffer Code

0 0000

1 0001

2 0010

3 0011

4 0100

5 1011

6 1100

7 1101

8 1110

9 1111

a) Ermitteln Sie die Hammingzahl hc . Wie viel fehlererkennbar ist c, wie viel fehlerkorrigierbar? b) Im Folgenden soll c um das Prüfbit p = a0 XOR a1 XOR a2 XOR a3 für ein Codewort w = a0 a1 a2 a3 erweitert werden. 1) Geben Sie den erweiterten Code in nachfolgender Tabelle an. Legen Sie hierfür die Bitanordnung a0 a1 a2 a3 p zugrunde. a0 a1 a2 a3 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

a0 a1 a2 a3 p

2) Was bewirkt das Anhängen des Prüfbits im Codewort? Ermitteln Sie die Hammingzahl hc . Wie viele bei der Übertragung eines Codeworts aufgetretene BitFehler können erkannt, wie viele korrigiert werden? c) Der Aiken-Code c soll nun für ein Codewort w = a0 a1 a2 a3 um folgende Prüfbits erweitert werden: p1 p2 p3 p4

= a0 = a0 = a0 = a1

XOR XOR XOR XOR

a1 a2 a1 a2

XOR XOR XOR XOR

a2 a3 a3 a3

Aufgaben

39 1) Geben Sie den erweiterten Code in nachfolgender Tabelle an. Legen Sie hierfür die Bitanordnung a0 a1 a2 a3 p1 p2 p3 p4 zugrunde. a0 a1 a2 a3 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

a0 a1 a2 a3 p1 p2 p3 p4

2) Was bewirkt das Anhängen des Prüfbits im Codewort? Ermitteln Sie die Hammingzahl hc . Wie viele bei der Übertragung eines Codeworts aufgetretene BitFehler können erkannt, wie viele korrigiert werden? → Lösung: S. 140

Aufgabe 31

KOD-AM 

Huffman-Kodierung 



Entscheiden Sie, ob folgende Aussagen wahr oder falsch sind. Wahr

Falsch

Eine Huffman-Kodierung ist immer eindeutig bestimmt.





Bei der Huffman-Kodierung werden Zeichenfolgen stets auf Codewortfolgen optimaler Länge abgebildet.





Für eine eindeutige Erzeugung von Codewörtern muss eine Kodierung die Fano-Bedingung erfüllen.





Für eine eindeutige Dekodierung von Codewortfolgen muss die verwendete Kodierung die Fano-Bedingung erfüllen.





Injektive Kodierungen haben injektive natürliche Fortsetzungen.





Erfüllt eine Kodierung die Fano-Bedingung, so ist die natürliche Fortsetzung injektiv.





→ Lösung: S. 142

40

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Aufgabe 32

KOD-AE 

Huffman-Kodierung 



Erzeugen Sie anhand der durch die folgende Zeichenkette gegebenen Häufigkeitsverteilung eine Huffman-Kodierung c. Ignorieren Sie dabei auftretende Leerzeichen.

FISCHERS FRITZ FISCHT FRISCHE FISCHE Tragen Sie in die Tabelle die ermittelte Häufigkeit der Zeichen ein und erstellen Sie einen Huffman-Baum. Berechnen Sie die Codelänge L(c) und deren Ersparnis gegenüber der platzsparendsten Kodierung mit einer festen Codelänge.

Zeichen F I S C H R E T Z Häufigkeit → Lösung: S. 142

Aufgabe 33

KOD-AG 

Huffman-Kodierung 



Erstellen Sie anhand des folgenden Satzes, dessen Zeichenverteilung repräsentativ sei für einen Text, der kodiert werden soll, eine Huffman-Kodierung (Leerzeichen werden ignoriert).

ALLE WOLLEN TOLLES INFO Geben Sie insbesondere einen Huffman-Baum, die Kodierung c der einzelnen Buchstaben und die Codelänge L(c) an. → Lösung: S. 143

Aufgaben

41

Aufgabe 34

KOD-AH 

Huffman-Kodierung 



Gegeben sei folgendes Textfragment, das die Zeichen des Alphabets entsprechend ihrer relativen Häufigkeit in einem zu kodierenden Text enthalte.

EGEFUUHFEFEGHUEHHEUGFGFEEKHKUE Geben Sie eine Huffman-Kodierung c zu dieser Zeichenverteilung an. Geben Sie hierzu einen Huffman-Baum und die zugehörige Huffman-Kodierung an und berechnen Sie die Codelänge L(c) Ihrer Kodierung. → Lösung: S. 144

Aufgabe 35

KOD-AI 

Huffman-Kodierung 



Gegeben sei folgender Text-String, dessen Zeichenverteilung repräsentativ sei für einen zu kodierenden Text („-“ wird auch kodiert).

BAUER-SUCHT-BRAUER Erzeugen Sie zu der durch den String gegebenen Häufigkeitsverteilung der darin enthaltenen Zeichen eine Huffman-Kodierung c. Geben Sie insbesondere einen Huffman-Baum an. → Lösung: S. 145

Aufgabe 36 Huffman-Kodierung 

KOD-AF 





Die Zeichenverteilung in folgendem Text sei repräsentativ für Text, der zukünftig kodiert werden soll (Leerzeichen werden ignoriert).

IN ULM UND UM ULM UND UM ULM HERUM Erzeugen Sie anhand der durch den Text gegebenen Häufigkeitsverteilung eine Huffman-Kodierung c. Wie groß ist die durchschnittliche Länge eines Codewortes? → Lösung: S. 146

42

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Aufgabe 37

KOD-AJ 

Huffman-Kodierung 



Gegeben sei folgender Text, dessen Zeichenverteilung repräsentativ sei für einen zu kodierenden Text (Leerzeichen werden nicht kodiert).

BRAUER BRAUEN BIER a) Geben Sie die Häufigkeiten der Buchstaben und eine Huffman-Kodierung c für den obigen Text an. Geben Sie insbesondere einen Huffman-Baum an und berechnen Sie die zugehörige Codelänge L(c). b) Ist folgende Kodierung c auch eine Huffman-Kodierung für den oben angegebenen Text? Wenn nicht, geben Sie an, welche Bedingungen nicht erfüllt werden. Zeichen Code

R 00

B 010

E 11

A 001

U 0010

N 1110

I 1111 → Lösung: S. 148

Aufgabe 38

KOD-AQ 

Huffman-Kodierung 



In der folgenden Tabelle sind einige Zeichen mit zugehörigen erwarteten relativen Häufigkeiten für ihr Auftreten in einem zu kodierenden Text gegeben. Weitere Zeichen treten nicht auf. Zeichen Rel. Häufigkeit

D

E

I

K

L

O

R

1/15

1/6

2/15

7/30

4/15

1/30

1/10

a) Erzeugen Sie eine Huffman-Kodierung c mit der gegebenen Verteilung. b) Dekodieren Sie anhand des ermittelten Huffman-Baums den folgenden Binärstring. 010010000010000000111010111

c) Ist die berechnete minimale Kodierung eindeutig? d) Berechnen Sie die Codelänge L(c) dieser Huffman-Kodierung. e) Wie viel zusätzlichen Speicherplatz würde eine 3-Bit-Kodierung im Vergleich zu dieser Huffman-Kodierung erfordern? → Lösung: S. 149

Aufgaben

43

Aufgabe 39

KOD-AD 

Huffman-Kodierung 



a) Gegeben sei folgende Wahrscheinlichkeitsverteilung für das Auftreten der Zeichen a, b, c, d, e und f in einem zu kodierenden Text. Zeichen Wahrscheinlichkeitsverteilung

a

b

c

d

e

f

7/38

10/76

3/76

9/76

9/19

1/19

Geben Sie zu dieser Zeichenmenge eine Huffman-Kodierung c an und berechnen Sie die Länge L(c) des Codes. Wie groß wäre die Einsparung gegenüber einer Kodierung, die konstant 4 Bits pro Zeichen benötigt? b) Welche zwei Bedingungen muss ein Huffman-Code erfüllen? c) Gegeben seien folgende weitere Codewörter: g h i

0111000 1010010 1110011

Wie lautet die Hammingzahl hc des Codes? d) Geben Sie an, ob folgende Aussagen richtig oder falsch sind. Wahr

Falsch

Die Huffman-Kodierung ist ein Standard-Verfahren zur Datenkompression.





Huffman-Codes sind eindeutig bestimmt.





Die Kodierung aus c) ist 2-fehlererkennbar.





Die Kodierung aus c) ist 1-fehlerkorrigierbar.





→ Lösung: S. 150

44

4 Fehlerbehandlung, häufigkeitsabhängige Kodierung und Verschlüsselung

Aufgabe 40

KOD-AK

Vigenère-Verschlüsselung  Gegeben Sei das Alphabet







E = {!, _, a, ..., z}

Die Symbole seien in der angegebenen Reihenfolge bzw. alphabetisch mit 0, . . . , 27 durchnummeriert. a) Verschlüsseln Sie unter Verwendung des Vigenère-Verschlüsselungsverfahrens mit dem Schlüssel (_, a, b), Verschiebungsdistanz (1, 2, 3), die folgende Nachricht: a t t a c k _ a t _ d a w n b) Sie fangen die folgende Nachricht ab: ysvmbh_thslzwmfcsfhudalhhrjsmsugc_o Sie wissen, dass diese mit einem Schlüssel (k0 , k1 , k2 , k3 , k4 ) der Länge 5 nach dem Vigenère-Verschlüsselungsverfahren verschlüsselt wurde. Es ist bekannt, dass ein Teil der Originalnachricht _ e a s y _ ist. Entschlüsseln Sie den Text. → Lösung: S. 152

5

Darstellungen von Ziffern und Zahlen

Einführung Um den Computer für algebraische Berechnungen nutzbar zu machen, stellt sich die Frage, wie man Zahlen im Computer darstellt, also auf Hardwareebene auf Ketten von Nullen und Einsen abbildet. Wir unterscheiden für einzelne Ziffern sowie für die Zahlenbereiche N, Z und R (bzw. Q) unterschiedliche Arten der Kodierungen, wobei wir aufgrund der Endlichkeit eines Rechners immer nur eine echte Teilmenge dieser Zahlenbereiche darstellen können. Die wichtigsten Forderungen an eine Zahlenkodierung sind eine einfache technische Realisierung, eine leichte Konvertierbarkeit in das bzw. aus dem Dezimalsystem und eine einfache Arithmetik im Sinne einer hohen Rechengeschwindigkeit und eines geringen Schaltungsaufwands. Vor allem wegen der ersten Forderung werden wir im Folgenden ausschließlich Zahlendarstellungen betrachten, die auf den beiden Zeichen 0 und 1 (Bits) basieren. Die Darstellung eines Zahlenbereichs A ⊂ R durch Wörter über dem Alphabet {0, 1} ist formal eine Kodierung c : A → {0, 1} , während die Rückberechnung des Zahlenwerts aus einem Wort die zugehörige Dekodierung c−1 : {0, 1} → A ist. Eine Dekodierung werden wir durch einen separat definierten Index D für das in einer bestimmten Darstellung zu interpretierende Wort w ∈ {0, 1} kennzeichnen, also als wD bezeichnen. Vergleichen Sie für die in diesem Kapitel genutzte Notation auch die Anhänge A.6 und A.7. Darstellung von Ziffern Wir betrachten im Folgenden die Darstellung der Dezimalziffern d ∈ {0, . . . , 9}, die prinzipiell mit 4 Bits kodiert werden können. Es kann aber auch Gründe dafür geben, mehr als 4 Bits für ein Codewort zu verwenden, beispielsweise um durch Redundanz eine Fehlererkennung bei der Übertragung der Ziffern zu gewährleisten (vgl. Kapitel 4). In Kodierungsstandards wie ASCII (American Standard Code for Information Interchange) und EBCDIC (Extended Binary Coded Decimals Interchange Code) sind Ziffernkodierungen direkt eingebettet, wobei arithmetische Operationen auf den kodierten Ziffern zunächst nicht direkt unterstützt werden. Wir betrachten hier zusätzlich drei gängige 4-Bit-Kodierungen (Tetradenkodierungen) und eine 5-Bit-Kodierung zur Darstellung von Ziffern, die arithmetische Operationen unterstützen. Die abgebildete Tabelle stellt diese Kodierungen dar und fasst ihre wesentlichen Eigenschaften zusammen.

46

5 Darstellungen von Ziffern und Zahlen d 0 1 2 3 4 5 6 7 8 9

BCD-Code 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

Dualdarstellung jeder Dezimalziffer in 4 Bits.

Exzess-3-Code 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 Dualdarstellung von d + 3; symmetrisch zur Mitte bezüglich „Bitflip“.

Aiken-Code 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

2-aus-5-Code 11000 00011 00101 00110 01001 01010 01100 10001 10010 10100

Dualdarstellung für d ∈ {0, . . . , 4}; Dualdarstellung von d + 6 für d ∈ {5, . . . , 9}; symmetrisch.

Redundanz; jew. 2 Bits auf 1, übrige auf 0 gesetzt; dadurch 1-fehlererkennbar.

Darstellung ganzer Zahlen In diesem Abschnitt geht es um die Darstellung von Zahlen aus den Mengen N bzw. Z. Da diese Mengen unendlich viele Elemente enthalten, kann ein konkreter Computer sie nie vollständig darstellen. Stattdessen können immer nur endlich viele aufeinanderfolgende Elemente dargestellt werden. Formal stellen wir einen Bereich A = {xu , xu + 1, . . . , xo − 1, xo } ⊂ Z dar, also Zahlen zwischen einem unteren Element xu und einem oberen Element xo , üblicherweise mit xu ≤ 0 < xo . Die maximale Anzahl an Bits n, die für die Darstellung verwendet werden dürfen, bestimmt die konkreten Grenzen des darstellbaren Intervalls, das immer endlich, aber durch Erhöhung von n beliebig vergrößerbar ist. Eine erste wesentliche und naheliegende Darstellung eines Teilbereichs der natürlichen Zahlen A = {0, 1, . . . , 2n − 1} ⊂ N0 unter Nutzung von n Bits ist die Dualdarstellung. Sie ist eine spezielle Form einer b-adischen Darstellung mit b = 2, die auch dyadisches System genannt wird. Der Wert eines Wortes w = en−1 en−2 . . . e0 ∈ {0, 1} , das in Dualdarstellung zu interpretieren ist, wird als w2 geschrieben und ist definiert als w2 =de f

n−1 

ei · 2i

i=0

Zur Verdeutlichung der Beschränkung auf n Bits (u. U. mit führenden Nullen) kann, wie auch bei den folgenden Darstellungen, der Index zu w2,n erweitert werden. Fehlt dieser Zusatz, wird das kleinste n angenommen, mit dem die Zahl noch darstellbar ist. Die Dualdarstellung bildet die Grundlage für alle anderen hier behandelten Zahlendarstellungen. So ist eine einfache Methode, auch negative Zahlen darzustellen, also den Zahlenbereich A = {−2n−1 + 1, . . . , 0, . . . , 2n−1 − 1} ⊂ Z, die Vorzeichen-Betrag-Darstellung (VZB). Dabei wird einfach ein zusätzliches Vorzeichen-Bit v ∈ {0, 1} der Dualdarstellung w vorangestellt. Ist

Einführung

47

dieses Bit v = 0, wird der Wert (vw)VZB des Wortes vw in VZB (unnegiert) als Dualdarstellung w2 interpretiert, sonst als dessen Negation −w2 (die Null hat also zwei Darstellungen): (vw)VZB =de f (−1)v · w2 Die VZB hat allerdings einige Nachteile bei der Berechnung arithmetischer Operationen. Eine andere Möglichkeit, ganze Zahlen darzustellen, ist die Exzess-q-Darstellung. Dabei wird ein Wort w als Dualzahl interpretiert und von dem sich ergebenden Wert w2 eine positive Konstante q ∈ N abgezogen. Es wird also der Zahlenbereich A = {−q, . . . , 0, . . . , 2n − q − 1} ⊂ Z dargestellt. Der Wert wExzess-q des Wortes w in Exzess-q-Darstellung ergibt sich als wExzess-q =de f w2 − q Da q konstant ist, muss es nicht zusätzlich kodiert werden, sondern ist Teil der Darstellung. Für manche arithmetische Operationen auf Hardwareebene (beispielsweise Vergleichsoperationen) ist es vorteilhaft, dass bei der Exzess-q-Darstellung die Ordnung der Zahlen entsprechend der Ordnung bei der Dualdarstellung erhalten bleibt, was bei der VZB nicht der Fall ist. Eine weitere Art, ganze Zahlen im Bereich A = {−2n−1 + 1, . . . , 0, . . . , 2n−1 − 1} ⊂ Z darzustellen, ist die Einskomplement-Darstellung. Dabei ist das Einskomplement e : {0, 1} → {0, 1} eines Wortes w ∈ {0, 1} definiert als ein Wort derselben Länge, bei dem jedes Bit „geflippt“, also 0 durch 1 und 1 durch 0 ersetzt ist. Bei der Einskomplement-Darstellung wird eine positive Zahl x im angegebenen Bereich als Dualzahl von x mit mindestens einer führenden Null kodiert, und eine negative Zahl x als Einskomplement der Einskomplement-Darstellung von −x . Der Wert eines Wortes w = uv, mit u ∈ {0, 1}, v ∈ {0, 1} , in Einskomplement-Darstellung, w1K , ist definiert als ⎧ ⎪ ⎪ falls u = 0 ⎨v2 , w1K =de f ⎪ ⎪ ⎩−(e(v))2 sonst Bemerkung: Beachten Sie die Unterscheidung des Begriffs „Einskomplement“, der lediglich einen „geflippten“ Binärstring bezeichnet, vom Begriff „Einskomplement-Darstellung“, der die Art, eine Zahl darzustellen, bezeichnet. Um das Problem einer „doppelten Null“ bei der Einskomplement-Darstellung zu umgehen (0 und 1 werden beide zu Null dekodiert), nutzt die Zweikomplement-Darstellung ein um eins verschobenes Komplement bei negativen Zahlen, das sogenannte Zweikomplement. Der darstellbare Zahlenbereich erweitert sich dadurch zu A = {−2n−1 , . . . , 0, . . . , 2n−1 −1} ⊂ Z. Während sich die Darstellung positiver Zahlen nicht ändert (Null wird durch n Nullen kodiert), wird nun eine negative Zahl x als Einskomplement der Zweikomplement-Darstellung von −x − 1 dargestellt. Der Wert eines Wortes w = uv, u ∈ {0, 1}, v ∈ {0, 1} in Zweikomplement-Darstellung, w2K , ist definiert als ⎧ ⎪ ⎪ falls u = 0 ⎨v 2 , w2K =de f ⎪ ⎪ ⎩−(e(v))2 − 1 sonst Bemerkung: Einfach gesagt erhält man die Zweikomplement-Darstellung einer negativen Zahl durch Flippen der Bits der Dualdarstellung der positiven Zahl und bitweises addieren von 1 (bei der Einskomplement-Darstellung fällt die Addition von 1 weg). Umgekehrt subtrahiert man von einem Binärstring bitweise eine 1 und flippt ihn, um von der Zweikomplement-Darstellung

48

5 Darstellungen von Ziffern und Zahlen

einer negativen Zahl auf die Dualdarstellung der positiven Zahl (also des Absolutwerts) zu kommen. Beide Komplementdarstellungen haben den Vorteil, dass für Addition bzw. Subtraktion zwischen positiven und negativen Zahlen keine Fallunterscheidung getroffen werden muss. Eine allgemeinere Beschreibung und Motivation von Komplementdarstellungen wird in der Vorlesungsaufzeichnung gegeben. Darstellung reeller oder rationaler Zahlen Bei der Darstellung reeller bzw. rationaler Zahlen als n-Bit-Wörter werden die meisten Zahlen nur approximiert dargestellt. Dabei gibt es zwei wesentliche Darstellungsarten, die einen unterschiedlichen Umgang mit der Darstellungsgenauigkeit ermöglichen. Die Festpunkt-Darstellung ist eine naheliegende Erweiterung der Dualdarstellung, wobei konstant m Bits für die dualen Nachkommastellen reserviert werden; somit bleiben k = n − m Bits für die Vorkommastellen übrig. Die Nachkommastellen werden nun ebenso dyadisch dargestellt wie die Vorkommastellen, nur dass in diesem Bereich negative Zweierpotenzen verwendet werden. Der Wert eines Wortes w = ek−1 ek−2 . . . e0 , e−1 e−2 . . . e−m (das Komma dient der Verdeutlichung und wird nicht kodiert), das in Festpunkt-Darstellung zu interpretieren ist, wird als wFPZ geschrieben und ist definiert als k−1 

wFPZ =de f

ei · 2i

i=−m

In Festpunkt-Darstellung haben zwei aufeinanderfolgende darstellbare Zahlen immer exakt denselben Abstand voneinander. Die Gleitpunkt-Darstellung ermöglicht eine flexible Genauigkeit je nach Größe der dargestellten Zahlen (große Zahlen werden also weniger genau dargestellt als kleine Zahlen). Dabei nimmt die Dichte der darstellbaren Zahlen mit ihrer Größe ab. Wie bei der im Dezimalsystem bei wissenschaftlichen Berechnungen üblichen Darstellung einer Zahl als normierte Gleitpunktzahl m · 10e , mit einer Mantisse 1 ≤ m < 10 ∈ Q und einem Exponenten e ∈ Z (Beispiele: 1,234 · 103 ; −7,34412883 · 10−100 ), kann eine Zahl auch im Dualsystem als normierte Gleitpunktzahl m · 2e mit 1 ≤ m < 2, m ∈ Q, dargestellt werden. Wir reservieren dabei k Bits für die Mantisse mit Vorzeichen und n − k Bits für den Exponenten. Zunächst stellt man fest, dass durch die Normierung immer eine 1 „vor dem Komma“ in m stehen muss. Sie muss also nicht explizit kodiert werden, sondern wir können das dadurch „freigewordene“ Bit für eine höhere Genauigkeit nutzen. Wir ziehen also 1 vom Betrag der Mantisse ab und kodieren nur noch diese vereinfachte Mantisse in VZB, während e in Exzessq-Darstellung kodiert wird. Dabei wählen wir q so, dass der positive und der negative Bereich ungefähr gleich viele darstellbare Zahlen enthält. Das erreicht man durch q = 2n−k−1 − 1 (denn 2n−k/2 = 2n−k−1 ) Das Vorzeichen der vereinfachten Mantissen-Darstellung nennen wir v, ihren Betrag m und die Darstellung des Exponenten e heißt Charakteristik c. Die gesamte Gleitpunkt-Darstellung w besteht also aus den Bereichen w = en−1 en−2 . . . ek−1 ek−2 . . . e0    v

c

m

Einführung

49

und ihr Wert wGPZ ergibt sich zu (der Index 2 steht für die Interpretation als Dualzahl) wGPZ =de f (−1)v · (1 + m2 ) · 2c2 −q Wichtige und verbreitet eingesetzte Beispiele für Gleitpunkt-Darstellungen sind die nach dem IEEE-Standard 754 definierten und in vielen Programmiersprachen verwendeten Darstellungen der einfachen (32 Bits; davon 8 Bits für Charakteristik, 23 Bits für Mantisse; Datentyp float), doppelten (64 Bits; davon 11 Bits für Charakteristik, 52 Bits für Mantisse; Datentyp double) und vierfachen (128 Bits; davon 15 Bits für Charakteristik, 112 Bits für Mantisse; Datentyp quadruple) Genauigkeit. Bei diesen Darstellungen sind noch einige Sonderfälle definiert, die beachtet werden müssen: a) Denormalisierte Zahlen: für c2 = 0 gilt wGPZ =de f (−1)v · m2 · 2c2 −q . Es wird also bei sehr kleinen Zahlen zugunsten einer höheren Genauigkeit auf die führende implizite 1 verzichtet. b) Darstellung der Null: für c2 = 0 und m2 = 0 gilt wGPZ = 0 (dies ergibt sich aus a)). c) Darstellung von „Unendlich“: ist c maximal und m2 = 0, gilt wGPZ =de f (−1)v · ∞. d) Darstellung von „Not a Number“: ist c maximal und m2  0, gilt wGPZ =de f NaN. Die Sonderwerte 0, ∞ und NaN können explizit zugewiesen werden oder durch Berechnungen entstehen (so wird die Berechnung von n/0 für n > 0 zu ∞, für n < 0 zu −∞ und zu NaN für n = 0), und sie werden durch gesonderte Rechenregeln behandelt. Kommentar: Die Begriffe „Festpunkt-Darstellung“ und „Gleitpunkt-Darstellung“ sind Übersetzungen aus dem Englischen und im Deutschen etwas ungenau, denn statt eines Dezimalpunktes schreiben wir üblicherweise ein Dezimalkomma. Manchmal werden daher auch die exakteren Begriff „Festkomma-Darstellung“ bzw. „Gleitkomma-Darstellung“ benutzt. Themen dieses Kapitels In den dreizehn Aufgaben dieses Kapitels werden Konvertierungen aus der Dezimaldarstellung in die hier eingeführten Darstellungen und umgekehrt behandelt sowie arithmetische Berechnungen innerhalb einer Darstellung durchgeführt. Darüber hinaus werden allgemeine Fragen zur Zahlendarstellung behandelt.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Darstellungen-Ziffern-Zahlen.html

50

5 Darstellungen von Ziffern und Zahlen

Aufgaben Aufgabe 41

KOD-AA 

Zahlendarstellung: EBCDIC, BCD, Aiken, Exzess-q 



a) Welche gebräuchlichen n-Bit-Codes zur Darstellung fester Zeichensätze gibt es? Aus wie vielen Bits besteht jeweils die Kodierung eines Zeichens? b) Stellen Sie die Zahlen 5 und 7 als EBCDIC dar. c) Wie funktioniert die Tetradenkodierung? Nennen Sie mindestens 3 Vertreter dieser Kodierung. d) Kodieren Sie folgende Ziffern als BCD-Code, Exzess-3-Code sowie Aiken-Code. Zahl / Kodierung 2 6 9

BCD

Aiken

Exzess-3

e) Gegeben seien folgende Strings. String 10001001011010000100100101000011 01000000000111010011001010110001 01110011010110100100101101100101

BCD

Aiken

Exzess-3

1) Kreuzen Sie jeweils an, um welche Codes es sich dabei handeln könnte. Mehrfachnennungen sing möglich. 2) Geben Sie jeweils den Dezimalwert der Strings für die passenden Kodierungen an. → Lösung: S. 153

Aufgaben

51

Aufgabe 42

ZAH-AE 

Zahlendarstellung: Exzess-q, BCD, Aiken, Zweikomplement 



a) Im Folgenden sollen 4 Bits zur Darstellung von Zahlen verwendet werden. Geben Sie die Zahl 8 in folgenden Darstellungsarten an: • Exzess-3-Darstellung • BCD-Darstellung • Aiken-Darstellung b) Geben Sie an, wie die Zahl 235 in BCD-Darstellung aussieht, wenn 12 Bits zur Verfügung stehen. c) Geben Sie die Zahlen 5 und −7 in Zweikomplement-Darstellung an und addieren Sie die Zahlen direkt in der Zweikomplement-Darstellung. → Lösung: S. 154

Aufgabe 43

ZAH-AB 

Zahlendarstellung: Einskomplement, Zweikomplement 



a) Welcher Zahlenbereich kann in der Zweikomplement-Darstellung mit n = 8 dargestellt werden? Geben Sie die Zahlen 62 und −37 in dieser Darstellung an. Wie berechnet man deren Differenz ohne Umwandlung in Dezimalzahlen? b) Was sind die Unterschiede zu a), wenn man statt der Zweikomplement-Darstellung die Einskomplement-Darstellung zugrunde legt? → Lösung: S. 155

52

5 Darstellungen von Ziffern und Zahlen

Aufgabe 44

ZAH-AI 

Zahlendarstellung: Zweikomplement, Vorzeichen-Betrag 



a) Geben Sie den Zahlenwert −128 in der Zweikomplement-Darstellung mit 32 Bits an. b) Geben Sie den Zahlenwert 8193 in der Zweikomplement-Darstellung mit 32 Bits an. c) Geben Sie die Zahlenwerte 33 und −17 in der Vorzeichen-Betrag-Darstellung sowie in der Zweikomplement-Darstellung mit jeweils 16 Bits an. → Lösung: S. 156

Aufgabe 45

ZAH-AK 

Zahlendarstellung: Einskomplement, Zweikomplement 



a) Erläutern Sie, wie die arithmetischen Operationen Negation, Addition und Subtraktion in der Einskomplement-Darstellung durchgeführt werden. Welcher Zahlenbereich kann mit n Bits dargestellt werden? b) Erläutern Sie, wie die arithmetischen Operationen aus Aufgabenteil a) in der Zweikomplement-Darstellung durchgeführt werden. Welcher Zahlenbereich ist darstellbar? c) Schreiben Sie die Zahl +7 in der Eins- bzw. Zweikomplement-Darstellung mit 4 Bits. d) Schreiben Sie die Zahl −7 in der Eins- bzw. Zweikomplement-Darstellung mit 4 Bits. e) Schreiben Sie die Zahl +12 in der Eins- bzw. Zweikomplement-Darstellung mit 4 Bits. → Lösung: S. 156

Aufgabe 46 Zahlendarstellung: IEEE-754 

ZAH-AD 



a) Beschreiben Sie, wie allgemein die Berechnung des Dezimalwerts G(z) einer Zahl z in Gleitpunkt-Darstellung nach IEEE-754 mit einfacher Genauigkeit funktioniert. b) Geben Sie die Zahl −2052/128 in IEEE-754-Darstellung an. → Lösung: S. 158

Aufgaben

53

Aufgabe 47

ZAH-AH 

Zahlendarstellung: IEEE-754 



a) Geben Sie die Dezimalzahl −13 97/128 = −13, 7578125 in Gleitpunktdarstellung nach IEEE-754 mit einfacher Genauigkeit an. b) Geben Sie den Dezimalwert G(x) der folgenden Gleitpunktzahl x gemäß IEEE-754 an: x = 1 10011011 01110010000000000000000

→ Lösung: S. 159

Aufgabe 48

ZAH-AA 

Zahlendarstellung: IEEE-754 



Gegeben sei eine IEEE-754-ähnliche 8-Bit-Darstellung von Gleitpunktzahlen, bei der ein Binärstring z ∈ B8 aufgeteilt ist in ein Bit v, das für das Vorzeichen steht, 3 Bits c2 c1 c0 für die Charakteristik und 4 Bits m−1 m−2 m−3 m−4 für die Mantisse: z = v c2 c1 c0 m−1 m−2 m−3 m−4 Der Zahlenwert von z wird nach der für Gleitpunktzahlen üblichen Formel berechnet. Bestimmen Sie die Dezimalwerte folgender Zahlen: • 0 101 1101 • 1 001 0001 • 1 110 1110 → Lösung: S. 160

54

5 Darstellungen von Ziffern und Zahlen

Aufgabe 49

ZAH-AJ

Zahlendarstellung: Zweikomplement, IEEE-754 







a) Stellen Sie die beiden Werte −12,43 und 27,875 möglichst genau als Festpunktzahlen mit jeweils 16 Vor- und 16 Nachkommabits dar. Nutzen Sie die ZweikomplementDarstellung. b) Stellen Sie die beiden Zahlen aus Teilaufgabe a) möglichst genau als Gleitpunktzahlen gemäß IEEE-754 mit einfacher Genauigkeit dar. c) Addieren Sie die beiden Zahlen aus den vorherigen Teilaufgaben jeweils in Festpunktbzw. Gleitpunkt-Darstellung. → Lösung: S. 160

Aufgabe 50

ZAH-AG 

Zahlendarstellung: BCD, Vorzeichen-Betrag, Eins-, Zweikomplement u. a. 



Gegeben sei der folgende 32-Bit-Binärstring: x = 1001 1001 0100 0000 0000 0000 0000 1000 Welcher Zahlenwert wird durch den Binärstring kodiert, wenn dieser interpretiert wird als a) BCD-Zahl b) Zahl zur Basis 2 c) Dualzahl in Vorzeichen-Betrag-Darstellung d) Dualzahl in Einskomplement-Darstellung e) Dualzahl in Zweikomplement-Darstellung f) Gleitpunktzahl in IEEE-754-Darstellung mit einfacher Genauigkeit → Lösung: S. 163

Aufgaben

55

Aufgabe 51

ZAH-AF 

Zahlendarstellung: IEEE-754, BCD, Einskomplement 



a) Stellen Sie die Dezimalzahl −50,25 als Gleitpunktzahl mit einfacher Genauigkeit gemäß IEEE-754 dar. b) Stellen Sie die Dezimalzahl 983400 als BCD-Zahl mit 32 Bits dar. c) Stellen Sie die Dezimalzahl −1236 als Einskomplement mit 16 Bits dar. → Lösung: S. 164

Aufgabe 52

ZAH-AC

Zahlendarstellung: Einskomplement, Zweikomplement, IEEE-754 





a) Geben Sie die Dezimalzahl −21 als Zahl in der Einskomplement-Darstellung mit 8 Bits an. b) Geben Sie die Dezimalzahl −21 als Zahl in der Zweikomplement-Darstellung mit 8 Bits an. c) Geben Sie den Dezimalwert G(z) des folgenden Bitstrings z in IEEE-754-Darstellung mit einfacher Genauigkeit an. z = 0 10000011 01010101000000000000000

d) Welche Bedeutung hat bei der IEEE-754-Darstellung das implizite Bit der Mantisse und warum wird es nicht explizit dargestellt? → Lösung: S. 165

56

5 Darstellungen von Ziffern und Zahlen

Aufgabe 53

VER-AC 

Kodierung und Zahlendarstellung 



Geben Sie an, ob folgende Aussagen wahr oder falsch sind. Wahr

Falsch

Die BCD-Kodierung benötigt weniger Bits zur Speicherung einer Zahl als eine auf den Ziffern dieser Zahl basierende Huffman-Kodierung.





Zu einer gegeben n-Bit-Kodierung (also Zuordnung von Zeichen zu Bitfolgen) lässt sich ohne weitere Angaben eine äquivalente Huffman-Kodierung angeben.





Beschränkt man die IEEE-754-Darstellung auf die Regel, dass Zahlen als (−1)v ·(1+m )c−q darzustellen sind (mit der bekannten Bedeutung der Variablen), so kann man zwar unendlich nicht mehr darstellen, die Null aber schon.





Die Subtraktion einer Zahl b von einer Zahl a erfolgt in der Zweikomplement-Darstellung durch die Addition des Komplements von b zu a und der anschließenden Addition von 1.





Die Kodierung der Telefonnummern beim Impulswahlverfahren erfüllt die Fano-Bedingung.





Die n-stellige Paritätsfunktion gibt an, ob in einem Wort w ∈ {0, 1}n die Anzahl der Einsen derart ist, dass sich aus den Einsen Paare bilden lassen, ohne dass nach der Aufteilung eine Eins alleine übrigbleibt.





→ Lösung: S. 165

6

Rechnerarchitektur, Speicherorganisation und Internettechnologie

Einführung Dieses Kapitel beschäftigt sich mit der grundlegenden Funktionsweise von Rechnern und Rechnernetzen. Im Zentrum steht das Konzept des Von-Neumann-Rechners, der die abstrakte Architektur eines universellen Rechners festlegt. Darauf aufbauend werden die heute verwendeten konkreten Komponenten eines Rechners in diese Architektur eingeordnet und zum Schluss die Einbettung des Von-Neumann-Rechners in moderne Netze wie das Internet behandelt. Von-Neumann-Architektur Die Von-Neumann-Architektur beschreibt das klassische Konzept eines Universalrechners, das auch modernen Rechnern zugrunde liegt. Die folgende Abbildung zeigt die wesentlichen Bestandteile eines Von-Neumann-Rechners und die Kommunikationskanäle, über die sie untereinander verbunden sind:

Datenfluss

Steuerwerk S Rechenwerk

Eingabewerk

Speicherwerk

Steuerfluss CPU

Ausgabewerk

Das Rechenwerk ist der funktionelle Kern eines Rechners, in dem logische und arithmetische Operationen berechnet sowie Vergleiche und logische Entscheidungen durchgeführt werden. Es enthält Register und Funktionseinheiten („arithmetic logic unit“ – ALU). Register dienen der Speicherung von Operanden und Resultaten von Operationen (ausgezeichnete Akkumulatorregister speichern während einer Rechnung benötigte Zwischenergebnisse) oder Zustandsbeschreibungen von Funktionseinheiten. Eine ALU verknüpft die in den Registern gespeicherten Operanden zu einem Ergebnis. Typische Operationen sind Laden und Speichern sowie Boolesche, arithmetische und Schiebeoperationen.

58

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Art und Reihenfolge der auszuführenden Operationen werden durch das Steuerwerk (auch Leitwerk genannt) bestimmt. Es dient der Ausführung der in einem Programm niedergelegten Arbeitsvorgänge und der Kontrolle der dazu notwendigen Informationsflüsse. Wegen seiner engen Verbundenheit mit dem Rechenwerk ist es in heutigen Rechnern üblicherweise mit diesem zur Central Processing Unit (CPU) zusammengefasst. Das Steuerwerk besitzt ein Instruktionsregister, das den gerade auszuführenden Befehl enthält, und einen Befehlszähler („program counter“ – PC) mit dessen Adresse im Arbeitsspeicher. Für jeden Befehl führt das Steuerwerk den sogenannten Maschinenbefehlszyklus aus (vgl. dazu auch Kapitel 7). Dafür wird 1) der Befehl gemäß PC adressiert und aus dem Arbeitsspeicher geladen (FETCH), 2) die Befehlsart erkannt und dabei der Befehl in Operations- und Operandenteil zerlegt (DECODE) und 3) die Befehlsausführung initiiert, also alle an der Befehlsausführung beteiligten Funktionseinheiten werden mit den notwendigen Steuersignalen versorgt (EXECUTE). Zu 3) gehört insbesondere das Adressieren und Laden der Operanden, das Ausführen der Operation, das Speichern des Ergebnisses und die Veränderung von PC. Viele heutige Rechner haben mehrere Rechen- und Steuerwerke auf der CPU, um eine echte Parallelverarbeitung zu ermöglichen. Das Speicherwerk dient der Speicherung von Programmen und Daten; es wird in heutigen Rechnern durch eine Speicherhierarchie repräsentiert, deren zentrale Komponente der Arbeitsspeicher (auch Hauptspeicher, Primärspeicher) ist. Er wird heute durch SRAM- (static Random Access Memory) oder DRAM- (dynamic Random Access Memory) Technologie realisiert. Der Arbeitsspeicher ist unterteilt in durchnummerierte Einheiten gleicher Größe von k Bits (k typischerweise Vielfaches von 1 Byte = 8 Bits), die man Speicherzellen nennt und auf die mittels Zahlen (0, . . . , 2n ∈ N0 ), sogenannten Adressen, direkt zugegriffen werden kann. Daten, die zu einem aktuellen Zeitpunkt vom Rechenwerk zum Arbeiten benötigt werden, werden in einem kleineren, aber schnelleren Zwischenspeicher abgelegt, der Cache genannt wird, siehe unten. Noch schneller sind einige wenige direkt auf der CPU befindliche Speicherzellen (Register), die für Daten genutzt werden, die unmittelbar in anstehenden Rechenoperationen benötigt werden. Für sehr große Datenblöcke und Daten, die permanent gespeichert werden sollen, gibt es dagegen Externspeicher wie beispielsweise Festplatten, die zwar größer sind als der Arbeitsspeicher, aber nur einen sehr viel langsameren Zugriff auf Daten erlauben. Eingabe- und Ausgabewerk dienen der Eingabe von Programmen und Daten in den Speicher sowie der Ausgabe von Ergebnissen „nach außen“. Für heutige Rechner gibt es eine große Auswahl an Peripheriegeräten, die als Eingabe- und Ausgabewerk dienen können. Das Funktionsprinzip eines Von-Neumann-Rechners basiert auf der Ausführung von Berechnungen durch getaktete Folgen globaler Zustandsänderungen, also durch eine Folge von Änderungen des Speicherinhalts. Ähnlich wie bei einer universellen Turingmaschine (vgl. Band 1, Kapitel 8) ist dabei die Struktur eines Von-Neumann-Rechners unabhängig von den zu bearbeitenden Problemen. Für jedes Problem wird eine Bearbeitungsvorschrift, also ein aus sequentiellen Befehlen bestehender Algorithmus (Programm), binär kodiert „von außen“ eingegeben und im Speicher abgelegt. Dabei liegen aufeinanderfolgende Befehle in aufeinanderfolgenden Speicherzellen, der nächste Befehl kann also durch Abfragen der um eins inkrementierten Adresse des aktuellen Befehls abgerufen werden (außer bei Sprungbefehlen; vgl. Kapitel 7).

Einführung

59

Buszuteilung Die in der obigen Abbildung angedeutete gerichtete „Verdrahtung“ der Komponenten eines Von-Neumann-Rechners untereinander, welche die interne Kommunikation ermöglicht, wird in modernen Rechnern meist durch einige wenige zentrale Busse ersetzt, auf die alle Komponenten schreibend und lesend zugreifen können. Busse sind Datensammelwege, die mehrere Bits auf einmal ungerichtet übertragen können; die Anzahl der parallel übertragbaren Bits wird Bandbreite genannt. Üblicherweise gibt es in einem Rechner drei Arten von Bussen, die für die Übertragung von Daten (Datenbus), Adressen (Adressbus) und Steuerbefehlen (Steuerbus) zuständig sind. Busse sind günstig in der Produktion und können leicht erweitert werden, dafür benötigen sie aber eine kompliziertere Steuerungslogik für die Zuteilung von Übertragungszeiten an die Komponenten. Dazu wird entweder eine zentrale Bussteuereinheit eingesetzt oder die Komponenten handeln dezentral Übertragungszeiten aus. Im zentralen Fall wird entweder eine eigene Meldeleitung für jeden potentiellen Sender eingesetzt, über die Sendewünsche angemeldet werden können, oder die Bussteuereinheit fragt Teilnehmerwünsche ab (Polling). Darüber hinaus kann auch eine unter den Teilnehmern „kreisende“ Zuteilung (zyklische Buszuteilung) unabhängig von Übertragungswünschen sinnvoll sein. Im dezentralen Fall gibt es verschiedene Verfahren, durch die jeder Teilnehmer lokal entscheidet, ob er den Bus nutzen kann oder nicht. • „Daisy Chain“: Über eine gemeinsame Meldeleitung wird übermittelt, wenn ein Teilnehmer Sendewünsche hat. Daraufhin wird ein Verfügbarkeitssignal von einem Teilnehmer zum nächsten „weitergereicht“, bis es zum ersten unter möglicherweise mehreren sendewilligen Teilnehmer kommt, der das Signal „verschluckt“ und im Anschluss senden darf. Wenn er fertig ist, wird auf einer gemeinsamen Leitung ein Freigabesignal übertragen. Dieses Verfahren muss nicht unbedingt fair sein. • „Parallele Abfrage“: Jeder Sender hat eine eindeutige Priorität und kann einen Sendewunsch über eine für alle sichtbare Meldeleitung übertragen. Der sendewillige Teilnehmer mit der höchsten Priorität darf senden. • „Zyklische Buszuteilung“ oder „Token-Ring“: Ein Berechtigungssignal „kreist“ von einem Teilnehmer zum nächsten und kann von einem Sendewilligen „aufgehalten“ werden, solange er sendet. • „CSMA-Verfahren“ (carrier sense multiple access): Jeder sendewillige Teilnehmer sendet, falls der Bus frei ist; eventuelle Kollisionen müssen separat behandelt werden. Die durch Busse im Vergleich zur direkten Verdrahtung verlangsamte Datenübertragung trägt zum sogenannten physikalischen Von-Neumann-Engpass bei; so wird der Flaschenhals bezeichnet, der dadurch entsteht, dass üblicherweise eine große Menge an Daten zwischen CPU und Arbeitsspeicher transportiert werden muss, was um ein Vielfaches länger dauert als die gleichzeitig in der CPU anfallende Last durch die Ausführung von Befehlen; das führt zu unerwünschtem Leerlauf der CPU. Ein weiterer typischer Engpass in Von-Neumann-Rechnern ist der sogenannte intellektuelle Von-Neumann-Engpass, der aus der strengen Sequentialisierung von Befehlen im Von-Neumann-Rechner hervorgeht (s. o.); im Gegensatz zu Computern arbeiten und denken Menschen nicht sequentiell, sondern lösungsorientiert, was die Programmierung von Rechnern erschwert.

60

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Pipelining Pipelining ist eine Methode zur Beschleunigung von Arbeitsvorgängen im Rechner durch Aufteilen einer Gesamtaufgabe in mehrere Teilaufgaben, die von unterschiedlichen Bearbeitungseinheiten (Prozessorteilen oder Prozessoren) parallel bearbeitet werden können. Die Idee ist angelehnt an die Fließbandarbeit in modernen Fabriken, wo an jeder Station eine Teilbearbeitung eines Werkstücks stattfindet, bis nach Durchlaufen des gesamten Fließbands die Gesamtbearbeitung abgeschlossen ist. Dabei ergibt sich die effizienteste Bearbeitung, wenn möglichst genauso viele Werkstücke gleichzeitig auf dem Fließband sind, wie es Bearbeitungsstationen gibt. Wie bei Fließbändern ist auch beim Pipelining eine Grundvoraussetzung, dass die Teilaufgaben möglichst gleichlang dauern und nacheinander ausgeführt werden können. Der Arbeitsrhythmus wird von einem globalen Taktgeber gesteuert, dessen Frequenz durch die langsamste Bearbeitungseinheit festgelegt wird. Die folgende Abbildung zeigt schematisch die Durchführung von k Aufgaben desselben Typs, die aus den n Teilaufgaben A1,i , . . . , An,i (i ∈ {1, . . . , k}) bestehen und von den Bearbeitungseinheiten BE1 , . . . , BEn bearbeitet werden: Takt 1 2 3 4 .. .

n−2 n−1 n n+1 .. .

BE1 A1,1 A1,2 A1,3 A1,4 .. .

BE2 − A2,1 A2,2 A2,3 .. .

BE3 − − A3,1 A3,2 .. .

BE4 − − − A4,1 .. .

... ... ... ... ... .. .

BEn−2 − − − − .. .

A1,n−2 A1,n−1 A1,n A1,n+1 .. .

A2,n−3 A2,n−2 A2,n−1 A2,n .. .

A3,n−4 A3,n−3 A3,n−2 A3,n−1 .. .

A4,n−5 A4,n−4 A4,n−3 A4,n−2 .. .

... ... ... ... .. .

An−2,1 An−2,2 An−2,3 An−2,4 .. .

BEn−1 − − − − .. . − An−1,1 An−1,2 An−1,3 .. .

BEn − − − − .. . − − An,1 An,2 .. .

Wie man sieht, ist die Pipeline frühestens im n-ten Takt vollständig ausgelastet. Solange sie vollständig ausgelastet ist, bewirkt sie eine n-fache Parallelverarbeitung und bei k Aufgaben und n Teilaufgaben (und gleicher Länge aller Teilaufgaben) eine Reduktion von n · k auf n + k − 1 benötigte Takte zur Durchführung der Aufgaben. So konnten in den n + 1 Takten in der obigen Abbildung schon k = 2 Aufgaben vollständig ausgeführt werden, und im nächsten Takt wären es schon 3. Unter Umständen kann es aber auch Aufgabentypen geben, die zwischenzeitlich die Pipeline leerlaufen lassen müssen. Ein wichtiges Beispiel für Pipelining in Computern ist das Befehlsphasen-Pipelining, wobei ein einzelner auszuführender Befehl in mehrere Teilaufgaben (beispielsweise FETCH, DECODE und EXECUTE) aufgeteilt wird. Dabei kann es zum Leerlaufen der Pipeline kommen, wenn eine Teilaufgabe vom Ergebnis einer späteren Teilaufgabe abhängt. Beispielsweise hängt bei einem bedingten Sprungbefehl der auszuführende Folgebefehl von der Auflösung der Sprungbedingung ab. Moderne Prozessoren können bis zu 30-stufige Pipelines mit komplexen Abhängigkeiten untereinander haben. Um das Leerlaufen zu vermeiden, wird das Verfahren der spekulativen Programmausführung angewendet, wobei mögliche Folgebefehle „auf Verdacht“ ausgeführt werden, beispielsweise durch Vorausschätzung eines Test- oder Rechenergebnisses. Wenn eine solche Schätzung fehlerhaft war, muss allerdings die Ausführung korrigiert werden.

Einführung

61

Dennoch ergibt sich durch diese Technik ein erheblicher Zeitgewinn gegenüber nichtspekulativer Ausführung. Allgemein unterscheidet man Pipelines 1) nach der Ebene der Anwendung (Befehlsebene: Befehlsphasen-Pipelining; oder Ebene der Elementaroperationen: arithmetisches Pipelining, beispielsweise Zerlegung von Gleitpunkt-Multiplikation, Gleitpunkt-Addition usw. in Teilaufgaben – Bearbeitungseinheiten sind dann Addierwerke, Shifter usw.) und 2) nach der Änderbarkeit ihrer Funktion (Einfunktions-Pipeline: immer nur dieselbe Folge von Operationen ist ausführbar; oder Multifunktions-Pipeline: verschiedene Operationsfolgen sind einstellbar). Speicherorganisation Ein Speicher ist eine Einrichtung, in der Daten (dazu gehören auch Programme) für eine gewisse Zeit abgelegt und wieder abgerufen werden können. Der Zugriff auf Daten in einem Speicher ist meist adressbasiert und kann auf folgende Arten erfolgen: • Wahlfrei (direkt): Jedes Speicherelement ist unabhängig von seiner physikalischen Position mit dem gleichen zeitlichen Aufwand direkt erreichbar. Beispiele: Random Access Memory (RAM; Schreib-Lese-Speicher), Read Only Memory (ROM; Nur-LeseSpeicher, beim Herstellungsprozess beschrieben oder nur unter Aufwand beschreibbar, beispielsweise durch UV-Licht). • Sequentiell: Ein Speicherelement kann nur angesteuert werden, indem alle „davor“ liegenden Speicherelemente vorher besucht werden. Die Speicherelemente sind also, abhängig von ihrer physikalischen Position auf dem Speicher, unterschiedlich schnell erreichbar. Beispiel: Magnetbandspeicher. • Blockadressierbar: Die Speicherelemente sind zu Blöcken von meist 1, 2, 4 oder 8 KiB zusammengefasst. Die Blöcke sind wahlfrei zugreifbar, innerhalb der Blöcke muss auf die Speicherelemente sequentiell zugegriffen werden. Beispiele: Disketten, Festplatten, CDs, DVDs. Darüber hinaus gibt es auch assoziativen (oder inhaltsorientierten) Zugriff auf Daten, wobei der Zugriff auf ein Speicherelement nicht über seine Adresse erfolgt, sondern über den gesuchten Inhalt. Das ist vergleichbar mit der Suche nach Text in einem Dokument oder nach einer Datei auf der Festplatte: man kennt den gewünschten Inhalt und möchte die Position finden. Ein echter Assoziativspeicher kann durch seine Hardware alle Speicherelemente gleichzeitig mit dem Suchmuster vergleichen und somit direkt auf jedes gewünschte Speicherelement zugreifen (falls ein solches vorhanden ist). Typische Anwendungen von Assoziativspeichern sind Suchvorgänge im Speicher, beispielsweise nach dem Speicherort von Daten im Cache (s. u.). Ein Nachteil ist allerdings die komplexe Vergleichslogik, die zu einer teuren Hardware führt. Die Zugriffszeit ist bei Arbeitsspeichern definiert als die Zeit zum Lesen bzw. Schreiben eines Speicherelements. Sie ist bei SRAM ca. 8-16 mal kürzer als bei DRAM, da bei dynamischen Speichern der Inhalt nach jedem Zugriff auf eine Speicherzelle wieder „aufgefrischt“ werden muss. Dafür benötigt man für SRAM 4- bis 6-mal mehr Transistoren als für einen vergleichbaren DRAM-Speicher, was zu höheren Kosten führt. Bei Platten- und Bandspeichern ist die

62

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Zugriffszeit etwas abweichend definiert als die Zeit zum „Erreichen“ eines gewünschten Speicherelements. Diese Zeit ist hier erheblich höher als beim Arbeitsspeicher, es werden dafür aber stets Blöcke von Daten übertragen, die man durch geschickten Zugriff kombiniert nutzen kann. Speicher können nach ihrer Energieabhängigkeit unterschieden werden. Ein energieabhängiger (flüchtiger) Speicher benötigt Strom zum Erhalten seines Zustands und er verliert seinen Inhalt, wenn ihm der Strom entzogen wird. Das bekannteste Beispiel für einen energieabhängigen Speicher ist der heute übliche Arbeitsspeicher (allerdings nur der auf RAM basierende Teil, natürlich nicht ROM). Ein energieunabhängiger Speicher kann seinen Zustand und damit seinen Inhalt ohne Stromzufuhr erhalten. Beispiele dafür sind Magnetspeicher und optische Speicher.

Cache Der Cache-Speicher dient der Zwischenspeicherung von Daten, die voraussichtlich bald von der CPU benötigt werden. Er ist heute meist unterteilt in den sehr schnellen, aber kleineren L1-Cache, der auf der CPU angebracht ist („on-chip“) und den etwas langsameren, aber größeren L2-Cache; beide sind aber erheblich schneller als der Hauptspeicher. Wenn die CPU ein Datum mit Adresse x aus dem Hauptspeicher laden möchte, sucht sie zunächst (assoziativ oder „directly-mapped“, s. u.) nach x im sogenannten Tag-Feld des L1-Caches. Falls x enthalten ist, ist auch der zugehörige Datenblock des Hauptspeichers im Cache gespeichert und kann von dort geladen werden. Falls nicht (Cachefehler), wird das Datum im L2-Cache und bei Nichterfolg danach im Hauptspeicher gesucht. Ist das Datum gefunden, wird es in die Caches geladen und der CPU zur Verfügung gestellt. Da die Caches deutlich kleiner sind als der Hauptspeicher, muss beim Laden eines Datums in den Cache unter Umständen ein älteres Datum gelöscht werden. Dafür gibt es verschiedene Strategien: • Directly-Mapped-Verfahren: Wenn der Cache maximal k (meist Zweierpotenz) Blöcke enthalten kann, gelangt ein Block mit Adresse x an die Position x MOD k im Cache, und im entsprechenden Tag-Feld wird der Wert x DIV k gespeichert. Nicht-AssoziativSpeicher können so durch wahlfreien Zugriff sehr schnell auf das Datum zugreifen; allerdings ist der Cache je nach „Zugriffsmuster“ unter Umständen nicht voll ausgelastet. • Assoziativ-Verfahren: Der Block kann an beliebiger Position gespeichert werden, beispielsweise an der am längsten nicht benutzten Position („Least Recently Used“). Dadurch wird die Anzahl der zu erwartenden Cachefehler reduziert, allerdings ist das Verfahren nur bei echten Assoziativ-Speichern praktikabel. In der Praxis wird meist eine Kombination der beiden Verfahren angewendet. Beim Schreiben in den Cache wird entweder die zu schreibende Information sofort an den Hauptspeicher (bzw. „nächst niedrigeren“ Speicher) weitergegeben (write-through), oder die Änderungen werden erst weitergegeben, wenn der Block im Cache durch ein neues Datum ersetzt wird (write-back). Letztere Strategie ist zeiteffizienter, kann aber bei Multiprozessorsystemen mit gemeinsamem Speicher zu Problemen führen. Typische Kennwerte heutiger Speicher fasst die folgende Tabelle zusammen:

Einführung Speicherart Halbleiter (bipolar oder CMOS): L1-Cache Halbleiter (bipolar oder CMOS), SRAM: L2-Cache Halbleiter (CMOS), DRAM Flash-Speicher/ SSD Magnetplatte Laserplatte

63 Zugriffsart

Kapazität

Zugriffszeit

Energieabh.?

Assoz.

1 − 256KiB

< 0,1 − 5ns

Ja

Wahlfr./assoz.

8KiB − 8MiB

1 − 50ns

Ja

Wahlfr.

1KiB − . . . GiB

5 − 100ns

Ja

Blockadr.

1,8MiB − 1TiB

70ns − 10ms

Nein

Blockadr. Blockadr.

20GiB − > 3TiB 150MiB − 100GiB

5 − 25ms 5 − 50ms

Nein Nein

Parallelverarbeitung Ziel der Parallelverarbeitung ist die gleichzeitige Ausführung möglichst vieler Operationen als Maßnahme zur Leistungssteigerung. Dafür werden gewisse Betriebsmittel mehrfach benötigt. Rechensysteme mit der Fähigkeit zur Parallelverarbeitung kann man anhand dieser Betriebsmittel in drei Klassen einteilen: 1) Spezielle Prozessorteile sind mehrfach vorhanden (z. B. mehrere Rechenwerke); 2) Vollständige Prozessoren sind mehrfach vorhanden und über ein schnelles Verbindungsnetz eng gekoppelt (Multiprozessorsysteme, multi-/manycore-Systeme); 3) Mehrere autonome Rechner sind „lose“ miteinander verbunden (Verteilte Systeme; Workstation-Cluster, Client-Server-Systeme, „Gridcomputing“ über das Internet, heute auch „Cloud Computing“). Klassischerweise werden Rechnerarchitekturen nach der Anzahl der Steuerwerke (Befehlsströme, „instruction“) und der Anzahl der Speicherbereiche (Datenströme, „data“) klassifiziert [Fly72]. Dabei ergeben sich vier Kombinationen für Architekturen: Single Instruction, Single Data (SISD); Single Instruction, Multiple Data (SIMD); Multiple Instruction, Single Data (MISD) und Multiple Instruction, Multiple Data (MIMD). Man unterscheidet fünf Ebenen der Parallelverarbeitung, die hier von „feinkörnig“ nach „grobkörnig“ sortiert sind: • Ebene der Befehlsphasen: beispielsweise Laden, Dekodieren usw.; auf dieser und der nächsthöheren Ebene setzen moderne Laufzeitsysteme Verfahren zur Effizienzsteigerung durch automatische Parallelisierung ein; • Ebene der Elementaroperationen: Addition, Subtraktion, Multiplikation, Division usw.; • Anweisungs-Ebene: Parallelisierung der Anweisungen einer Programmiersprache; • Prozess-Ebene: Parallelisierung von Prozessen (Zusammenfassung einer Anweisungsfolge zu einer funktionellen Einheit mit dezidiertem Adressraum); insbesondere gibt es

64

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie hier leichtgewichtige Prozesse (Threads), die im gleichen Adressraum arbeiten, vgl. Threadkonzept in Java und Simultanes Multi-Threading; • Job-Ebene: Parallelisierung von Jobs (in sich abgeschlossene, im Allgemeinen aus mehreren Prozessen bestehende Benutzerprogramme).

Ein Spezialfall der Parallelverarbeitung ist das Simultane Multi-Threading (Hyperthreading). Ein Prozessor kann normalerweise in jedem Takt nur Befehle eines einzigen Threads verarbeiten. Ein einzelner Thread nutzt aber nicht immer die gesamte verfügbare Rechenleistung des Prozessors (beispielsweise nur Ganzzahlen-Operationen, aber keine GleitpunktOperationen). Dadurch werden nur ca. 35% der theoretischen Rechenleistung tatsächlich genutzt. Prozessoren mit simultanem Multi-Threading (Intel: Hyperthreading) haben mehrere Registersätze auf dem Prozessorchip und können dadurch gleichzeitig an mehreren (normalerweise zwei) Threads arbeiten. Der Prozessor gibt sich dabei dem Betriebssystem gegenüber als Multi-Prozessor-Maschine aus, die Rechenleistung an sich ist jedoch nicht über eine EinProzessor-Maschine hinaus erhöht, sondern nur besser ausgenutzt. Rechnernetze und Internettechnologie Rechnernetze bestehen aus mehreren Rechnern, die über Datenleitungen oder drahtlos miteinander verbunden sind. Sie können wie folgt klassifiziert werden: • Ein Lokales Netz („local area network“ – LAN) wird charakterisiert durch kurze Verbindungsleitungen (unter 10 km). Typische Datenübertragungsraten sind (in „bit per second“ – bps, auch Baud genannt): 10 Mbps (beispielsweise bei Koaxialleitungen, Ethernet), 100 Mbps (beispielsweise bei Fast-Ethernet, Twisted Pair), 650 Mbps − 2 Gbps (beispielsweise mit ATM – Asynchronous Transfer Mode und GigaBit-Ethernet für Workstation-Cluster und Client-Server Systeme). Ein LAN ist oft eine Zusammenschaltung von Rechnern und Geräten in einer räumlich begrenzten Umgebung, beispielsweise in einem Gebäude. • Ein Globales Netz („global network“, auch „wide area network“ – WAN) wird charakterisiert durch beliebig lange Verbindungsleitungen und einen oft heterogeneren Verbund autonomer Rechner als dies beim LAN der Fall ist. Typische Datenübertragungsraten sind: 64 kbps (ISDN), mehrere hundert kbps bis zu 32 Mbps (ADSL), 2 − 10 Gbps (GWIN; Wissenschaftsnetz), mehrere Gbps (Internet-Backbones; TerabitBackbones sind in der Erprobung). Der Zugang eines Rechners zum Netz erfolgt über einheitliche Kommunikationsalgorithmen, sogenannte Protokolle. Dabei sind die Protokolle logisch in mehrere Protokollschichten untergliedert, wobei jeweils Standardschnittstellen für jede Schicht gemäß dem OSI- (Open Systems Interconnection) Schichtenmodell der ISO (International Standards Organisation) definiert sind. Insgesamt werden drei voneinander logisch getrennte Schichten unterschieden, die auf unterschiedlicher Ebene zur Kommunikation beitragen. In der obersten Schicht (Anwendungsschicht, beispielsweise WWW) befinden sich datenverarbeitungsorientierte Funktionen, in der zweiten Schicht (Transportschicht/Vermittlungsschicht, beispielsweise TCP/IP) transportorientierte Funktionen und in der dritten (physikalische Netzwerkschicht) die physikalische Übertragung. Zu versendende Daten werden also nacheinander von der Anwendungsschicht durch die Schichten geschleust, dann auf der Netzwerkschicht übertragen und auf der Empfängerseite wieder rückwärts zur Anwendungsschicht geschleust.

Einführung

65

Man kann Netze weiter unterteilen in das Internet (weltweites hierarchisches Netzwerk von Rechnern und „Geräten“ mit Datenaustausch unter Verwendung der Protokolle TCP, IP und UDP, s. u.), das Intranet (privates bzw. firmeninternes Netz unter Verwendung der TCP/IPTechnologie), das Extranet („Schale“ um ein Intranet, beispielsweise um Dienste nach außen anzubieten) und das World-Wide Web (WWW; seit 1992 eine der wichtigsten Anwendungen im Internet unter Verwendung der „Hypertext Markup Language“ – HTML und des „Hypertext Transfer Protocols“ – HTTP für den standardisierten Zugriff auf weltweit vernetzte Informationen). Zur Kommunikation in Netzen stehen unter anderen die folgenden drei wichtigen Protokolle zur Verfügung: • Das Transmission Control Protocol (TCP) stellt eine logische und verlässliche Verbindung zwischen Sender und Empfänger her; dazu gehört auch eine Unterteilung des Datenstroms in Pakete. Die Endpunkte der Verbindung heißen Sockets und ihnen sind Ports mit Nummern zwischen 0 und 216 − 1 zugeordnet. Diese stellen die Verbindung zum Anwenderprogramm (Dienst) her, wobei zu den Standarddiensten beispielsweise HTTP und FTP („File Transfer Protocol“) gehören. Der Datenfluss (Anzahl der Pakete pro Sekunde) wird über das Sliding Window Protocol gesteuert, wobei die „Fenstergröße“ bestimmt, wie viele Pakete vor Erhalt einer Empfangsbestätigung versandt werden dürfen; sie wird dynamisch zwischen Sender und Empfänger ausgehandelt. • Das Internet Protocol (IP) sorgt für den unzuverlässigen und verbindungslosen Versand von Datenpaketen („Datagrammen“) durch das Internet. Es entscheidet in jedem Router (Netzwerkgerät, das Netzwerkpakete zwischen mehreren Rechnernetzen weiterleiten kann), über welche Leitung ein Datagramm als nächstes auf dem Weg zum Ziel geschickt wird. IP verwendet ein komplexes Routing-Verfahren namens Open Shortest Path First, um durch lokale Entscheidungen die günstigsten Wege vom Sender zum Empfänger zu finden; dabei werden aktuelle Laufzeiten, Bandbreiten und Zuverlässigkeit der Leitungen berücksichtigt. Benachrichtigungen über Fehlersituationen werden an TCP weitergegeben. • Das User Datagram Protocol (UDP) reicht den unzuverlässigen und verbindungslosen Dienst von IP an die Anwendungsschicht weiter. Es wird beispielsweise für Multimediaübertragungen (Streaming) eingesetzt, da es dabei nicht darauf ankommt, jedes Datagramm zu erhalten, sondern möglichst viele pro Zeiteinheit. TCP könnte hier durch seine dynamische Flusssteuerung keinen gleichmäßigen Datenfluss gewährleisten. Themen dieses Kapitels Die zweiundzwanzig Aufgaben dieses Kapitels beschäftigen sich mit Grundlagen der Rechnerarchitektur, darunter insbesondere mit der Speicherung und Übertragung von Daten innerhalb eines Rechners oder Rechnernetzes und der Steuerung von großen Netzen wie dem Internet. Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Rechnerarchitektur-Speicher-Internet.html

66

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgaben Aufgabe 54

REK-AA 

Von-Neumann-Rechner 



a) Nennen Sie die typischen Bestandteile heutiger Von-Neumann-Rechner. b) Wozu dienen im Allgemeinen die verschiedenen Busse? Skizzieren Sie die Busstruktur. c) Was versteht man unter dem „physikalischen Von-Neumann-Engpass“? d) Was verbirgt sich hinter dem Begriff des „intellektuellen Von-Neumann-Engpasses“? e) Nennen Sie 3 Konzepte zur Vermeidung des Von-Neumann-Engpasses. f) Welches Konzept hilft bei der Lösung des bei Von-Neumann-Rechnern üblichen Problems der „semantischen Kluft“ zwischen den Daten von Anwenderprogrammen und deren Repräsentation im Speicher? Welches Problem entsteht hingegen durch einen assoziativen Zugriff auf Daten? → Lösung: S. 166

Aufgabe 55

REK-AO 

Rechnerarchitektur 



a) Nennen und charakterisieren Sie kurz die fünf Ebenen der Parallelverarbeitung. Welche dieser Ebenen zählt man zur feinkörnigen Parallelisierung und welche zur grobkörnigen? b) Erläutern Sie das Buszuteilungskonzept der parallelen Abfrage. Gehört es zu den zentralen oder dezentralen Steuerungen? c) Nennen Sie jeweils • ein Eingabegerät, das kein Ausgabegerät ist, • ein Ausgabegerät, das kein Eingabegerät ist und • ein Gerät, das sowohl ein Ein- als auch ein Ausgabegerät ist. → Lösung: S. 167

Aufgaben

67

Aufgabe 56

REK-AL 

Rechnerarchitektur 



Rechnerarchitekturen können nach Flynn [Fly72] bezüglich der • Anzahl ihrer Steuerwerke (Befehlsströme) und • Anzahl ihrer Speicherbereiche (Datenströme) klassifiziert werden. Es ergeben sich vier grundsätzlich unterschiedliche Typen von Rechnerarchitekturen, siehe Abbildung. Skizzieren Sie für jeden dieser Typen die Anordnung der folgenden Blöcke: • Steuerwerke („Control“ (C)), • Rechenwerke („Processor“ (P)), • Speicherwerke („Memory“ (M)).

MultipleData

Multiple Instruction

Single Instruction

SingleData

→ Lösung: S. 168

68

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgabe 57

REK-AQ 

Multi-Threading 



a) Erklären Sie das Prinzip des simultanen Multi-Threadings (Hyperthreadings). b) Welche zusätzlichen Kosten entstehen typischer Weise bei einem Prozessor, der simultanes Multi-Threading unterstützt? c) Mit welcher Leistungssteigerung kann man beim Nutzen von simultanem Multi-Threading rechnen? → Lösung: S. 169

Aufgabe 58 Rechenwerk 

REK-AB 







a) Das Rechenwerk ist ein Bestandteil der CPU in Computern. Additionswerke sind wiederum grundlegende Teile von Rechenwerken. Erläutern Sie, wie die mathematischen Operationen Subtraktion, Multiplikation und Potenzieren (auf Basis natürlicher Zahlen) auf die Addition zurückgeführt werden können. In welchen Fällen würde man in einem realen Rechenwerk diese Rückführung auf die Addition nutzen? Begründen Sie. b) Im Rechenwerk wird die Addition durch Addierer (engl. „Adder“) ausgeführt. Erläutern Sie am Beispiel der Addition von zwei 32-Bit-Zahlen in Dualdarstellung die Unterschiede zwischen Halbaddierern und Volladdierern. c) Entwickeln Sie die Schaltfunktion des Halbaddierers als Wahrheitstabelle und Booleschen Ausdruck. d) Entwickeln Sie für den Halbaddierer eine Schaltung auf Gatterebene auf Grundlage Ihrer Ergebnisse aus Aufgabenteil c). Verwenden Sie dabei nur die Gatter AND, OR, NOT, NAND, NOR und XOR. → Lösung: S. 169

Aufgaben

69

Aufgabe 59

REK-AM 

Speicherwerk 



Die heute verfügbaren Realisierungen von Speicherwerken unterscheiden sich grundlegend in Art und Geschwindigkeit des Datenzugriffs sowie in der Art der Datenhaltung. a) Beschreiben Sie Unterschiede und Gemeinsamkeiten der Datenspeichertypen RAM und ROM. Was bedeuten diese Abkürzungen? b) Sortieren Sie Register, Cache-Speicher und Arbeitsspeicher nach • der Zugriffszeit für die CPU, • dem Preis pro Bit und • der daraus resultierenden üblichen Speicherkapazität in modernen Rechnern auf einer relativen Skala von „hoch“ bis „niedrig“ ein. → Lösung: S. 170

Aufgabe 60 Cache 

REK-AE





a) Welchen Zweck erfüllt ein Cache-Speicher? Nennen Sie in dem Zusammenhang den Vorteil beim Zugriff auf den Cache gegenüber dem Zugriff auf einen Hauptspeicher. b) Beschreiben Sie zwei Zugriffsarten auf den Cache und nennen Sie je einen Vor- und einen Nachteil. → Lösung: S. 171

Aufgabe 61

REK-AP 

Hintergrundspeicher 



Beschreiben Sie den Aufbau einer Magnetfestplatte (Hintergrundspeicher) und erläutern Sie allgemein, aus welchen Anteilen sich die Zugriffszeiten auf Daten, die sich auf der Festplatte befinden, zusammensetzen. → Lösung: S. 172

70

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgabe 62 Speicherorganisation 

REK-AU 



a) Was ist der Arbeitsspeicher bzw. Hauptspeicher? Wie erfolgt der Zugriff auf ein Speicherelement? b) Über welche drei speziellen Register erfolgt die Kommunikation mit dem Arbeitsspeicher? → Lösung: S. 173

Aufgabe 63

REK-AG 

Speicherorganisation und Adressierungsarten 



a) Suchen Sie die falschen Aussagen heraus und korrigieren Sie diese. 1) Wahlfreier Zugriff bedeutet, dass jedes Speicherelement unabhängig von seiner Position mit dem gleichen zeitlichen Aufwand direkt erreichbar ist. Ein Beispiel dafür ist der Magnetbandspeicher. 2) Beim blockadressierbaren Zugriff wird der Speicher in Blöcke eingeteilt. Der Zugriff auf diese Blöcke ist sequentiell, ebenso der Zugriff innerhalb der Blöcke. 3) Beim Directly-Mapped-Cache mit maximal k Blöcken gelangt der Block mit Adresse b an Position b mod k im Cache; dieser Wert wird auch im Tag-Feld an dieser Position gespeichert. 4) Ein KiB sind 1024 Byte. 5) Die Aufgaben des Steuerwerks sind das Holen und Entschlüsseln von Befehlen, sowie die Initiierung der Befehlsausführung. b) Eine CPU, die über einen 9-zeiligen Directly-Mapped-Cache verfügt, ruft nacheinander Daten von folgenden Adressen auf: 85, 77, 13, 8, 90, 27, 110, 46, 38, 69 Geben Sie an, welche Einträge sich am Ende der Aufrufe in den Tag-Feldern des Caches befinden. c) Warum sind 9 Zeilen für einen Directly-Mapped-Cache untypisch? → Lösung: S. 173

Aufgaben

71

Aufgabe 64

REK-AH 

Speicherorganisation und Adressierungsarten 



Eine CPU, welche über einen 8-zeiligen Directly-Mapped-Cache verfügt, ruft nacheinander Daten aus dem Hauptspeicher von folgenden Adressen auf: 3, 15, 8, 7, 6, 3, 2, 21, 33, 64, 8, 31, 11, 14 a) Geben Sie für jede der Zeilen im Cache an, welcher Eintrag dort am Ende der Aufrufe im Tag-Feld steht. b) Welche Werte liest der Befehl LOAD k für k ∈ {0, . . . , 7} jeweils aus dem folgenden Hauptspeicher aus, wenn es sich um unmittelbare, direkte, indirekte oder indizierte Adressierung handelt? Das Indexregister enthalte den Wert 1 (vgl. zu Adressierungsarten Kapitel 7). Hauptspeicheradresse 0 1 2 3 4 5 6 7

Datum 5 7 6 3 7 1 0 2 → Lösung: S. 174

Aufgabe 65

REK-AF 

Speicherorganisation und Adressierungsarten 





Eine CPU verfügt über einen Cache mit 5 Blöcken. Jeder Block ist nochmal in 3 Zeilen unterteilt. Ruft die CPU eine Adresse a auf, wird zuerst über das Directly-Mapped-Verfahren entschieden, in welchen Block die Adresse gelangt. Innerhalb des Blocks wird über das AssoziativVerfahren mit Least-Recently-Used Prinzip entschieden, in welche Zeile die Adresse gelangt. a) Die CPU ruft nacheinander folgende Adressen auf: 67, 49, 156, 95, 12, 38, 128, 92, 106, 78, 117, 38, 67, 45, 128, 38, 60, 53, 3, 78, 63, 206, 175, 38, 184, 156, 211 Geben Sie für jede Zeile in jedem Block an, welcher Wert sich am Ende im Tag-Feld befindet (vgl. Abbildung).

72

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Block 0

Block 1

Block 2

Block 3

Block 4 b) Warum sind 5 Zeilen für einen Directly-Mapped-Cache untypisch? → Lösung: S. 175

Aufgabe 66 Bussysteme 

REK-AS 





Beantworten Sie die folgenden Fragen zur Funktionsweise von Bussystemen. a) Was ist die Kernaufgabe von Bussen? b) Was versteht man unter der Breite eines Busses? c) Was versteht man unter einem Datenbus? d) Was versteht man unter einem Adressbus? e) Was versteht man unter einem Kontrollbus oder Steuerbus? → Lösung: S. 175

Aufgaben

73

Aufgabe 67

REK-AR 

Bussysteme 



Nachfolgend sind Aussagen über Bussysteme aufgeführt. Entscheiden Sie zu jeder, ob sie wahr oder falsch ist, und begründen Sie Ihr Urteil bei allen falschen Aussagen. Wahr

Falsch

Busse lassen sich nach verschiedenen Kriterien klassifizieren: Nach der Breite eines Busses, nach seiner Funktion, nach der Betriebsart (synchron/asynchron) und nach Typ (Peripheriebus/Prozessorbus).





Die Breite eines Busses gibt an, wie viele Steuersignale zwischen CPU und anderen Funktionseinheiten ausgetauscht werden.





Mögliche Funktionen von Bussen können Datenübertragung, Pipelining oder Übertragung der von der CPU berechneten Speicheradressen sein.





Die parallele Abfrage lässt den Sender mit höchster Priorität senden.





Sowohl bei dem CSMA-Verfahren als auch bei der zyklischen Buszuteilung ist es nicht die Aufgabe der Bussteuereinheit Teilnehmerwünsche abzufragen (polling).





Bei Daisy Chain koordiniert die Bussteuereinheit die Übertragung.





Unidirektionale Datenübertragung weist eine erheblich geringere Übertragungsgeschwindigkeit auf und ist deswegen eine ineffiziente Kommunikationsmöglichkeit.





→ Lösung: S. 176

74

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgabe 68

REK-AC

Buszuteilung 





a) Nennen Sie ein Buszuteilungsverfahren mit höherem und eines mit niedrigerem Verwaltungsaufwand (relativ zueinander) und begründen Sie Ihre Wahl. b) Welches der Verfahren • zyklische Buszuteilung unabhängig vom Übertragungswunsch, • zirkulierendes Senderecht (Token-Ring) oder • CSMA nutzt den Bus am effizientesten? → Lösung: S. 177

Aufgabe 69

REK-AT 

Pipelining 



In der Universität zu Musterstadt gibt es in der kleinen und stets überfüllten Mensa mit nur einer Essensausgabe fünf Stationen. Pro Station kann immer nur ein Student stehen und andere Kommilitonen können nicht überholt werden. Sobald eine Station frei wird, rückt der Student nach, der in der jeweils dahinterliegenden Station steht. Jeder Student beginnt bei der ersten Station und durchläuft alle Stationen. Eine Salatbar bildet die erste, eine Suppenausgabe die zweite Station. Es folgen eine Station zur Ausgabe der Hauptspeise, eine Auswahl verschiedener Desserts sowie als letztes die Kasse. Die durchschnittliche Verweildauer an der Salatbar beträgt 10 Sekunden, an der Suppenausgabe 3 Sekunden, an der Station zur Ausgabe der Hauptspeise 22 Sekunden, zur Auswahl des Desserts 6 Sekunden und an der Kasse 12 Sekunden. Zur Vereinfachung der Aufgabe sollen die einzelnen Verweildauern als konstant angesehen werden. a) Angenommen, die Mensa würde das Essen statt an fünf nur an einer Station ausgeben, und erst wenn ein Student komplett fertig wäre, könnte der nächste beginnen sich Essen zu nehmen. Wie lange würde es bei den gegebenen Verweildauern dauern bis ein Student sein Essen erhalten und bezahlt hat? Wie viele Studenten könnten pro Stunde maximal bedient werden? b) In welchem Abstand verlassen die Studenten im Betrieb mit fünf Stationen die Essensausgabe? Wie viele Studenten können pro Stunde maximal bedient werden? c) Wie viel Zeit muss ein Student im Betrieb mit fünf Stationen von Beginn der Auswahl des Salats bis zum Verlassen der Essensausgabe einplanen? d) Aufgrund zahlreicher Beschwerden von Studenten, die Essensausgabe würde zu lange dauern und zu sehr langen Warteschlangen führen, entschließt sich die Mensaleitung,

Aufgaben

75

das Personal an der Station zur Ausgabe der Hauptspeise zu verdoppeln. Durch diese Personalaufstockung kann die Verweildauer an der Station zur Ausgabe der Hauptspeise halbiert werden. • In welchem Abstand verlassen die Studenten nun die Essensausgabe? Wie viele Studenten können pro Stunde maximal bedient werden? • Wie viel Zeit kann ein Student prozentual von Beginn der Auswahl des Salats bis zum Verlassen der Essensausgabe durch die Personalaufstockung einsparen? → Lösung: S. 177

Aufgabe 70

REK-AD 

Pipelining 



Tragen Sie die Ausführungsabfolge der Verarbeitung dreier Befehle eines Pipeline-Rechners in eine Tabelle ein (siehe Abbildung). Gehen Sie davon aus, dass hierbei drei Befehle ausgeführt werden müssen, die sich jeweils in die Bearbeitungsphasen F → D → O → E (Fetch → Decode → Get Operand → Execute) aufteilen. Geben Sie auch die Anzahl der Takte an, die mit Pipelining benötigt werden und die Ersparnis gegenüber einer Ausführung ohne Pipelining. Takt

F

D

O

E

1 2 3 4 5 6 7 → Lösung: S. 178

76

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgabe 71

REK-AN 

Pipelining 



Veranschaulichen Sie anhand eines selbst gewählten Beispiels, dass Folgendes gilt: Sei n die Anzahl der Teilaufgaben einer Befehlsverarbeitung und m die Anzahl der zu verarbeitenden Befehle, dann kann durch Befehlsphasen-Pipelining die Taktzahl T , die zur vollständigen Verarbeitung der Befehle nötig ist, von T =n·m auf T =n+m−1 reduziert werden. → Lösung: S. 179

Aufgabe 72

REK-AI

Schichtenmodel, TCP, IP, UDP 





a) Gegeben sei ein vereinfachtes unausgefülltes Schaubild zum Schichtenmodell der Kommunikationsprotokolle in Rechnernetzen: Anwendung

Anwendung Daten

Daten

TCP

TCP Daten

Daten

IP

IP Daten

Daten

Netzwerk Netzwerk

Netzwerk Netzwerk Daten

Tragen Sie die in der Tabelle angegebenen Begriffe in die Kästchen des Schaubilds ein.

Aufgaben

77 Begriff Daten Netzwerk IP Anwendung TCP

Beschreibung Informationen, welche von einer Anwendung zu einer anderen übertragen werden sollen. Die physikalische Netzwerkschicht. Das Internet Protocol (IP) ist ein Netzwerkprotokoll der Vermittlungsschicht. Anwendungsschicht, welche die Endanwendung und die Middleware enthält. Das Transmission Control Protocol (TCP) ist ein Protokoll der Transportschicht.

b) Ordnen Sie folgenden Aussagen die Begriffe TCP, IP und/oder UDP zu. • Dieses Protokoll stellt eine logische und verlässliche Verbindung zwischen Sender und Empfänger her. • Dieses Protokoll sorgt für den unzuverlässigen, verbindungslosen Versand von Datenpaketen. • Dieses Protokoll wird beispielsweise für Multi-Media-Übertragungen eingesetzt. • Diese beiden Protokolle (der angegebenen drei) befinden sich auf derselben Ebene des OSI-Schichtenmodells. → Lösung: S. 180

Aufgabe 73 

Netze 

REK-AJ 

Beschreiben Sie die verschiedenen Typen von Netzen (Internet, Intranet und Extranet) und grenzen Sie die Begriffe voneinander ab. Nutzen Sie eine Skizze. → Lösung: S. 180

78

6 Rechnerarchitektur, Speicherorganisation und Internettechnologie

Aufgabe 74

REK-AK 

Datentransfer 



Ein Student möchte am Abend einen DVD-Film (Single-Layer-DVD – 4,7 GB, DVD-5, nicht kopiergeschützt) bei sich in der WG auf dem PC schauen. Allerdings stellt er fest, dass er diesen bei einem Freund liegengelassen hat. Dieser Freund wohnt im Wohnheim, das eine 36-MegabitInternet-Anbindung hat und das er in 15 min erreichen kann (eine Richtung). Seine eigene WG hat einen DSL-Anschluss mit 16-Megabit-Internet-Anbindung. a) Ist es schneller, wenn der Freund ihm die DVD über das Internet schickt oder wenn er die DVD bei ihm im Wohnheim abholt? Weitere Annahmen: • kein Overhead im Netzwerk oder auf der DVD, • kein anderer Netzverkehr, • keine Aufenthaltszeit bei dem Freund und • Übertragungsrate zu/von den Laufwerken stellt keinen Flaschenhals dar. b) Der Student will eigentlich heute nicht mehr aus dem Haus gehen. Wird er sich ärgern, dass er letzte Woche den Vertreter seines Internetproviders weggeschickt hat, der ihm eine Umstellung auf einen VDSL2-Anschluss mit 25-Megabit-Anbindung verkaufen wollte? Erinnerung: 1 GB = 1.000 MB = 1.000.000 kB = 1.000.000.000 Byte → Lösung: S. 181

Aufgabe 75

VER-AD 

Rechnerarchitektur 



Geben Sie an, ob folgende Aussagen wahr oder falsch sind. Wahr

Falsch

Die Zeit, die benötigt wird, um auf einen Datensatz an einer bestimmten Adresse einer Festplatte zuzugreifen, ist für dieselbe Festplatte immer die gleiche.





Hyperthreading gaukelt dem Betriebssystem mehr Prozessorkerne vor als tatsächlich vorhanden sind.





Beim Hyperthreading werden Programme mit wenigen Threads in mehr Threads zerlegt, bevor sie ausgeführt werden.





Aufgaben

79

Busse haben immer genau zwei angeschlossene Geräte, die Daten untereinander austauschen.





Seitenfehler bringen Betriebssysteme gewöhnlich zum Absturz.





Beim „preemptive Scheduling“ kann ein Prozess so lange über den Prozessor verfügen, wie er möchte.





→ Lösung: S. 181

7

Programmierung

Einführung Dieses Kapitel beschäftigt sich mit der Frage, wie man Computer für ihren eigentlichen Bestimmungszweck, der Berechnung beliebiger berechenbarer Funktionen einsetzen kann. Ein Computer durchläuft je nach Eingaben, die ihm zugeführt werden, eine sequentielle Folge verschiedener Speicherzustände. Wird eine der Speicherzellen des Computers zu einem gewissen Zeitpunkt als Eingabewert für eine Funktion interpretiert und eine (andere) zu einem späteren Zeitpunkt als Funktionswert, dann kann man sagen, dass der Computer die entsprechende Funktion berechnet hat. Die Art, wie ein Computer von einem Speicherzustand zum nächsten wechselt, wird ihm über eine sequentielle Folge von Eingabedaten mitgeteilt. Dabei zeigt sich schnell, dass die „nackte Maschine“, also die Ebene der Informationsverarbeitung in Form von Spannungszuständen, Bitketten und Speicherinhalten, nur äußerst unkomfortabel für diesen Zweck nutzbar ist. Bei modernen Rechnern haben Endnutzer daher auch keinen Zugang zu dieser Ebene der Steuerung. Stattdessen gibt es heute eine Hierarchie an Abstrahierungen von der Maschinenebene, die es ermöglichen, Programme in den Computer einzugeben, die den Ablauf von Berechnungen steuern, aber zu einem gewissen Grad die inneren Abläufe im Computer vor dem Programmierer verstecken und selbsttätig geeignete Prozesse auf dieser Ebene anstoßen. Programme sind Texte in einer bestimmten formalen Sprache, der Programmiersprache (meist im Wesentlichen deterministisch kontextfreie Sprachen, vgl. Band 1, Kapitel 5), die eine Beschreibung zur Berechnung einer bestimmten Funktion durch den Computer enthalten. Dafür benötigt man Beschreibungsformalismen zur Formulierung von Rechenvorschriften, also von Algorithmen, Datenstrukturen, Rechnerstrukturen usw. Mikroprogrammierung Die unterste Ebene in der Hierarchie der Programmiersprachen stellt die Mikroprogrammierung dar. Sie bietet eine Abstrahierung von den physikalischen Eigenschaften eines Computers, indem sie die Ausführung von Maschinenbefehlen (einfache Operationen wie Addition, Subtraktion usw.) durch eine Folge von Mikrobefehlen (einfachste Ablaufsteuerungen wie Datenbewegungen, Tests usw.) ermöglicht. Durch Mikroprogrammierung kann, als Alternative oder zusätzlich zur festen Verdrahtung von Rechnerkomponenten (vgl. Kapitel 6), der physikalische Ablauf im Rechner gesteuert werden. Dafür wird durch Mikroprogramme die Erzeugung von Steuersignalen zum richtigen Zeitpunkt, in der richtigen Reihenfolge und abhängig vom gerade zu bearbeitenden Befehl festgelegt. Insbesondere der Maschinenbefehlszyklus (FETCH, DECODE, EXECUTE) kann so auf Software-Ebene gesteuert werden. In heutigen Rechnern wird Mikroprogrammierung fast ausschließlich anstelle einer festen Verdrahtung genutzt, da sie billiger, flexibler und übersichtlicher ist. Auch diese Ebene ist für den Endnutzer üblicherweise nicht zugänglich und wird ihm vorgefertigt bei der Auslieferung durch den Hersteller zusammen mit der Hardware bereitgestellt.

82

7 Programmierung

Wir unterscheiden im Zusammenhang mit der Mikroprogrammierung die folgenden Begriffe: • Mikroprogrammeinheit: der Teil des Steuerwerkes, der durch Mikroprogrammierung die Steuerung des Rechenwerks übernimmt. • Mikrobefehl: ein „Steuerwort“ fester Länge, das eine oder mehrere Mikrooperationen auslöst. • Mikroprogramm: eine Folge von Mikrobefehlen. • Mikrooperation: eine in der Hardware fest verdrahtete Elementaroperation, die durch genau ein ihr zugeordnetes Steuersignal ausgelöst werden kann. Maschinensprachen Die nächste Ebene in der Hierarchie der Programmiersprachen stellen die Maschinensprachen dar. Sie sind die niedrigste für die Programmierung durch Endnutzer frei zugängliche Ebene. Eine Maschinensprache besteht aus einer Menge gültiger Maschinenbefehle, die zum Instruktionssatz einer CPU gehören. Der Instruktionssatz ist die Menge aller verfügbaren Operationen, die eine CPU nach außen als atomare Berechnungseinheiten zur Verfügung stellt. Eine Folge von Maschinenbefehlen, die im Hauptspeicher eines Rechners zur Abarbeitung abgelegt werden kann, nennen wir Maschinenprogramm. Maschinenbefehle sind binäre Wörter fester Länge, die eine elementare Operation aus dem Instruktionssatz einer CPU auslösen. Sie bestehen im Wesentlichen aus zwei Teilen: • Der Operationscode bezeichnet die auszuführende Operation (beispielsweise Addition, Subtraktion usw.). • Eine Folge von Operandenadressen spezifiziert die Operanden, auf die die Operation angewendet werden soll, etwa durch Angabe von Konstanten, Registeradressen oder Hauptspeicheradressen (beispielsweise „speichere das Ergebnis einer Addition des Inhalts von Speicherzelle S1 mit der Konstante 4 in die Speicherzelle S3“; vgl. Adressierungsarten, unten). Typische Befehlsformate sind 1-, 2- und 3-Adressbefehle. Bei 1-Adressbefehlen wird eine einzige Operandenadresse angegeben, deren Inhalt durch den Befehl mit dem Inhalt eines ausgezeichneten Akkumulator-Registers (Acc) verknüpft wird; das Ergebnis wird wieder in Acc gespeichert. Auch für Sprungbefehle ist nur eine einzige Operandenadresse, die das Sprungziel bezeichnet, notwendig. Bei 2-Adressbefehlen wird das Ergebnis der auf den ersten Operanden und Acc angewendeten Operation nicht in Acc, sondern in der durch den zweiten Operanden spezifizierten Speicherzelle abgelegt. Bei 3-Adressbefehlen werden die ersten beiden Operanden miteinander verknüpft, und das Ergebnis wird in der durch den dritten Operanden spezifizierten Speicherzelle abgelegt. Vor allem bei arithmetischen Operationen kann die Angabe von drei Operanden bequemer sein als die Beschränkung auf 1- oder 2-Adressbefehle. Für eine Berechnung, die das Ergebnis der Operation op angewendet auf die Werte der Adressen x und y an der Adresse z speichert, kann man in 3-Adress-Notation einfach folgenden Befehl angeben: „ “. Bei 1-Adressbefehlen müsste man stattdessen einen Umweg über Acc gehen und mehrere Befehle verwenden. Beachten Sie, dass bei obiger Angabe der Operation op als Maschinenbefehl die spitzen Klammern eine Kodierung der entsprechenden Elemente in Nullen und Einsen andeuten, denn Maschinenbefehle müssen als Binärcodes angegeben

Einführung

83

werden. Eine symbolische Notation von Befehlen ermöglichen erst die Assemblersprachen, s. u. Der Instruktionssatz einer CPU kann grob in folgende Gruppen unterschiedlicher Befehlsarten unterteilt werden (die Beispiele beziehen sich auf 1-Adressbefehle; der besseren Lesbarkeit halber werden die spitzen Klammern weggelassen, symbolische Wörter wie „LOAD“, „STORE“, x usw. sind jedoch weiterhin nicht Teil von Maschinensprachen und müssen als Binärstrings gedacht werden): • Datentransportbefehle kopieren Inhalte von Registern und Hauptspeicherzellen an andere Speicherorte. Beispiele: – LOAD x: Lädt den Inhalt von Acc an die durch den Operanden x spezifizierte Adresse. – STORE x: Speichert den durch den Operanden x spezifizierten Inhalt in Acc. • Arithmetische und logische Befehle bewerkstelligen Verknüpfungen oder Schiebeoperation angewendet auf Inhalte von Registern und Hauptspeicherzellen. Beispiele: – ADD x: Schreibt das Ergebnis der Addition des durch x spezifizierten Inhalts und Acc in Acc. – SUBTRACT x: Schreibt das Ergebnis der Subtraktion des durch x spezifizierten Inhalts von Acc in Acc. – MULTIPLY x: Schreibt das Ergebnis der Multiplikation des durch x spezifizierten Inhalts und Acc in Acc. – DIVIDE x: Schreibt das Ergebnis der Division von Acc durch den durch x spezifizierten Inhalt in Acc. • Ablaufsteuerungsbefehle dienen der Unterbrechung des sequentiellen Programmablaufs durch Sprünge, eventuell abhängig von Bedingungen. Beispiele: – JUMP x: Sprung an die Stelle, die durch x spezifiziert wird. – JUMPZERO x: Sprung an die Stelle, die durch x spezifiziert wird, falls Acc = 0. – JUMPNOTZERO x: Sprung an die Stelle, die durch x spezifiziert wird, falls Acc  0. • Ein- und Ausgabebefehle kommunizieren mit Ein- und Ausgabegeräten. Beispiel: – PRINT x: Gibt den durch x spezifizierten Inhalt auf dem Bildschirm aus. • Sonderbefehle sind beispielsweise für die Unterbrechungsbehandlung (interrupt handling) oder das Anhalten und Zurücksetzen der CPU zuständig. Beispiel: – HALT x: Beenden der Programmausführung; x wird ignoriert. Bemerkung: Zu beachten ist, dass Daten und Programme im selben Speicher untergebracht sind, man kann also durch geeignete Adressierung statt auf Daten auch auf Programme zugreifen. Insbesondere kann ein Programm sich selbst durch die eigene Ausführung verändern, was zu schwer vorhersehbaren Effekten führen kann. Höhere Programmiersprachen erlauben daher solche Zugriffe auf den eigenen Programmcode meist nicht.

84

7 Programmierung

Adressierungsarten Wir haben bisher ohne nähere Erläuterung vom „durch einen Operanden spezifizierten Inhalt“ gesprochen und wollen diesen Begriff nun konkretisieren. Der Wert eines Operanden wird durch die Adressierung seines Inhalts festgelegt, für die Maschinensprachen (und ebenso Assemblersprachen, s. u.) verschiedene Möglichkeiten zur Verfügung stellen. Die folgenden Adressierungsarten sind typisch für heutige Maschinensprachen, wobei oft nur ein Teil davon in einer konkreten Maschinensprache realisiert ist: • Unmittelbare Adressierung: Die Operandenangabe wird als Konstante interpretiert, es wird keine effektive Adresse berechnet, sondern der Wert des Operanden selbst für die Operation genutzt (im Folgenden durch eine voranstehende Raute # gekennzeichnet). • Absolute (oder direkte) Adressierung: Die Operandenangabe bezeichnet direkt die effektive Adresse im Speicher. Dadurch wird statt des konstanten Werts x die Adresse x im Speicher angesteuert (ähnlich zu Variablen in imperativen Programmiersprachen; im Folgenden ohne Präfix gekennzeichnet). • Indirekte Adressierung: Die Operandenangabe bezeichnet die Adresse einer Speicherzelle, deren Inhalt die effektive Adresse ist. Bei indirekter Adressierung von x wird also auf die Adresse im Speicher zugegriffen, die durch den Wert der Speicherzelle an Adresse x gegeben ist. Dadurch wird die Berechnung von Registeradressen durch das Programm ermöglicht (ähnlich zu Zeigern in höheren Programmiersprachen; im Folgenden durch einen voranstehenden Stern * gekennzeichnet). • Indizierte Adressierung: Die effektive Adresse berechnet sich durch Addition des Operanden und des Inhalts eines Indexregisters. Auf diese effektive Adresse wird direkt zugegriffen. Typischerweise wird diese Adressierungsart für den Zugriff auf Komponenten größerer Datenstrukturen wie Arrays benötigt, wobei der Zugriff auf das n-te Element dadurch erfolgt, dass die Adresse des ersten Elements des Arrays zu n dazu addiert wird. • Relative Adressierung: Die effektive Adresse berechnet sich durch Addition des Operanden und des Inhalts eines Basisregisters. Der Unterschied zur indizierten Adressierung ist nur, dass das Basisregister meist der Befehlszähler pc ist, damit eine Verschiebung von Programmen im Speicher möglich ist, ohne das Programm zu ändern. • Implizite Adressierung: Die Operandenangabe wird bereits durch den Operationsteil des Befehls festgelegt und wird nicht weiter spezifiziert. Dies ist beispielsweise bei Sprungbefehlen der Fall, die implizit den Befehlszähler pc adressieren. Beispielsweise würden im folgenden Teil eines Speichers, wobei ein Indexregister und ein Basisregister mit einem Wert von jeweils 2 zur Verfügung stehen, Zugriffe auf 11 mit den beschriebenen Adresssierungsarten zu den unten angegebenen effektiven Adressen führen. Adresse Inhalt

... ...

10 5

11 12

12 19

• Unmittelbarer Zugriff: #11 ⇒ 11. • Absoluter/direkter Zugriff: 11 ⇒ 12. • Indirekter Zugriff: ∗11 ⇒ 19. • Indizierter oder relativer Zugriff: 11 ⇒ 21 (jeweils).

13 21

... ...

Einführung

85

Assembler Assemblersprachen bilden die nächsthöhere Ebene in der Hierarchie der Programmiersprachen. Sie orientieren sich stark an der Struktur der zugrunde liegenden Maschinensprache, unterstützen aber einige Vereinfachungen, die es für Menschen einfacher machen, Assemblerprogramme zu schreiben. So erhält jeder Operationscode einen festen symbolischen Namen, den Mnemonic, der an die Semantik seiner Operation erinnert; hier werden also beispielsweise die oben genutzten Platzhalter ADD, SUBTRACT, MULTIPLY, DIVIDE usw. tatsächlich als Teil der Sprache genutzt. Darüber hinaus können den Operandenadressen Namen zugeordnet werden, über welche die Adressierung erfolgt, und Befehle (genauer die Adressen im Speicher, an denen die Befehle stehen) können durch Marken gekennzeichnet werden, um Sprungziele festzulegen. Beispielsweise kann statt JUMP 100 also JUMP geschrieben werden, wenn ein alphanummerischer String ist, der zuvor an einer entsprechenden Zieladresse definiert wurde. Zusätzlich gibt es Pseudobefehle, also Befehle, die statt an den Prozessor an den Assembler gerichtet sind. Dazu gehören • Zuweisungen von symbolischen Namen an Werte/Adressen (Symboldefinition), die, im Stil von Variablen in imperativen Programmiersprachen, beim Assemblieren durch ihre Werte ersetzt werden; • die Festlegung der Programmanfangsadresse und • die Reservierung von Speicherplatz für Variablen. Assemblerbefehle sind in vier Teile aufgeteilt. Das Markenfeld ist optional und ermöglicht die Markierung von Befehlsadressen, beispielsweise zur Nutzung als Sprungmarke. Das Operationsfeld und das Operandenfeld enthalten die eigentliche Definition des Maschinenbefehls oder Pseudobefehls. Das Operationsfeld enthält dabei eine mnemonischen Beschreibung des Operationscodes, und das Operandenfeld keine, eine oder mehrere Operandenbeschreibungen, abhängig von der Art des Befehls. Der letzte Teil eines Assemblerbefehls ist ein optionales Kommentarfeld, das einen beliebigen Text zur Dokumentation des Codes enthalten kann; er wird bei der Ausführung ignoriert. Folgendes Beispiel zeigt einen Additionsbefehl in Assemblersprache, der die Konstanten 3 und 4 addiert und das Ergebnis an Adresse R1 speichert: Markenfeld Label

Operationsfeld ADD

Operandenfeld #3 #4 R1

Kommentarfeld (* Addition *)

Assemblersprachen bieten also einige Vereinfachungen gegenüber Maschinensprachen, aber immer noch wenige oder gar keine Konzepte zur Strukturierung von Daten und Programmabläufen (beispielsweise Arrays oder Schleifenkonstrukte). Höhere/problemorientierte Programmiersprachen Für komplexe Aufgaben ist auch das Programmieren in Assemblersprachen umständlich, und die entstehenden Assemblerprogramme sind oft fehleranfällig und schwer auf Fehler hin zu analysieren (Debugging). Heute gibt es daher eine Vielzahl problemorientierter Programmiersprachen mit unterschiedlichen Abstrahierungsgraden von der Maschinenebene und unterschiedlicher Fokussierung auf bestimmte Arten von Problemstellungen. Problemorientierte Programmiersprachen sind unabhängig von der zugrunde liegenden Hardware, also ist keine

86

7 Programmierung

umkehrbar eindeutige Zuordnung ihrer Konstrukte zu konkreten Maschinenbefehlen notwendig und möglich. Sie werden durch ihre Syntax, üblicherweise im Wesentlichen eine LR-kGrammatik (vgl. Kapitel 4), und eine Formalisierung ihrer Semantik, also Bedeutungen oder Auswirkungen ihrer Sprachkonstrukte, beschrieben. Die meisten üblichen problemorientierten Programmiersprachen können in die folgenden Kategorien eingeordnet werden: • Imperative/prozedurale Programmiersprachen: Die Programme haben einen „algorithmischen“ Charakter durch eine genaue Festlegung der Folge von Befehlen an den Computer; die Architektur des Von-Neumann-Rechners wird zu großen Teilen widergespiegelt (vgl. intellektueller Von-Neumann-Engpass, Kapitel 6). Beispiele: ADA, ALGOL 60, ALGOL 68, BASIC, C, COBOL, COMAL, ELAN, FORTRAN, MODULA-2, PASCAL, PL/I, SIMULA, SNOBOL, . . . • Funktionale und applikative Programmiersprachen: Die Programme werden als Funktionen von Eingabemengen in Ausgabemengen aufgefasst und die zu lösenden Probleme funktional beschrieben (im Sinne einer Beschreibung von Abhängigkeiten zwischen Dingen und Vorgängen der „realen Welt“). Die zeitliche Reihenfolge auszuführender Operationen wird nicht festgelegt, sondern nur Reihenfolgen aufgrund logischer Abhängigkeiten. Manchmal werden zur Vereinfachung auch imperative Elemente in die Sprache gemischt. Beispiele: Gofer, Haskell (rein funktional), LISP, LOGO, Scheme, ... • Prädikative/logische Programmiersprachen: Programme werden als Mengen von Fakten (gültige Prädikate) und Regeln (wie man aus Fakten neue Fakten gewinnt) aufgefasst. Man formuliert also Wissen in Form von logischen Klauseln über das Problem; die Programmausführung wird durch eine Fragestellung („ist ein fragliches Faktum aus den Prädikaten und den Regeln ableitbar, und wenn ja, unter welcher Variablenbelegung?“) angestoßen, und der Computer versucht, durch das zuvor definierte Wissen eine Lösung des Problems herzuleiten. Auch hier werden imperative Elemente als Teil der Sprache eingesetzt, um Probleme, die schwer in ein logisches Kalkül zu übersetzen sind, handhabbarer zu machen. Beispiel: PROLOG. • Objektorientierte Programmiersprachen: Hier ist der zentrale Gegenstand der Programmiersprache das (aktive) „Objekt“, das als Gegenstück zu Objekten in der „realen Welt“ aufgefasst werden kann. Ein Objekt ist eine Instanz einer Klasse gleichartiger Objekte, und ihm werden Eigenschaften (Attribute oder Klassenvariablen) und Prozeduren (Methoden) zugeordnet (vgl. beispielsweise Java). Zu den wesentlichen Konzepten objektorientierter Sprachen gehören das Geheimnisprinzip (Zugriff auf Objekte nur über Aufruf zugeordneter Methoden; vgl. Sichtbarkeit „private“ der Klassenvariablen in Java), das Vererbungsprinzip (Eigenschaften und Methoden können von einer Klasse an Unterklassen vererbt werden) und die dynamische Bindung (Zuordnung von Methoden zu Objekten erfolgt dynamisch zur Laufzeit). Innerhalb der Methoden sind objektorientierte Sprachen meist weitgehend imperativ. Beispiele: C++, C# („C sharp“), Delphi, Eiffel, Java, Oberon, PYTHON, SIMULA-67, SMALLTALK-80, . . . Da imperative Programmiersprachen im Aufbau den Assembler- und Maschinensprachen ähneln, ermöglichen sie eine relativ genaue Bestimmung der Abarbeitungsreihenfolge der Befehle auf der Maschine, was vor allem bei kleineren Algorithmen und durchdachter Strukturierung zu besonders effizienten Programmen führen kann. Dagegen ist für größere Projekte fast immer

Einführung

87

eine höhere Programmiersprache zu bevorzugen, wobei in der Praxis am häufigsten objektorientierte Sprachen zum Einsatz kommen. Programme, die in einer problemorientierten Sprache geschrieben sind, können nicht direkt von einem Computer verstanden werden. Sie müssen, bevor sie ausgeführt werden, entweder in Maschinenprogramme übersetzt (kompiliert) oder in geeignete Interpreterprogramme geladen werden. Compiler, Interpreter und die Java Virtual Machine Die Programmiersprachen aller Ebenen ab den Assemblersprachen können nicht direkt auf einem Computer ausgeführt werden, sondern müssen eine Vorverarbeitung durchlaufen. Eine Möglichkeit für diese Vorverarbeitung ist, einen Compiler oder Kompilierer einzusetzen (im Fall von Assemblersprachen auch Assembler oder Assemblierer genannt), der ein Programm aus einer Assembler- oder einer höheren Sprache in eine Folge von Maschinenbefehlen übersetzt. Das so übersetzte Programm ist nur auf der Computer-Plattform lauffähig, für die es erzeugt wurde. Eine flexiblere Möglichkeit der Ausführung höhersprachlicher Programme bieten sogenannte Interpreter. Sie sind selbst ausführbare Programme, die als Eingabe ein höhersprachliches Programm (beispielsweise in BASIC, Java, LISP oder PROLOG) erhalten und das darin beschriebene Verhalten simulieren, indem sie die Ausführung entsprechender Maschinenbefehle zur Laufzeit veranlassen. Interpreter eignen sich besonders gut zum Debugging in Programmen, da sie oft ein Pausieren des Programmlaufs und eine Darstellung seines inneren Zustands zur Laufzeit ermöglichen. Ein Nachteil von Interpretern ist allerdings, dass die Programmausführung oft deutlich langsamer ist als bei einer vergleichbaren kompilierten Variante. Eine Mischform aus Kompilierung und Interpretierung findet beispielsweise bei der (regulären) Ausführung von Java-Programmen durch die Java Virtual Machine (JVM) statt (ähnlich auch bei C#, Perl und Python). Dabei werden Programme vor ihrer Ausführung in sogenannten JavaBytecode übersetzt, der eine „maschinenähnliche“ Darstellung des Programms enthält. Dieser Bytecode kann plattformunabhängig, aber dennoch für die meisten Plattformen sehr effizient durch die JVM interpretiert werden. Zusätzlich zu dieser Ausführungsart gibt es für Java auch Interpreter, die insbesondere zum Debugging eingesetzt werden. Bei Verzicht auf Plattformunabhängigkeit wäre es auch denkbar, Compiler für Java einzusetzen, die eine noch effizientere Ausführung ermöglichen könnten, allerdings sind bis jetzt keine Compiler vorhanden, die beliebigen Java-Code in Maschinensprache übersetzen können. Themen dieses Kapitels Die elf Aufgaben dieses Kapitels behandeln den Maschinenbefehlszyklus, die Ebenen der Programmiersprachen, die Adressierungsarten, Interpreter, Compiler und die Erstellung und Analyse von Assemblerprogrammen. Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Programmierung.html

88

7 Programmierung

Aufgaben Aufgabe 76 Programmierebenen 

PRO-AA 



Vervollständigen Sie den unten angegebenen Lückentext mithilfe der folgenden Begriffe: Abstraktionsgrade Interpretierung

abstrakte Maschine

Maschinenbefehlszyklus

Mikroprogrammierung

Übersetzung

Software

objektorientierte Programmiersprache

Hinweis: Es müssen nicht alle genannten Begriffe verwendet werden. Um die Arbeit des Programmierers etwas angenehmer zu gestalten, wurden im Laufe der Zeit verschiedene Programmierebenen eingeführt, die durch unterschiedliche von der Maschinensprache an gegebene Problemstellungen angepasst sind. Somit gibt es heute eine Hierarchie von Sprachebenen, deren Programme durch ineinander überführbar sind. Durch können diese Programme direkt ausgeführt werden. Dabei stellt sich jede Ebene nach außen als dar. Die unterste Programmierebene ist die . Diese ist in der Regel jedoch nicht frei zugänglich für den Programmierer. → Lösung: S. 182

Aufgabe 77

PRO-AB 

Programmiersprachen 



Sind folgende Aussagen wahr oder falsch? Wahr

Falsch

Die Programmiersprachenebenen kann man von höhersprachlich zu hardwarenah folgendermaßen sortieren: Objektorientiere Sprachen → Assemblersprachen → Mikroprogrammierung → Maschinensprachen → Hardware.





Problemorientierte Programmiersprachen sind weitgehend unabhängig von der Hardware der Rechenmaschinen.





Aufgaben

89

Befehle in Assemblersprachen werden nicht binär, sondern symbolisch notiert.





Durch Übersetzung sind Programme aus höheren Sprachebenen in niedrigere überführbar. Durch Interpretierung sind Programme aller Sprachenebenen direkt ausführbar.





Sowohl die Ebene der Maschinensprachen, als auch die der Mikroprogrammierung sind dem Anwender nicht zugänglich.





Eine Maschinensprache stellt Befehle in binärer Kodierung dar.





Problemorientierte Programmiersprachen können folgendermaßen kategorisiert werden: iterative Programmiersprachen, funktionale und additive Programmiersprachen, prädikative und operative Programmiersprachen.





Programme in prädikativen Programmiersprachen, bestehen aus Mengen von Fakten und Regeln. Ein Beispiel aus dieser Klasse von Programmiersprachen ist PROLOG.





→ Lösung: S. 182

Aufgabe 78

PRO-AC

Interpreter, Kompilierungsarten 





Nennen Sie die vier Phasen eines Kompilierers und beschreiben Sie diese kurz. → Lösung: S. 183

Aufgabe 79

PRO-AD 

Adressierungsarten 



Adressierungsarten beschreiben den von einem Programm vorgegebenen Weg, wie der Prozessor Operanden für eine Rechenoperation aus dem Speicher lädt und wie der Speicherort für das Ergebnis angegeben wird. Gegeben sei der folgende Speicher:

90

7 Programmierung Adresse 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Datum 0 19 13 4 8 4 2 7 3 5 17 1 14 10 6 12

Ebenfalls gegeben sei folgendes Indexregister: 4 a) Welcher Wert wird bei folgenden Aufrufen geladen? • Lade Register indirekt mit 11. • Lade Register direkt mit 9. • Lade Register indiziert mit 1. • Lade Register unmittelbar mit 10. b) Im ersten Teil dieser Aufgabe wurden vier der sechs typischen Adressierungsarten abgefragt. Welche beiden weiteren Adressierungsarten kennen Sie noch? → Lösung: S. 183

Aufgabe 80

PRO-AE 

Maschinenbefehlszyklus 



Bei der Ausführung eines Befehls im Rechner führt das Steuerwerk den sogenannten Maschinenbefehlszyklus aus. a) Aus welchen drei Phasen besteht der Maschinenbefehlszyklus und welche Aufgaben hat das Steuerwerk in den einzelnen Phasen?

Aufgaben

91

b) Nun soll folgender umgangssprachlich formulierter Befehl konkret umgesetzt werden: Subtrahiere 50 vom Inhalt der Speicherzelle 114 und speichere das Ergebnis in Speicherzelle 114 ab. Geben Sie an, was das Steuerwerk in den einzelnen Schritten des Maschinenbefehlszyklus tun muss, um die Aufgabe zu erfüllen. Gehen Sie von folgendem Anfangszustand aus: • Inhalt von PC: 347 • Inhalt von Speicherzelle 347: der zu verarbeitende Befehl • Inhalt von Speicherzelle 114: 895 → Lösung: S. 184

Aufgabe 81

ASS-AF 

Assembler 



Schreiben Sie ein Programm in Assemblersprache, basierend auf 1-Adress-Befehlen, welches die Funktion n  f (n) = i2 i=1

für n ∈ N0 berechnet. Nehmen Sie dabei an, dass anfangs n in R1 und 0 in allen anderen Registern Rm (m > 1) gespeichert ist. Der Funktionswert f (n) soll nach der Berechnung in R2 gespeichert sein. Alle anderen Register Rm (m > 2) können als Zwischenspeicher genutzt werden. → Lösung: S. 185

Aufgabe 82

ASS-AB 

Assembler 



Schreiben Sie ein Assembler-Programm, basierend auf 1-Adress-Befehlen, welches die Funktion   s · (c − d) f : N0 × N0 × N0 × N0 : f (c, d, r, s) = r + r+s berechnet (für r + s = 0 kann sich das Programm beliebig verhalten). Nehmen Sie dabei an, dass anfangs c in R1, d in R2, r in R3 und s in R4 gespeichert sind. f (c, d, r, s) soll abschließend in R5 gespeichert werden. Alle übrigen Register Rn (n > 5), können als Zwischenspeicher verwendet werden. → Lösung: S. 185

92

7 Programmierung

Aufgabe 83

ASS-AD 

Assembler 



a) Gegeben sei folgendes Assemblerprogramm basierend auf 1-Adress-Befehlen (für unmittelbare Adressierung wird das Symbol # benutzt, überall sonst wird direkt adressiert):

LOOP

LOAD STORE LOAD STORE LOAD JUMPZERO SUBTRACT JUMPZERO SUBTRACT STORE LOAD STORE LOAD STORE ADD STORE LOAD JUMP

#1 R3 #1 R4 R1 END #1 END #1 R1 R3 R2 R4 R3 R2 R4 R1 LOOP

END Welche Funktion f : N → N berechnet das Assemblerprogramm, wenn zu Beginn der Wert n in R1 und nach der Ausführung der Wert f (n) in R4 steht? b) Schreiben Sie ein Assemblerprogramm, das eine Zahl x als Eingabe in R1 erhält und als Ergebnis die dezimale Quersumme Q(x) dieser Zahl in R3 ausgibt. Beispielsweise soll gelten: Q(x) = Q(4112) = 8. Hinweis: Verwenden Sie die Befehle DIV IDE bzw. MODULO, die die ganzzahlige Division bzw. den ganzzahligen Divisionsrest berechnen. → Lösung: S. 186

Aufgaben

93

Aufgabe 84

ASS-AA 

Assembler 



Gegeben sei das folgende Assembler-Programm auf Basis von 1-Adress-Befehlen:

LOOP

LOAD STORE LOAD JUMPZERO LOAD MULTIPLY STORE LOAD SUBTRACT STORE JUMP

#1 R3 R2 END R3 R1 R3 R2 #1 R2 LOOP

END Welche Funktion f : N × N → N : (a, b) → f (a, b) berechnet das Programm, wenn a zu Beginn in Register R1 und b in R2 steht, und das Ergebnis in R3 abgefragt wird? (Für unmittelbare Adressierung wird das Symbol # benutzt, überall sonst wird direkt adressiert.) → Lösung: S. 186

Aufgabe 85 Assembler 

ASS-AC 





Gegeben sei folgendes auf 1-Adress-Befehlen basierendes Assemblerprogramm:

LOOP

END

LOAD JUMPZERO STORE STORE LOAD SUBTRACT JUMPZERO STORE ADD STORE JUMP

R1 End R2 R3 R2 #1 END R2 R3 R3 LOOP

94

7 Programmierung

Für unmittelbare Adressierung wird das Symbol # benutzt, überall sonst wird direkt adressiert. a) Was gibt das Programm in R3 aus, wenn zu Beginn R1= 4 bzw. R1= 5 gilt? b) Durch welche Funktion f : N → N lässt sich der Endwert von R3 in Abhängigkeit vom Ausgangswert von R1 ausgeben? → Lösung: S. 186

Aufgabe 86

ASS-AE 

Assembler 



Die Syntax einer auf 3-Adress-Befehlen basierenden Assemblersprache sei wie folgt aufgebaut: OpCode Q1 , (Q2 , ) Z Dabei sind Q1 und Q2 Quellregister, die eingelesen werden und Z ein Zielregister, in das das Ergebnis der Operation gespeichert wird. Wenn eine Adresse fehlt, werden die verbleibenden zwei als Q1 und Z behandelt. Geben sei das folgende Assemblerprogramm (für unmittelbare Adressierung wird das Symbol # benutzt, überall sonst wird direkt adressiert):

LOOP

STORE SUBTRACT ADD JUMPNOTZERO

R1 R1 R2 R1

#1 R1

R2 R1 R2 LOOP

a) Der Wert f (n) welcher Funktion f : N → N in Abhängigkeit der Eingabe n ∈ N, die zu Beginn in R1 stehe, wird am Ende in R2 gespeichert? b) Schreiben Sie nun ein Assemblerprogramm, das die gleiche Funktion f berechnet, aber ohne Jump-Befehle auskommt, also konstante, statt linearer Ausführungszeit benötigt. → Lösung: S. 186

8

Betriebssysteme

Einführung Eine wichtige Anforderung an Rechenanlagen (Computer einschließlich ihrer Peripherie) ist, dass sie einfach und effizient betrieben sowie ohne Störungen von einem oder mehreren Anwendern genutzt werden können. Programme, die dies gewährleisten sollen, müssen Kenntnis über alle Betriebsmittel besitzen, also alle Hard- und Softwarekomponenten, die zur Ausführung von Programmen benötigt werden. Dazu gehören Prozessoren, Speicher, Eingabe/Ausgabegeräte, Programme und Daten. Außerdem werden Mechanismen zur Steuerung des Zugriffs von Benutzerprogrammen auf die Betriebsmittel benötigt. Alle in diesem Rahmen anfallenden Verwaltungs-, Steuerungs- und Dienstleistungsaufgaben übernehmen sogenannte Systemprogramme, die (residenter) Bestandteil jeder Rechenanlage sind. Ein Betriebssystem (auch System-Software oder englisch „operating system“) ist definiert als die Gesamtheit aller Systemprogramme einer Rechenanlage. Die Komponenten des Betriebssystems sind Programme wie alle anderen auch, werden also durch den Prozessor ausgeführt, „verbrauchen“ Rechenzeit und geben die Kontrolle häufig vollständig ab, damit der Prozessor anstehende Aufgaben mit höherer Priorität erledigen kann. Wichtige Beispiele heutiger Betriebssysteme sind Windows, Unix, Linux, MacOS usw. Die folgende Einführung behandelt einige grundlegende Begriffe sowie wichtige Aufgaben und Eigenschaften von Betriebssystemen. Darüber hinaus gibt es aber viele Bereiche auf dem Gebiet der Betriebssysteme, die hier aus Platzgründen nicht behandelt werden können. Weiterführende Informationen enthalten die Vorlesungsaufzeichnungen (s. u.) sowie die Fachliteratur, beispielsweise [Tan07]. Dienste von Betriebssystemen Zu den typischen Aufgaben, die Betriebssysteme übernehmen, den sogenannten Diensten, gehören: • Prozessorverwaltung: „Scheduling“ auch mehrerer Prozessoren; • Hauptspeicherverwaltung: Organisation des Zugriffs auf Dateien, die im Hintergrundspeicher liegen; virtuelle Speicher, Pagingverfahren; • Programmausführung: Laden von Befehlen und Daten in den Hauptspeicher, Anstoßen der Ausführung durch den Prozessor, . . . ; • Zugriff auf Eingabe-/Ausgabegeräte: Umsetzen allgemeiner Lese- und Schreiboperationen in gerätespezifische Steuersignale; • Netzzugriff: Abwicklung der Kommunikation über das Netz; • Zugriff auf Dateien: Kenntnis der Struktur von Dateien, Zugriffsschutz;

96

8 Betriebssysteme • Systemzugriff: Zugriffsschutz; • Buchführung: „Systemlog“; • Sonstige Dienste: eventuell Editor, Compiler, Debugger, Browser, . . .

Betriebsarten von Rechenanlagen Um von einer Rechenanlage eine gewünschte Rechenleistung zu erhalten, muss ein Benutzer einen Auftrag (oder Job) formulieren. Ein Auftrag ist eine nichtleere endliche Menge von möglicherweise gegenseitig abhängigen Teilaufträgen. Ein Teilauftrag (oder Task) ist eine endliche Folge von Betriebssystemkommandos zusammen mit der zu ihrer Ausführung nötigen Betriebsmittel. Die Art und Weise, in der eine Rechenanlage Aufträge entgegennimmt und bearbeitet, bezeichnet man als Betriebsart der Rechenanlage; im Allgemeinen sind mehrere Betriebsarten auf einer Rechenanlage möglich. Wir unterscheiden folgende Betriebsarten: • Stapelbetrieb („batch mode“): Aufträge müssen vor Übergabe an die Rechenanlage mit allen Eingabedaten vollständig definiert sein; ein Auftrag wird stets zusammenhängend übergeben (beispielsweise in Form einer Systemdatei). Während der Bearbeitung eines Auftrags kann nicht eingegriffen werden („off-line“-Ausführung), Zeitanforderungen hinsichtlich Beendigung der Aufträge können nicht gestellt werden. Hauptaufgabe des Batch-Betriebssystems ist eine Maximierung des Durchsatzes (Anzahl der pro Zeiteinheit vollständig bearbeiteten Aufträge). • Multiprogrammbetrieb oder auch Mehrprozessbetrieb („multiprogramming mode“): Mehrere Prozesse (s. u.) können gleichzeitig im Hauptspeicher resident sein. Die Bearbeitung der Prozesse ist zeitlich verzahnt (quasi-parallel oder nebenläufig). Hauptaufgaben eines Multiprogramm-Betriebssystems sind: 1) die Zuteilung von Betriebsmitteln an Prozesse, 2) die Aktivierung oder Blockierung von Prozessen und 3) die gegenseitige Isolation der Prozesse zur Vermeidung unerwünschter gegenseitiger Beeinflussung beim Zugriff auf gemeinsam benutzte Betriebsmittel. Durch Multiprogrammbetrieb kann eine verbesserte Ausnutzung der Betriebsmittel einer Rechenanlage erreicht werden. • Dialogbetrieb („time sharing mode“): Ein Auftrag wird erst im Verlauf einer Dialogsitzung interaktiv definiert, dadurch ist eine Reaktion auf Ergebnisse abgeschlossener Teilaufträge möglich. Man unterscheidet den Teilhaberbetrieb (alle Benutzer verwenden dasselbe Programm) und den Teilnehmerbetrieb (die Benutzer können der Rechenanlage unabhängig voneinander verschiedene Aufträge übergeben). Historisch wurde der Dialogbetrieb für Großrechner mit vielen Terminals entwickelt. Heute liegt der Teilhaberbetrieb beispielsweise Platzbuchungssystemen von Reisebüros oder Schalterterminals einer Bank zugrunde, während der Teilnehmerbetrieb in der interaktiven Programmentwicklung eingesetzt wird. Zusätzlich zur optimierten Ausnutzung der Betriebsmittel hat der Dialogbetrieb eine möglichst zeiteffiziente Abarbeitung der Aufgaben zum Ziel, um die Wartezeit für den Benutzer zu minimieren. • Echtzeitbetrieb („real-time mode“): Im Wesentlichen entspricht die Funktionsweise des Echtzeitbetriebs der des Dialogbetriebs, jedoch kann zusätzlich die Einhaltung von

Einführung

97

Zeitrestriktionen für die Bearbeitung eines Auftrags gefordert werden (beispielsweise Höchstdauer). Außerdem werden Betriebsmittel an Aufträge aufgrund ihrer Priorität (Maß für Dringlichkeit) vergeben. Die Hauptaufgabe eines Echtzeit-Betriebssystems ist es, eine größtmögliche und zeitgerechte Verfügbarkeit der Betriebsmittel einer Rechenanlage zu garantieren, also bei Anforderung eines Betriebsmittels dieses „sofort“ (bzw. innerhalb einer üblicherweise sehr kurzen Zeitspanne) bereitzustellen. • Client/Server-Betrieb („client/server“): In diesem Betriebs-Modus werden in einem verteilten System zentrale Funktionen wie Benutzerverwaltung, Dateiverwaltung, Datenbank-Management-System, Mail-Server, WWW-Server, Druckersteuerung usw. nur an einem Ort, dem „Server“, bereitgestellt. Jeder Rechner („Client“) kann die Funktionen des Servers durch Remote Procedure Call (RPC) (oder Remote Method Invocation (RMI) in Java) aufrufen. Während des Wartens auf das Ergebnis eines RPCs kann der Client andere Aufgaben bearbeiten. Die Hauptaufgabe eines Client/ServerBetriebssystems ist die effiziente Abwicklung solcher entfernter Prozeduraufrufe. Prozesse und Prozesszustände Ein Prozess ist in der allgemeinsten Form der zeitliche Ablauf einer Folge von Aktionen eines Rechners, die zu einer identifizierbaren funktionellen Einheit zusammengefasst sind. Ein Prozess ist charakterisiert durch das durchzuführende Programm oder Programmstück, die zu verwendenden Daten und den Ausführungskontext des Programms. Jeder Prozess besitzt daher einen eigenen Kontrollfluss und einen eigenen Adressraum. Eine wichtige Variante eines Prozesses ist der Thread, der ebenfalls einen eigenen Kontrollfluss besitzt, aber auf den gemeinsamen Adressraums eines übergeordneten Prozesses zugreift, zu dem er gehört. Prozesse werden eingesetzt, um durch „Zerstückelung“ (Teil-)Aufträge zeitlich verzahnt ausführen zu können. Prozesse in Threads aufzuteilen ermöglicht dazu ein schnelleres Umschalten zwischen den entsprechenden Arbeitseinheiten als dies zwischen echten Prozessen möglich wäre; das liegt an der schnelleren Kommunikation durch den gemeinsamen Speicherbereich (wobei dafür auf Konflikte geachtet werden muss). Vergleiche dazu auch das simultane Multithreading, Kapitel 6. Prozesse befinden sich immer in einem von fünf möglichen Zuständen: 1) Initiiert: der Prozess ist dem Betriebssystem bekannt, wurde im Zwischenspeicher abgelegt, ist aber noch nicht zur Bearbeitung zugelassen; 2) Bereit: der Prozess besitzt mit Ausnahme des Prozessors alle zu seiner Bearbeitung notwendigen Betriebsmittel; 3) Aktiv: der Prozess hat zusätzlich Zugriff auf den Prozessor und wird dort ausgeführt; maximal ein Prozess kann in diesem Zustand sein, es sei denn, es gibt mehrere Prozessoren; 4) Blockiert: der Prozess wartet auf Eintritt eines bestimmten Ereignisses, beispielsweise Abschluss einer Eingabe/Ausgabe-Operation oder Zuteilung eines Betriebsmittels; 5) Terminiert: der Prozess hat seine Berechnungen beendet und die von ihm belegten Betriebsmittel freigegeben.

98

8 Betriebssysteme

Das folgende Diagramm zeigt die möglichen Zustandsübergänge von Prozessen: Initiiert

Bereit

Aktiv

Terminiert

Blockiert

Zuteilung von Rechenzeit Im Folgenden bezeichne Π die Menge aller Prozesse und B(p) die Menge aller bereiten Prozesse, die auf einen Prozessor p warten. Wenn das Ereignis „p wird frei“ eintritt, stellt sich die Frage, welchem Prozess P ∈ B(p) der Prozessor p als nächstes zugeteilt werden soll. Verfahren, die Rechenzeit zu Prozessen zuteilen, können in drei Gruppen unterteilt werden: • Einfache Zuteilungsverfahren: Möglichst viel Prozessorleistung soll für Benutzerprozesse bereitstehen, daher wird möglichst wenig Prozessorleistung für das Zuteilungsverfahren verwendet. Ein Beispiel ist ein einfaches „First Come First Serve (FCFS)“Verfahren. • Prioritätsgesteuerte Zuteilungsverfahren: Es sei jedem Prozess P ∈ Π eine Priorität π(P) ∈ N zugeordnet, die dessen Dringlichkeit widerspiegelt. Abhängig von der Priorität kann die Rechenzeit auf verschiedene Weisen zugeteilt werden. Ein einfaches Verfahren kann beispielsweise immer den Prozess P ∈ B(p) aktivieren, der die höchste Priorität aufweist. Kompliziertere Verfahren können Prioritätsklassen bilden, die nach ihrer Dringlichkeit angesteuert werden, während innerhalb der Klassen eine einfache Zuteilung, beispielsweise gemäß FCFS, erfolgt. • Zeitscheibenverfahren (auch „Round-Robin“): Bei diesem Verfahren wird jedem Prozess P ∈ B(p) eine feste Zeitspanne t an Rechenzeit zur Verfügung gestellt. Ist die Zeit abgelaufen oder der Prozess vorher terminiert, erhält der nächste Prozess P ∈ B(p) (in einer beliebigen festen Ordnung) die Berechtigung, den Prozessor für t Zeiteinheiten zu nutzen. Da die Prozesse „zirkulär“ durchlaufen werden, spricht man von einer Zeitscheibe, die man sich tortenmäßig in |B(p)| Abschnitte unterteilt vorstellen kann; die Scheibe dreht sich mit einer Winkelgeschwindigkeit, die der Zeit t pro Abschnitt entspricht. Der Prozess, der zu dem Abschnitt gehört, der sich gerade an einem festen Referenzpunkt der Scheibe befindet, erhält die Rechenzeit. Typische Werte für t liegen zwischen 10 und 100 Millisekunden. Das Zeitscheibenverfahren ist ein „preemptive Scheduling“, weil ein Prozess vor seiner Fertigstellung unterbrochen werden kann (im Gegensatz zum „nonpreemptive Scheduling“). Synchronisation von Prozessen Synchronisation ist notwendig zur gegenseitigen Isolation von Prozessen beim Zugriff auf gemeinsam benutzte Betriebsmittel, also insbesondere beim Einsatz von Threads mit gemeinsamem Adressraum. Fehlerhafte Ergebnisse von synchron ausgeführten Prozessen rühren meist daher, dass „kritische Bereiche“ der Prozesse missachtet werden. Ein kritischer Bereich eines Prozesses ist eine Folge von (atomaren) Operationen, in denen ein Prozess nicht unterbrochen werden darf. Wenn beispielsweise ein Prozess P1 eine Speicherzelle mit einem Wert n belegt,

Einführung

99

um später mit diesem Wert weiterzurechnen, dann darf kein anderer Prozess P2 den Prozess P1 vor Abrufen des Werts n unterbrechen und dieselbe Speicherzelle mit einem anderen Wert m  n belegen. Wenn mehrere Prozesse um dasselbe Betriebsmittel konkurrieren, können kritische Bereiche entstehen; solche Prozesse nennt man voneinander abhängig. Das Betriebssystem muss voneinander abhängige Prozesse korrekt synchronisieren, also in einen gegenseitig verträglichen Ablauf bringen. Sicherheitsaspekte Die Gewährleistung von Sicherheit wird immer mehr zu einer wesentlichen Aufgabe eines Betriebssystems. Unter Sicherheit versteht man unter anderem: 1) Zuverlässigkeit: die Aufgaben des Betriebssystems sollen korrekt entsprechend den spezifizierten Anforderungen erfüllt werden, möglichst trotz des potentiellen Auftretens interner Fehler; 2) Verfügbarkeit: das Betriebssystem muss gewährleisten, dass auch beim Ausfall von Hard- oder Softwarekomponenten im eigenen oder entfernten Rechner die zu erbringenden Dienste für den Benutzer bereitstehen; 3) Vertraulichkeit: das Betriebssystem muss Dienste bereitstellen, die es ermöglichen, den Informationszugriff auf spezifizierte Kommunikationspartner bzw. Benutzer einzuschränken, beispielsweise durch kryptographische Kommunikationsprotokolle; 4) Zugriffsschutz: das Betriebssystem muss gewährleisten, dass kein unberechtigter Zugriff auf Daten oder auf Dienste möglich ist, vgl. Sandbox-Modell von Java; 5) Nachvollziehbarkeit: das Betriebssystem muss gewährleisten, dass Zugriffe auf Daten oder Dienste nachvollziehbar sind, beispielsweise durch „Systemlog“ oder ähnliches. Themen dieses Kapitels Die sieben Aufgaben dieses Kapitels beschäftigen sich mit den Betriebsarten von Rechenanlagen, den Diensten von Betriebssystemen, der Synchronisation von Prozessen und der Zuteilung von Rechenzeit.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Betriebssysteme.html

100

8 Betriebssysteme

Aufgaben Aufgabe 87

BET-AD

Betriebssysteme 





a) Geben Sie eine kurze Definition eines Betriebssystems an. b) Nennen und erklären Sie mindestens drei Aspekte der Sicherheit, die ein Betriebssystem gewährleisten muss. c) Nennen Sie fünf typische Dienste von Betriebssystemen. d) Das Betriebssystem behandelt auszuführende Aufträge als Prozesse. Was versteht man unter Prozessen und wozu werden sie benötigt? e) Welche Zustände kann ein Prozess annehmen? Erklären Sie mindestens drei dieser Zustände näher. f) Ist ein Zustandsübergang von bereit nach blockiert möglich? g) Geben Sie alle sechs möglichen Übergänge zwischen Prozesszuständen und jeweils die dafür zuständige Betriebssystemkomponente an. → Lösung: S. 187

Aufgabe 88

BET-AB 

Betriebsarten 



Welche Betriebsarten von Rechenanlagen gibt es? Nennen Sie zu jeder Betriebsart jeweils mindestens zwei typische zugehörige Merkmale. → Lösung: S. 189

Aufgaben

101

Aufgabe 89

BET-AC 

Betriebssysteme 



Bei der Synchronisation von Prozessen in einem Betriebssystem können Probleme auftreten. Einerseits können falsche Ergebnisse erzielt werden, andererseits birgt die Synchronisation auch die Gefahr von Deadlocks in sich. a) Nennen Sie zwei prinzipielle Möglichkeiten, auf welche Weise Prozesse synchronisiert werden können. Bei welcher dieser Möglichkeiten stellen Deadlocks ein Problem dar? b) Erläutern Sie die Ursache falscher Ergebnisse und beziehen Sie sich in diesem Zusammenhang vor allem auf den kritischen Bereich. → Lösung: S. 191

Aufgabe 90 Betriebssysteme 

BET-AA 





Gegeben sei folgendes Forschungsszenario, in dem eine Rechenanlage genutzt wird: Ein Team erforscht die Faltung von Proteinen, die sehr rechenintensiv ist. Dafür erstellt jeder Forscher eigene Programme und gibt diese an die Rechenanlage. Jeder Forscher erhält so viel Rechenzeit, wie sein Programm benötigt, da nur die vollständig errechneten Daten verwendbar sind. Mit diesen arbeitet der Forscher eine Zeitlang weiter, bis er ein neues Programm der Rechenanlage übergibt. Welche Betriebsart würden Sie für die Rechenanlage in diesem Szenario vorschlagen? Begründen Sie kurz. → Lösung: S. 192

102

8 Betriebssysteme

Aufgabe 91

BET-AE 

Verfahren zur Zuteilung von Rechenzeit 



Nennen und erläutern Sie kurz drei Typen von Verfahren zur Zuteilung von Rechenzeit. → Lösung: S. 192

Aufgabe 92

BET-AG 

Verfahren zur Zuteilung von Rechenzeit 



 Gegeben sei eine Menge = {P1 , P2 , P3 , P4 , P5 } von bereiten Prozessen und deren benötigte CPU-Zeiten t(Pi ) für i ∈ {1, . . . , 5}, die in folgender Tabelle dargestellt sind: Prozessnummer i 1 2 3 4 5

Benötigte CPU-Zeit t(Pi ) 33 ms 17 ms 48 ms 9 ms 66 ms

a) Für zwei Prozesse Pi , P j mit 1 ≤ i  j ≤ 5 seien die Prioritäten p(Pi ), p(P j ) für die Dringlichkeit der Abarbeitung der Prozesse relativ zueinander wie folgt gegeben („longest job first“): p(Pi ) ≥ p(P j ) ⇔ t(Pi ) ≥ t(P j ) Teilen Sie die Rechenzeit mit einem prioritätsgesteuerten Zuteilungsverfahren den Prozessen zu, indem Sie einen Zeitstrahl mit der Zuteilung beschriften (gehen Sie bei dieser Aufgabe davon aus, dass die Kontextwechsel vernachlässigbar kurze Zeit dauern).

0

25

50

75

100

125

150

175

t [ms]

Aufgaben

103

b) Verwenden Sie nun das Zeitscheibenverfahren mit einer maximalen Zeitspanne pro Prozess von 15 ms, um die Rechenzeit auf die Prozesse zuzuteilen und tragen Sie das Ergebnis auf einem Zeitstrahl ein (gehen Sie auch hier davon aus, dass die Kontextwechsel vernachlässigbar kurze Zeit dauern). Die Prozesse werden in der Reihenfolge P1 → P2 → P3 → P4 → P5 → P1 . . . durchlaufen.

0

25

50

75

100

125

150

175

t [ms]

c) Erläutern Sie die Unterschiede zwischen preemptive Scheduling und nonpreemptive Scheduling. Welches dieser beiden Verfahren charakterisiert das prioritätsgesteuerte Zuteilungsverfahren und welches das Zeitscheibenverfahren (Round-Robin)? → Lösung: S. 193

Aufgabe 93 Zeitscheibenverfahren 

BET-AF 





Das Zeitscheibenverfahren, bzw. Round-Robin-Verfahren ist eine Möglichkeit der Zuteilung von Rechenzeit. a) Erklären Sie kurz die Arbeitsweise dieses Verfahrens. b) Sei Z eine Zeitscheibe aus dem Round-Robin-Verfahren mit Gesamtdauer 100 ms pro Umdrehung. Weiterhin gebe es vier Prozesse P1 , P2 , P3 und P4 , die folgende Zeiten t(P1 ), . . . , t(P4 ) zur Fertigstellung benötigen: • t(P1 ) = 13 ms, • t(P2 ) = 32 ms, • t(P3 ) = 22 ms und • t(P4 ) = 50 ms. Die Zeit für einen Kontextwechsel betrage 1 ms. Die Prozesse werden in der Reihenfolge P1 → P2 → P3 → P4 → P1 . . . durchlaufen. Stellen Sie den Ablauf der Abarbeitung der Prozesse grafisch dar und berechnen Sie den durch die Kontextwechsel erzeugten Overhead, also die Zeit, die durch die Wechsel nicht für die Prozesse, sondern für das Zuteilungsverfahren genutzt wird. → Lösung: S. 194

9

Dateiorganisation

Einführung Auf heutigen Rechenanlagen werden zahlreiche Informationen abgelegt, für deren effiziente Speicherung und schnelle Verfügbarkeit die Dateiverwaltung der Rechenanlage sorgen muss. Dabei unterscheidet man Stammdaten, die eher selten geändert werden und Bewegungsdaten, die regelmäßigen Änderungen unterworfen sind. Die häufigsten Operationen auf Dateien sind Hinzufügen („insert“), Suchen („search“) und Entfernen („delete“). Diese Operationen sollten folglich auf einem Dateisystem so effizient wie möglich realisiert werden. Dazu gibt es eine Reihe weiterer wichtiger Anforderungen an die Datenspeicherung in Rechenanlagen, wie 1) die Möglichkeit zur Speicherung der Daten auf externen Speichermedien, also auf großen, nichtflüchtigen Speichern mit automatischen Sicherungs- und Übertragungsmöglichkeiten auf andere Rechenanlagen; 2) die schnelle Verfügbarkeit trotz großer Datenmengen; 3) ein schneller und sicherer Änderungsdienst für das Hinzufügen, Ändern und Entfernen von Daten; 4) eine Möglichkeit zur Strukturierung zusammengehörender Daten zu einer Einheit, beispielsweise Daten eines einzelnen Kunden oder des gesamten Kundenbestands einer Firma; 5) Sicherheitsanforderungen wie eine auf Verschlüsselung basierende Verwaltung und Durchsetzung von Zugriffsrechten oder ein Datei-Logbuch. Grundlagen Ein (logischer) Satz oder „record“ ist die Zusammenfassung logisch zusammengehörender Daten, die dasselbe Objekt oder denselben Sachverhalt betreffen, zu einer benannten logischen Einheit. Zu einem Satz gehört eine Liste benannter Felder (vgl. Instanzvariablen oder Objekte in Programmiersprachen wie Java), wobei jedes Feld wieder wie ein Satz aufgebaut ist, also weitere Felder enthalten kann bis hinunter zu sogenannten Elementarfeldern; diese sind Felder ohne weitere semantische Untergliederung, beispielsweise vom Typ Integer, Real (vgl. float, double, usw.) oder Char. Darüber hinaus enthält ein Satz Informationen über zugehörige Zugriffsmethoden. Der formale Aufbau eines Satzes (Satzname, Feldnamen und rekursiv der Aufbau der Felder) wird durch den Satztyp beschrieben, der eine vergleichbare Funktion hat wie Klassen in Java. Eine Datei ist eine Zusammenfassung von Sätzen eines Satztyps, oder seltener auch von Sätzen unterschiedlichen Typs (insbesondere bei rein sequentieller Verarbeitung). Für die Gesamtheit der zu einer Datei zusammengefassten Sätze können im Allgemeinen einschränkende Bedingungen inhaltlicher Art festgelegt sein und Forderungen an die Existenz

106

9 Dateiorganisation

von überprüfbaren Integritätsbedingungen oder an die Organisation von Zugriffsmöglichkeiten und Zugriffsrechten gestellt werden. Eine Forderung an alle Dateien ist, dass jeder Satz einer Datei (zumindest auf logischer, also Anwenderprogrammebene) eindeutig identifizierbar sein muss, also Informationen enthalten muss, die ihn von anderen Sätzen dieser Datei unterscheiden. Sei D eine Datei mit Satztyp R und sei A Elementarfeld oder Elementarfeldkombination in R. Wir nennen A genau dann identifizierend in D, wenn alle Sätze von D unterschiedliche Werte für A haben. A heißt genau dann Schlüssel in D, wenn A identifizierend in D und minimal ist, wobei minimal bedeutet, dass A entweder Elementarfeld ist oder kein echter Teil von A identifizierend ist. A heißt genau dann Primärschlüssel in D, wenn A Schlüssel in D ist und als Primärschlüssel von vornherein ausgezeichnet wurde (von einer zuständigen Person, um einen bestimmten Zweck zu erfüllen). Als Sekundärschlüssel in D werden Elementarfelder bezeichnet, die nicht identifizierend sein müssen, aber für einen bestimmten Zweck, wie beispielsweise Suchen oder Sortieren, verwendet werden. Dateispeicherraum Wir beschränken uns hier auf die Betrachtung der Speicherung des Datenteils von Dateien. Der verfügbare Gesamtspeicherraum heiße Θ (beispielsweise eine Magnetplatte) und D sei eine Datei. Θ bestehe aus N Blöcken gleicher Größe, durchnummeriert mit den physischen Blocknummern π(B) ∈ {0, . . . , N − 1}. Einzelne Blöcke enthalten immer nur Sätze einer Datei. Die zu D gehörenden Blöcke heißen Dateispeicherraum Θ(D). Weiter bestehe Θ(D) aus ND Blöcken, die entweder physisch aufeinanderfolgend oder verstreut in Θ liegen. Sind die Blöcke aufeinanderfolgend, können sie sortiert oder unsortiert abgelegt sein; in beiden Fällen sind sie identifizierbar durch relative Blocknummern πD (B) ∈ {0, . . . , ND − 1}. Aufgabe des Betriebssystems ist es, eine logische Sicht auf D durch logische Blocknummern B ∈ {0, . . . , ND − 1} und eine Zuordnung B → π(B) bzw. πD (B) → π(B) bereitzustellen. Wir nehmen vereinfachend an, dass es für D eine feste Satzlänge gibt und dass diese die Blockgröße nicht überschreitet; den ganzzahlig abgerundeten Quotienten aus Blocklänge geteilt durch Satzlänge nennen wir Blockungsfaktor BF(D); er gibt an, wie viele Sätze von D in einem Block Platz finden. Sequentielle Primärorganisation von Dateien Unter Primärorganisation von Dateien versteht man die Anordnung von Sätzen bei der physischen Speicherung (Erstabspeicherung). Im Unterschied dazu beeinflusst Sekundärorganisation von Dateien nicht die physische Anordnung der Sätze, sondern bietet nur eine andere Sicht auf eine gegebene solche Anordnung durch geeignete Datenstrukturen, sogenannte „Zugriffspfade“. Ist die Primärorganisation sequentiell, hängt ihre Güte von der Art des Speicherzugriffs ab (sequentiell oder (blockweise) wahlfrei) und davon, ob die Sätze sortiert oder unsortiert abgelegt werden. Die folgende Tabelle gibt die Güte der üblichen Operationen auf Dateien und der Speicherplatznutzung in Abhängigkeit dieser Eigenschaften an (dabei ist 1 – sehr gut, 2 – gut, 3 – schlecht, 4 – sehr schlecht; „logisch entfernen“, Zeile 6, wahlfrei, bedeutet, dass ein Satz als gelöscht markiert aber zunächst in der Datei belassen wird unter gelegentlichem Reorganisieren):

Einführung Speicherzugriff Primärorganisation Sequentiell lesen Sequentiell schreiben Wahlfrei lesen Wahlfrei schreiben Satz einfügen Satz entfernen Speicherplatznutzung

107 Nur sequentiell Sequentiell 1 (unsortiert) 1 4 4 2 (nur „hinten“) 3 1

Nur sequentiell Sequentiell sortiert 1 1 (vorsortiert) 3 3 4 4 1

(Blockweise) wahlfrei Sequentiell sortiert 2 2 (vorsortiert) 1 1 3 2 (logisch), 3 (physisch) 1

Die meisten heutigen Speicher ermöglichen einen wahlfreien oder blockweise wahlfreien Zugriff und damit eine im Vergleich zu sequentiellen Speichern deutlich effizientere Organisation von sequentiell gespeicherten Dateien. Gestreute Primärorganisation von Dateien, Hash-Verfahren Liegt eine gestreute Primärorganisation vor, ist die Erstabspeicherung der Sätze nicht notwendigerweise sequentiell, sondern kann über beliebige Teile des Speichers verteilt sein. Effiziente Operationen auf Dateien sind daher nur bei (blockweise) wahlfreiem Speicherzugriff möglich. Wird eine Operation (Lesen oder Schreiben) auf einem Satz über dessen Primärschlüssel s angefordert, ist eine Anforderung, dass der Zugriff unmittelbar erfolgt. Daher muss insbesondere eine effiziente Berechnung der physischen Adresse des Satzes adr(s) aus dem Primärschlüssel s, also die Abbildung s → adr(s) existieren. Es gibt verschiedene Möglichkeiten, um die Zuordnung s → adr(s) zu realisieren, beispielsweise durch Anlegen eines Index (einer Tabelle mit allen abgespeicherten Primärschlüsselwerten und zugehörigen Satzadressen), durch indexsequentielle Organisation (einer Kombination aus Index und sequentieller Organisation unter Ausnutzung von Blockung und physischer Sortierung nach dem Primärschlüssel) oder durch Hash-Verfahren (s. u.). Im Allgemeinen werden dabei nicht alle physikalisch aufeinanderfolgenden Satzspeicher besetzt, sondern es werden Satzspeicher dazwischen für das Einfügen von Sätzen freigelassen. Beim Einsatz von Hash-Verfahren (Hash – „Zerhacktes“) kann für eine Datei D mit Primärschlüssel s der Wert adr(s) durch eine sogenannte Hash-Funktion h berechnet werden (h(s) wird auch „Hausadresse“ genannt). Eine Hash-Funktion muss folgende Anforderungen erfüllen: 1) Surjektivität; 2) Gleichverteilung: für alle a aus dem Adressraum soll h−1 (a) (Menge der Schlüssel, die durch h auf a abgebildet werden) etwa gleichmächtig sein; 3) effiziente Berechenbarkeit: h soll möglichst mit konstantem Aufwand berechenbar sein. Hash-Funktionen, die in der Praxis üblicherweise Verwendung finden, sind beispielsweise: • Divisionsmethode: h(s) = s mod M, wobei die Sätze somit auf M verschiedene physikalische Adressen verteilt werden. Da M so gewählt werden sollte, dass die Schlüssel möglichst gleichmäßig verteilt werden, wählt man am besten M = p für eine Primzahl p.

108

9 Dateiorganisation • Multiplikative Methode: h(s) = M · (s · r − s · r) mit r ∈ (0, 1) und M verschiedenen verfügbaren Adressen; eine gute Wahl von r ist beispielsweise der „goldene Schnitt“, also r ≈ 0,6180339887. • Mittelquadrat-Methode: Sei s ∈ N mit s = sd sd−1 . . . s1 , wobei si Ziffern von s sind (i ∈ {1, . . . d}). Bilde s2 = q2d q2d−1 . . . q1 , wobei q j Ziffern von s2 sind ( j ∈ {1, . . . 2d}); dann ist h(s) der mittlere Block der Ziffern von s2 als Zahl interpretiert.

Beim Verwenden von Hash-Verfahren kann es vorkommen, dass mehrere Datensätze die gleiche Hausadresse haben und es somit zu Kollisionen kommt, wenn ein neues s auf einen bereits belegten Satzspeicher/Block h(s) trifft. Dieser Fall kann sogar bei „großen“ Adressbereichen relativ oft auftreten, wie beispielsweise das Geburtstagsparadoxon zeigt: Befinden sich in einem Raum 23 Personen (Anzahl der Schlüssel), dann ist die Chance, dass zwei oder mehr dieser Personen am selben Tag Geburtstag haben (Adressbereich der Größe von ca. 365), größer als 50%. Jedes Hash-Verfahren muß daher Adresskollisionen sinnvoll auflösen und den beteiligten Sätzen getrennte Speicherplätze zuordnen. Die Kollisionsauflösung wirkt sich auch auf die Operationen aus, die auf den Sätzen später durchgeführt werden. So erhöht sich der Aufwand für das Suchen von Sätzen durch das notwendige Nachvollziehen der Kollisionsauflösung, die beim Abspeicherungsvorgang durchgeführt wurde, und beim Entfernen von Sätzen kann es zur Unterbrechung von Abspeicherungsketten kommen. Zur Behandlung von Kollisionen gibt es eine Vielzahl an Möglichkeiten, beispielsweise: • Speicherung im ersten freien Satzspeicher nach h(s) („lineares Austesten“); • Speicherung in einem separaten Überlaufbereich bzw. in einem Folgeblock; • Anwendung einer zweiten Hash-Funktion (wobei dann wieder auf Kollisionen geachtet werden muss). Wenn N die Anzahl der Sätze ist, für die ein Hashwert durch die Hash-Funktion h berechnet werden soll, und M die Anzahl der Adressen, auf die diese Sätze verteilt werden, heißt der Quotient α = N/M Belegungsfaktor von h. Je größer der Belegungsfaktor α einer Hash-Funktion h ist, desto höher ist die Wahrscheinlichkeit für das Auftreten von Kollisionen beim Verwenden von h. Themen dieses Kapitels Die sieben Aufgaben dieses Kapitels beschäftigen sich vor allem mit der Hash-Organisation und dem Vergleich von Hash- und index-sequentieller Organisation von Dateien sowie mit anderen Bereichen der Dateiorganisation.

Dieses Thema in der Vorlesungsaufzeichnung zur Vorlesung „Grundlagen der Informatik II“: http://www.dasinfobuch.de/links/ Dateiorganisation.html

Aufgaben

109

Aufgaben Aufgabe 94

DAT-AF 

Dateiorganisation 



Inwiefern unterscheidet sich die Sekundärorganisation (SO) von der Primärorganisation (PO) und was sind die Aufgaben dieser Dateiorganisationsformen? → Lösung: S. 194

Aufgabe 95 Dateiorganisation 

DAT-AD 





a) Nach welchen Kriterien wird die Effizienz von Dateiorganisationsformen beurteilt? b) Nennen Sie wichtige Anforderungen, die Datenverarbeitungssysteme erfüllen sollten. → Lösung: S. 195

Aufgabe 96

DAT-AB

Dateiorganisation, Hash-Organisation 





a) Nennen Sie die Haupttypen, der Primärorganisation von Daten und erläutern Sie diese kurz. Ordnen Sie in diesem Zusammenhang insbesondere die Hash-Organisation passend ein. b) Was wird auf Hardware-Seite benötigt, damit eine Hash-Organisation möglich ist? Welche zusätzlichen Anforderungen, werden an eine Hash-Funktionen gestellt? c) Gegeben sei ein Speicher der Größe M = 5 mit den relativen Satznummern (RSN) 0, . . . , 4. RSN 0 1 2 3 4

Satz mit Schlüssel

110

9 Dateiorganisation In der folgenden Tabelle seien zudem die Primärschlüssel von Datensätzen gegeben, die in den Speicher aufgenommen werden sollen. Bei einer Kollision soll lineares Austesten erfolgen. Primärschlüssel s h(s)

46

29

98

60

162

• Definieren Sie allgemein eine passende Hash-Funktion h unter der Berücksichtigung des gegebenen Bild- und Wertebereichs. • Gegeben sei nun die Hash-Funktion h(s) = s mod 5 Füllen Sie die beiden Tabellen aus. → Lösung: S. 196

Aufgabe 97

DAT-AE 

Hash-Organisation, Index-sequentielle Organisation 



Vergleichen Sie Effizienz der Hash-Organisation und die der Index-sequentiellen Organisation relativ zueinander in Bezug auf die folgenden Kriterien. Hash-Organisation

Index-sequentielle Organisation

Sequentielles Lesen Sequentielles Schreiben Wahlfreies Lesen Wahlfreies Schreiben Satz einfügen Satz entfernen Speicherplatznutzung → Lösung: S. 197

Aufgaben

111

Aufgabe 98

DAT-AC 

Hash-Organisation 



a) Was ist eine Hash-Funktion und wie werden Hash-Funktionen im Zusammenhang mit Dateiorganisation eingesetzt? b) Sie werden gebeten, eine Hash-Funktion auszuwählen, auf deren Grundlage Sätze in einem Speicher abgelegt werden sollen. Aufgrund von sonstigen Beschränkungen bleiben Ihnen zwei Möglichkeiten: • h1 : N → N : h1 (x) = x mod 17 oder • h2 : N → N : h2 (x) = x mod 10 Welche der beiden Hash-Funktionen würden Sie auswählen? Begründen Sie kurz. → Lösung: S. 197

Aufgabe 99

DAT-AA 

Hash-Organisation 



In einen Speicher der Größe M = 8 sollen nacheinander die folgenden Schlüssel aufgenommen werden: 64 − 7 − 62 − 70 − 83 − 19 − 6 − 99 Zur Einsortierung eines Schlüssels s wird die folgende Hash-Funktion verwendet: h(s) = s mod M = s mod 8 Als Kollisionsbehandlungsstrategie wird lineares Austesten verwendet. a) Wie sieht der Speicherblock nach dem Einfügen der Werte aus (RSN steht für relative Satznummer)? RSN 0 1 2 3 4 5 6 7

Satz mit Schlüssel

112

9 Dateiorganisation b) Begründen Sie, warum man diese Hash-Funktion in der Praxis nicht verwenden würde und geben Sie eine bessere Hash-Funktion an. → Lösung: S. 198

Aufgabe 100

DAT-AG 

Hash-Organisation 



Gegeben sei für einen Primärschlüssel s ∈ N folgende Hash-Funktion h : N → N: h(s) = (s · a + b) mod 11 Dabei gelte zunächst

a=b=3

Zudem seien die folgenden Primärschlüssel von Datensätzen gegeben, die in einem Speicher der Größe 11 abgelegt werden sollen: 135 – 102 – 28 – 61 – 6 – 14 – 94 a) Berechnen Sie die Hashwerte der gegebenen Primärschlüssel. s h(s) b) Fügen Sie die Datensätze in der angegebenen Reihenfolge in den durch folgende Tabelle dargestellten Speicher ein (RSN steht für relative Satznummer), indem Sie die Primärschlüssel in die entsprechenden Positionen eintragen. Verwenden sie bei Kollisionen die Strategie des linearen Austestens. RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s

Datensatz ... ... ... ... ... ... ... ... ... ... ...

Aufgaben

113

c) Fügen Sie die Datensätze nun aufsteigend sortiert in den durch folgende Tabelle dargestellten Speicher ein. Verwenden sie bei Kollisionen wieder die Strategie des linearen Austestens. RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s

Datensatz ... ... ... ... ... ... ... ... ... ... ...

d) Fügen Sie die Datensätze nun wieder in der gegebenen (nicht aufsteigenden) Reihenfolge in den durch folgende Tabelle dargestellten Speicher ein. Verwenden Sie in Kollisionsfällen diesmal die Strategie der separaten Verkettung. RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s → → → → → → → → → → →

→ → → → → → → → → → →

Verkettungen → → → → → → → → → → →

→ → → → → → → → → → →

→ → → → → → → → → → →

e) Lässt sich die Anzahl der Kollisionen bzw. die Länge der Verkettungen in d), durch andere Werte für a und b reduzieren? f) Verändern sich durch eine andere Wahl für a und b die RSN-Zeilen, auf denen es zu Kollisionen kommt? → Lösung: S. 198

Lösungen → Aufgabe S. 7

Lösung zu Aufgabe 1 – CMO-AG a)

1) Flipflop: Speicherung eines Bits (Schaltwerk mit mindestens zwei stabilen Zuständen) • Einschreiben in den Speicher: Schaltwerk muss definierte Einstellung durch Eingangssignale gestatten • Auslesen aus dem Speicher: Speicherinhalt muss in negierter oder nichtnegierter Form an den Schaltwerksausgängen zur Verfügung stehen 2) Register: Speicherung einer Bitfolge, die gewöhnlich als Zahl interpretiert wird • Realisiert als Folge synchroner Flipflops mit Hinzunahme eines Takts T → Aufgabe S. 7

Lösung zu Aufgabe 1 – CMO-AG b)

1) AND(a, b) = NOR(NOR(a, a), NOR(b, b)) 2) OR(a, b) = NOR(NOR(a, b), NOR(a, b)) → Aufgabe S. 7

Lösung zu Aufgabe 1 – CMO-AG c)

1) XOR(a, b) = NOR(AND(a, b), NOR(a, b)) oder XOR(a, b) = NOR(NOR(NOR(a, a), NOR(b, b)), NOR(a, b))  AND(a,b)

2) XOR(a, b) = NOT(OR(AND(a, b), NOT(OR(a, b)))) oder: XOR(a, b) = AND(OR(a, b), NOT(AND(a, b)))

116

Lösungen → Aufgabe S. 7

Lösung zu Aufgabe 2 – SCH-AA

a) Die Wertetabelle enthält die zu addierenden Bits a, b sowie ein Übertragsbit c (carry), und als Funktion davon das Summenbit S und das Übertragsbit für die nächste Stelle C. a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

S 0 1 1 0 1 0 0 1

C 0 0 0 1 0 1 1 1

Lösung zu Aufgabe 2 – SCH-AA

→ Aufgabe S. 7

b) Die KNF lautet jeweils: S = (a ∨ b ∨ c) ∧ (a ∨ b ∨ c) ∧ (a ∨ b ∨ c) ∧ (a ∨ b ∨ c) = a ⊕ b ⊕ c C = (a ∨ b) ∧ (b ∨ c) ∧ (a ∨ c) Lösung zu Aufgabe 2 – SCH-AA

→ Aufgabe S. 7

c) Wir verwenden für S die Formel aus Teil b) und vereinfachen für C die DNF: C = (a ∧ b ∧ c) ∨ (a ∧ b ∧ c) ∨ (a ∧ b ∧ c) ∨ (a ∧ b ∧ c) = (a ∧ b ∧ c) ∨ (a ∧ b ∧ c) ∨ (a ∧ b) = [((a ∧ b) ∨ (a ∧ b)) ∧ c] ∨ (a ∧ b) = (a ⊕ b ∧ c) ∨ (a ∧ b)

Lösungen

117

Es ergibt sich das folgende Schaltnetz:

Halbaddierer a

1

&

b

C

& 2k+1 S

2k+1

c

Halbaddierer → Aufgabe S. 8

Lösung zu Aufgabe 3 – SCH-AC

a

a

b

HA s

b

c

VA ü

s

c

d

VA ü

s

d

VA ü

ü

s

2k+1 2k+1

2k+1 2k+1

A

118

Lösungen → Aufgabe S. 8

Lösung zu Aufgabe 4 – SCH-AB a) Wahrheitstabelle: s1 0 0 0 0 1 1 1 1

s2 0 0 1 1 0 0 1 1

s3 0 1 0 1 0 1 0 1

L 0 0 0 1 0 1 0 1 → Aufgabe S. 8

Lösung zu Aufgabe 4 – SCH-AB b) L(s1 , s2 , s3 ) = (s1 ∧ s2 ∧ s3 ) ∨ (s1 ∧ s2 ∧ s3 ) ∨ (s1 ∧ s2 ∧ s3 )

→ Aufgabe S. 8

Lösung zu Aufgabe 4 – SCH-AB

c) L(s1 , s2 , s3 ) = (s1 ∨ s2 ∨ s3 ) ∧ (s1 ∨ s2 ∨ s3 ) ∧ (s1 ∨ s2 ∨ s3 ) ∧ (s1 ∨ s2 ∨ s3 ) ∧ (s1 ∨ s2 ∨ s3 ) → Aufgabe S. 9

Lösung zu Aufgabe 5 – SCH-AE

a) Ein getaktetes Schaltwerk berechnet eine Funktion y(t) = f (a(t), z(t)) aus dem zum Zeitpunkt t am Eingang anliegenden Signal a(t) und dem im vorherigen Takt im zugehörigen Schaltnetz berechneten Signal z(t).

Takt z(t)

z(t+1) Schaltnetz

a(t)

Lösung zu Aufgabe 5 – SCH-AE

y(t)=f(a(t),z(t))

→ Aufgabe S. 9

b) Durch „scharfes Hinsehen“ bzw. logisches Nachdenken kommt man auf folgende Lösung:

Lösungen

119

t s

q

r

q

s

q

r

q

a

t

1

1

& E t

1

Eine andere Vorgehensweise ist, einen endlichen Automaten für die Sprache L zu erstellen und diesen in ein Schaltwerk umzusetzen. • Es ergibt sich folgender endlicher Automat: A = ({0, 1}, {s00 , s01 , s10 }, δ, s00 , {s10 }) 



δ:

 

 

 



 

• Wir setzen jeden Zustand s xy (x, y ∈ {0, 1}) des Automaten in die Belegungen f1 = x, f2 = y der beiden benötigten Flipflops in der Schaltung um. Wenn wir mit f1 , f2 die Ausgabe des jeweiligen Flipflops im nächsten Takt bezeichnen, ergibt sich folgende Wahrheitstabelle: E 0 0 0 0 1 1 1 1

f1 0 0 1 1 0 0 1 1

f2 0 1 0 1 0 1 0 1

a = f1 0 0 1 − 0 1 1 −

f2 0 0 0 − 1 0 0 −

Wir setzen a = f1 , was bedeutet, dass die Ausgabe der Schaltung genau der Ausgabe des ersten Flipflops entspricht. Es wird also keine weitere Logik am Ausgang benötigt. • Wir stellen DNFs auf, um die benötigte Logik am Eingang zu ermitteln: a = f1 = E  f1 f2 ∨ E f1 f2 ∨ E f1 f2 f2 = E f1 f2

120

Lösungen Die Normalformen können beispielsweise durch Karnaugh-Veitch-Diagramme vereinfacht werden. • Nun lässt sich das entsprechende Schaltwerk generieren, das ohne Vereinfachung der Formeln allerdings komplizierter ist als das angegebene. → Aufgabe S. 9

Lösung zu Aufgabe 6 – SCH-AF

t E

2k+1

s

q

r

q

a

t

1

→ Aufgabe S. 9

Lösung zu Aufgabe 7 – SCH-AD a) Zustandsüberführungsdiagramm von A: A = ({0, 1}, {s00 , s01 , s10 , s11 }, δ, s00 , {s11 }) δ:

  

  

  

Lösung zu Aufgabe 7 – SCH-AD



  

  

→ Aufgabe S. 9

b) α = (0 + 100 + 11 + 101) 101 Lösung zu Aufgabe 8 – CMO-AA • Boolesche Funktion: f = ¬(a ∧ b ∧ c) = ¬a ∨ ¬b ∨ ¬c

→ Aufgabe S. 14

Lösungen

121

• CMOS-Schaubild: V DD

a b

f

c

GND

Lösung zu Aufgabe 9 – CMO-AF • Boolesche Funktion: f = a ∨ b = ¬(¬a ∧ ¬b)

→ Aufgabe S. 15

122

Lösungen • CMOS-Schaubild: V DD a b f

GND

Lösung zu Aufgabe 10 – CMO-AC

→ Aufgabe S. 15

a) CMOS steht für Complementary-Metal-Oxide-Semiconductor. CMOS stellt die heutige Standardtechnologie in der Chip-Herstellung dar. Dabei werden PMOS- und NMOSTransistoren in komplementärer Weise zusammen verbaut. Lösung zu Aufgabe 10 – CMO-AC

→ Aufgabe S. 15

b) Ein NMOS-Transistor kann die „0“ gut übertragen und die „1“ schlecht. Ein PMOSTransistor kann hingegen die „1“ gut übertragen jedoch die „0“ schlecht. Lösung zu Aufgabe 10 – CMO-AC c)

• Boolesche Funktion: f = (¬a ∧ ¬b) ∨ c

→ Aufgabe S. 15

Lösungen

123 • CMOS-Schaubild: V DD

a

f

b

c

GND

→ Aufgabe S. 15

Lösung zu Aufgabe 11 – CMO-AH • Boolesche Funktion: f = a ∨ b ∨ c = ¬(¬a ∧ ¬b ∧ ¬c) • CMOS-Schaubild: V DD a b c

f

GND

124

Lösungen → Aufgabe S. 16

Lösung zu Aufgabe 12 – CMO-AB a)

• Boolesche Funktion: f = (¬a ∧ ¬b) ∨ (¬c ∧ ¬d) • CMOS-Schaubild: VDD

a

b f c

d

GND

Lösung zu Aufgabe 12 – CMO-AB b)

• Boolesche Funktion: f =(¬a ∧ ¬b) ∨ (¬c ∧ ¬d) =¬(a ∨ b) ∨ ¬(c ∨ d) =¬[¬(¬(a ∨ b) ∨ ¬(c ∨ d))] =¬((a NOR b) NOR(c NOR d))

→ Aufgabe S. 16

Lösungen

125 • Schaltnetz: a b

1 1

1

f

c d

1 → Aufgabe S. 16

Lösung zu Aufgabe 13 – CMO-AI a)

• Boolesche Funktion: f (a, b, c) = (¬a ∧ b) ∨ (b ∧ ¬c) ∨ (¬a ∧ c) • CMOS-Schaubild: V DD

a

b

c

f

NMOS GND

126

Lösungen → Aufgabe S. 16

Lösung zu Aufgabe 13 – CMO-AI b) Komplementär

→ Aufgabe S. 17

Lösung zu Aufgabe 14 – CMO-AE a)

• Schaltung: NOR • Boolesche Funktion: f (a, b) = ¬a ∧ ¬b = ¬(a ∨ b) → Aufgabe S. 17

Lösung zu Aufgabe 14 – CMO-AE b)

• Schaltung: NAND • Boolesche Funktion: f (a, b) = ¬a ∨ ¬b = ¬(a ∧ b) → Aufgabe S. 17

Lösung zu Aufgabe 14 – CMO-AE c)

• Schaltung: AND • Boolesche Funktion: f (a, b) = ¬(¬a ∨ ¬b) = a ∧ b → Aufgabe S. 17

Lösung zu Aufgabe 14 – CMO-AE d)

• Schaltung: NOT • Boolesche Funktion: f (a) = ¬a → Aufgabe S. 17

Lösung zu Aufgabe 14 – CMO-AE

e) Die Leitfähigkeit könnte unzureichend sein, um die Funktionsweise der Schaltung aufrechtzuerhalten, da NMOS-Transistoren gut die 0 und schlecht die 1 übertragen und PMOS-Transistoren gut die 1 und schlecht die 0. → Aufgabe S. 18

Lösung zu Aufgabe 15 – CMO-AD • Wahrheitstabelle: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

f 1 0 0 0 0 0 0 0

Lösungen

127

• Boolesche Funktion: f = ¬a ∧ ¬b ∧ ¬c = ¬(a ∨ b ∨ c) Im PMOS-Block kann das Ausgangssignal f nur auf „1“ liegen, wenn alle drei PMOSTransistoren leiten. Die Eingangssignale a, b und c müssen dazu alle auf „0“ liegen. Im NMOS-Block liegt das Ausgangssignal f auf „0“, wenn mindestens einer der drei NMOS-Transistoren leitet. Für die Eingangssignale a, b und c reicht dazu eine „1“. Es leitet jeweils nur einer der Blöcke und der andere sperrt. Es handelt sich demnach um ein NOR-Gatter mit drei Eingängen.

1 Lösung zu Aufgabe 16 – CMO-AJ

→ Aufgabe S. 18

• Term nach erster Zusammenführung: ¬a ∧ ¬b • Term nach zweiter Zusammenführung: ¬(¬a ∧ ¬b) = a ∨ b • Term nach dritter Zusammenführung: ¬(a ∨ b) ∨ ¬c = ¬a ∧ ¬b ∨ ¬c → f (a, b, c) = ¬a ∧ ¬b ∨ ¬c Lösung zu Aufgabe 17 – VER-AA

→ Aufgabe S. 19

Wahr

Falsch

Die Aussagenlogik, die Mengenalgebra und die Schaltalgebra sind Boolesche Algebren. Daher gelten für sie äquivalente Axiome und Umformungsgesetze.





Es kann vorkommen, dass durch zwei verschiedene Verknüpfungsbasen ein und derselben Funktionsmenge unterschiedliche Anzahlen von Funktionen darstellbar sind.





Systeme, die aus ASICs bestehen, können nachträglich nicht umprogrammiert werden, solche aus FPGAs schon.





NMOS-Transistoren liegen in CMOS-Schaltungen tendenziell näher an GND als an VDD .





Durch Dotierung werden Eigenschaften des Siliziumkristalls geändert, sodass er als Transistor verwendet werden kann





128

Lösungen → Aufgabe S. 24

Lösung zu Aufgabe 18 – BIN-AA

a) Zuerst werden 0- bzw. 1-Knoten zusammengefasst, danach wird bottom-up nach dem Algorithmus verfahren. In grau werden die Knoten angezeigt, die im nächsten Schritt zusammengefasst bzw. entfernt werden. • Vereinfachung: 

      















 



 

 



  





 



 











 

• BDD:   



 

  

  







 

 



















Lösungen

129 → Aufgabe S. 24

Lösung zu Aufgabe 18 – BIN-AA b) Wahrheitstabelle: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

f (a, b, c) 0 1 1 1 0 0 1 1

Boolescher Ausdruck (sowohl aus Wahrheitstabelle als auch aus BDD ablesbar): a b c + a bc + a bc + abc + abc a b c + a b + ab + bc + bc a b c + b a c + b

f (a, b, c) = = = =

→ Aufgabe S. 24

Lösung zu Aufgabe 19 – BIN-AB a)

• Vereinfachung:  

    

 













 

 

  



  













 

 

  



130

Lösungen • BDD:  















 





  



→ Aufgabe S. 24

Lösung zu Aufgabe 19 – BIN-AB b) Boolescher Ausdruck: f (a, b, c) = a · b · c + a · b + a · b · c = a · (bc + b ) + a · b · c = a · (c + b ) + a · b · c

→ Aufgabe S. 25

Lösung zu Aufgabe 20 – BIN-AG a)

• Vereinfachung:  





  

















 



 



 

   

  

 



 





 

 



  







 



  



 

 



 

    



 





   

 



   



 



 

 

Lösungen

131 



    







 











  







  





 

 





 



 

 





 









 







 

 



 



























    

  

 

 

  

   

 

 

  

 



 

 

  



• BDD:



 

  

















  





 



 

 



  



















































 



  

 











 



 







 











 

  

 

132

Lösungen → Aufgabe S. 25

Lösung zu Aufgabe 20 – BIN-AG

b) Boolescher Ausdruck als disjunktive Normalform (DNF) aus dem BDD (die Terme in [. . .] deuten die Herleitung an): f =a bc + a bcd + a b c + a b cd + abc + abcd + ab c d + ab cd f =bc [a bc + abc ] + a bcd + a c [a b c + a bc ] + a b cd + acd[abcd + ab cd] + ab c d f =bc + a bcd + a c + a b cd + acd + ab c d f =bc + a bcd + a c + b cd[a b cd + acd] + acd + ab c d f =bc + a cd [a bcd + bc ] + a c + b cd + acd + ab c d f =bc + a d [a cd + a c ] + a c + b cd + acd + ab c d f =bc + a d + a c + b cd + acd + ab c d → Aufgabe S. 26

Lösung zu Aufgabe 21 – BIN-AF a)

• Vereinfachung:   







 



 

  



 



  







   



   



 





• BDD:    

 

 



  









 

  





  

  

   

Lösungen

133 → Aufgabe S. 26

Lösung zu Aufgabe 21 – BIN-AF b) Wahrheitstabelle: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

f (a, b, c) 0 0 0 1 0 1 0 0

Boolescher Ausdruck: f = ab c + a bc = c(a ⊕ b) → Aufgabe S. 26

Lösung zu Aufgabe 22 – BIN-AE • Wahrheitstabelle: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

f (a, b, c) 0 1 1 0 1 1 1 1

• Entscheidungsbaum:   











   

 

 



 

 

   

 

 

134

Lösungen • Vereinfachung:  

  

 

  





 







 



 



  

 











 









 















 

 

  

• BDD:       

 



 

 

→ Aufgabe S. 27

Lösung zu Aufgabe 23 – BIN-AH • Wahrheitstabelle: a 0 0 0 0 1 1 1 1

b 0 0 1 1 0 0 1 1

c 0 1 0 1 0 1 0 1

a · b 0 0 1 1 0 0 0 0

a · c 1 0 1 0 0 0 0 0

a · b + a · c 1 0 1 1 0 0 0 0

b⊕c 0 1 1 0 0 1 1 0

f (a, b, c) 1 1 1 1 0 1 1 0

Lösungen

135

• Entscheidungsbaum:   











   

















  













• Vereinfachung  

  







 





  







  











   









 

 





      

   

 





  

• BDD:







 



  

 

136

Lösungen → Aufgabe S. 27

Lösung zu Aufgabe 24 – BIN-AD Nach der Shannon-Formel kann man die Funktion f umschreiben zu: f (a, b, c) = a · f (1, b, c) + a · f (0, b, c) = a · (b + c ) · (b + c ) + a · b · (b + c ) = a · c + a · b Damit kommt man zu folgendem BDD:  



 

 

Lösung zu Aufgabe 25 – KOD-AB

 

 

→ Aufgabe S. 35

a) Der Hammingabstand gibt die Anzahl der Stellen an, an denen sich zwei Wörter unterscheiden. Lösung zu Aufgabe 25 – KOD-AB

→ Aufgabe S. 35

b) Hammingabstand: h(Hu f f man, Ho f mann) = 4 Lösung zu Aufgabe 25 – KOD-AB c)

→ Aufgabe S. 35

• Fehlererkennbarkeit: Trotz Verfälschung eines Codewortes an bis zu k Stellen kann kein anderes Codewort entstehen: hc ≥ k + 1. • Fehlerkorrigierbarkeit: Trotz Verfälschung eines Codewortes an bis zu k Stellen kann das ursprüngliche Codewort eindeutig ermittelt werden: hc ≥ 2k + 1.

Lösungen

137 → Aufgabe S. 35

Lösung zu Aufgabe 25 – KOD-AB

d) Die sichere Übertragung eines Codes kann beispielsweise durch Anhängen eines Paritätsbits (Prüfbit; XOR-Verknüpfung der Bits im Wort) erhöht werden. Dieses gibt an, ob eine gerade/ungerade Anzahl an Einsen oder Nullen im Wort vorkommt. → Aufgabe S. 35

Lösung zu Aufgabe 26 – KOD-AL

k

1 y

x

y

x

k

1

1 k

z

k z

• Fehlererkennbarkeit: An der linken Abbildung kann man die Fehlererkennbarkeit eines Codes ablesen. Der euklidische Abstand zwischen den Codewörtern x, y und z repräsentiert anschaulich den Hammingabstand zwischen diesen Wörtern. Liegt kein Codewort in einem Kreis mit Radius k um ein anderes Codewort, ergibt sich die Hammingzahl zu hc ≥ k + 1. Die Kodierung ist dann mindestens k-fehlererkennbar, da eine Veränderung von höchstens k Bits an einem Codewort nicht ein anderes Codewort ergeben kann. In der Abbildung gilt hc = k + 1 (angedeutet an zwei Beispielen), also ist k = hc − 1. • Fehlerkorrigierbarkeit: Die rechte Abbildung verdeutlicht die Fehlerkorrigierbarkeit. Alle Kreise mit Radius k um die Codewörter sind hier disjunkt. Die Hammingzahl ergibt sich zu hc ≥ 2k + 1. Die Kodierung ist dann mindestens k-fehlerkorrigierbar, da eine Veränderung von höchstens k Bits an einem Codewort nicht zu einem Wort führen kann, das durch Veränderung von höchstens k Bits aus einem anderen Codewort entstanden   ist. In der Abbildung gilt hc = 2k + 1 (angedeutet an einem Beispiel), also ist k = hc2−1 .

138

Lösungen

Lösung zu Aufgabe 27 – KOD-AO

→ Aufgabe S. 36

a) Hammingzahl: hc = min{h(x, y) | x, y ∈ {w | ∃v ∈ α : c(v) = w}, x  y} mit Hammingabstand h(x, y): Anzahl der Stellen, an denen sich x und y unterscheiden Es gilt für U  V: ⎧ ⎪ 8, falls U, V ∈ {A, B, C, D} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {C, D, E} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {A, F} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {A, G} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {B, F} ⎪ ⎪ ⎪ ⎨ h(U, V) = ⎪ oder U, V ∈ {B, H} ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {C, H} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {D, G} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {F, E} ⎪ ⎪ ⎪ ⎪ ⎪ ⎪ oder U, V ∈ {G, H}, ⎪ ⎪ ⎪ ⎪ ⎩4 sonst Es ergibt sich also die Hammingzahl hc = 4. Lösung zu Aufgabe 27 – KOD-AO b)

→ Aufgabe S. 36

• Fehlererkennbarkeit: k = hc − 1 = 4 − 1 = 3 ⇒ c ist 3-fehlererkennbar     • Fehlerkorrigierbarkeit: j = hc2−1 = 4−1 ⇒ c ist 1-fehlerkorrigierbar 2

Lösung zu Aufgabe 27 – KOD-AO

→ Aufgabe S. 36

c) Das Anhängen eines Paritätbits würde in diesem Fall keine Vergrößerung der Hammingzahl bewirken. Die Anzahl der Einsen bzw. Nullen in einem Codewort ist immer gerade, sodass das Prüfbit für jedes Codewort den gleichen Wert hätte. Jedoch kann man durch Anhängen eines Paritätsbits immer eine ungerade Anzahl von Fehlern erkennen (aber nicht korrigieren), indem die Parität des übertragenen Wortes überprüft wird. Lösung zu Aufgabe 27 – KOD-AO

→ Aufgabe S. 36

d) Die Kodierung erfüllt die Fano-Bedingung, da keines der Codewörter Anfang eines anderen Codewortes ist.

Lösungen

139

Lösung zu Aufgabe 27 – KOD-AO

→ Aufgabe S. 36

e) Die Kodierung c ist injektiv, d. h. jedem Element des Eingabealphabets wird ein anderes Codewort zugeordnet. Da c zusätzlich die Fano-Bedingung erfüllt, folgt die Injektivität der natürlichen Fortsetzung. Lösung zu Aufgabe 28 – KOD-AN

→ Aufgabe S. 36

a) Ja, die Fano-Bedingung ist erfüllt, da kein Codewort gleich dem Anfang eines anderen Codewortes ist bzw. weil alle Zeichen mit der gleichen Bit-Anzahl kodiert sind und alle 8 Codewörter unterschiedlich sind. Lösung zu Aufgabe 28 – KOD-AN

→ Aufgabe S. 36

b) Hammingzahl: hc = 3 • Fehlererkennbarkeit: hc ≥ k + 1 ⇒ Der Code ist 2-fehlererkennbar. • Fehlerkorrigierbarkeit: hc ≥ 2k + 1 ⇒ Der Code ist 1-fehlerkorrigierbar. Lösung zu Aufgabe 28 – KOD-AN

→ Aufgabe S. 36

c) Übertragene dekodierte Zeichenfolge: „i“ „fehlerhaftes Codewort“ „ f “ „o“ „i“ „s“ „t“ „t“ „o“ „l“ „l“ „!“ → Die Übertragung war nicht fehlerfrei; das zweite Zeichen wurde falsch übertragen. Es existiert kein Zeichen, das mit 0100000 kodiert wird. Stattdessen sollte eigentlich „0000000“ („n“) übertragen werden (1-fehlerkorrigierbar). Lösung zu Aufgabe 29 – KOD-AP

→ Aufgabe S. 37

a) Die Kodierung c ist injektiv (sogar bijektiv), da jedem Element des Ausgangsalphabets ein anderes Codewort zugeordnet wird. Lösung zu Aufgabe 29 – KOD-AP

→ Aufgabe S. 37

b) Die Kodierung c erfüllt die Fano-Bedingung, da kein Codewort Präfix eines anderen Codewortes ist. Lösung zu Aufgabe 29 – KOD-AP

→ Aufgabe S. 37

c) Die natürliche Fortsetzung c ist injektiv, da die Kodierung c injektiv ist und zudem die Fano-Bedingung erfüllt.

140

Lösungen → Aufgabe S. 37

Lösung zu Aufgabe 29 – KOD-AP d)

• Hammingabstand h(a, b) = 1 mit c(a) = 1010 und c(b) = 1000 • Der Hammingabstand zweier verschiedener Codewörter kann nicht 0 sein, da c injektiv ist. → Hammingzahl: hc = 1 • Fehlererkennbarkeit: k = hc − 1 = 1 − 1 = 0: 0-fehlererkennbar     = 0: 0-fehlerkorrigierbar • Fehlerkorrigierbarkeit: k = hc2−1 = 1−1 2 → Aufgabe S. 37

Lösung zu Aufgabe 29 – KOD-AP e) Fehlererkennbarkeit: 1 = k = hc − 1 → hc = 2

Mit c(b) = 0000 und c(c) = 1001 gilt hc = 2. Somit ist c 1-fehlererkennbar. → Aufgabe S. 37

Lösung zu Aufgabe 29 – KOD-AP f) Fehlerkorrigierbarkeit: 1 = k = a b c d e f

 h  −1  c

2

1 0 1 1 0 0

→ hc = 3 (2-fehlererkennbar)

0 0 0 1 1 1

1 0 0 1 1 0

0 0 1 1 0 1

0 1 0 1 0 0

0 1 1 1 1 0

Anmerkung: Die zusätzlichen Bits können einerseits (wie hier geschehen) durch Ausprobieren hinzugefügt werden. Zudem können die Bits aber auch durch Überprüfung der Parität gewählt werden. Lösung zu Aufgabe 30 – KOD-AC a) Hammingzahl: hc = 1 → 0-fehlererkennbar, 0-fehlerkorrigierbar

→ Aufgabe S. 38

Lösungen

141 → Aufgabe S. 38

Lösung zu Aufgabe 30 – KOD-AC b)

1) Es ergibt sich folgender erweiterter Code: a0 a1 a2 a3 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

a0 a1 a2 a3 p 00000 00011 00101 00110 01001 10111 11000 11011 11101 11110 → Aufgabe S. 38

Lösung zu Aufgabe 30 – KOD-AC b)

2) Das Anhängen des Prüfbits bewirkt, dass wir immer eine gerade Anzahl Einsen im Codewort haben. Die Hammingzahl hc erhöht sich zudem um 1. Hammingzahl: hc = 2 → 1-fehlererkennbar, 0-fehlerkorrigierbar → Aufgabe S. 38

Lösung zu Aufgabe 30 – KOD-AC c)

1) Es ergibt sich folgender erweiterter Code: a0 a1 a2 a3 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111

a0 a1 a2 a3 p1 p2 p3 p4 00000000 00010111 00101101 00111010 01001011 10110100 11000101 11010010 11101000 11111111

142

Lösungen → Aufgabe S. 38

Lösung zu Aufgabe 30 – KOD-AC c)

2) Das Anhängen des Prüfbits untersucht jeweils, ob ungerade oder gerade Anzahl Einsen in den Teilen a1 a2 a3 , a1 a3 a4 , a1 a2 a4 und a2 a3 a4 des Codewortes vorkommen. Insgesamt ergibt sich dann eine gerade Anzahl Einsen im Codewort. Hammingzahl: hc = 4 → 3-fehlererkennbar, 1-fehlerkorrigierbar → Aufgabe S. 39

Lösung zu Aufgabe 31 – KOD-AM

Wahr

Falsch

Eine Huffman-Kodierung ist immer eindeutig bestimmt.





Bei der Huffman-Kodierung werden Zeichenfolgen stets auf Codewortfolgen optimaler Länge abgebildet.





Für eine eindeutige Erzeugung von Codewörtern muss eine Kodierung die Fano-Bedingung erfüllen.





Für eine eindeutige Dekodierung von Codewortfolgen muss die verwendete Kodierung die Fano-Bedingung erfüllen.





Injektive Kodierungen haben injektive natürliche Fortsetzungen.





Erfüllt eine Kodierung die Fano-Bedingung, so ist die natürliche Fortsetzung injektiv.





→ Aufgabe S. 40

Lösung zu Aufgabe 32 – KOD-AE • Absolute Häufigkeiten: Zeichen Häufigkeit

F 5

I 5

S 5

C 4

H 4

R 3

E 3

T 2

Z 1

Σ 32

Lösungen

143

• Huffman-Baum:  

 



    















 







































 

















• Kodierung c: Zeichen Code

F 101

• Codelänge L(c): 5 5 L(c) = 32 · 3 + 32 ·3+

I 110 5 32

·3+

S 111 4 32

·3+

C 011 4 32

H 100

·3+

3 32

R 001

·3+

3 32

E 000 ·3+

T 0101

2 32

·4+

1 32

Z 0100 · 4 = 3,09375

• Ersparnis: Um 9 Zeichen mit einer Kodierung fester Codelänge darzustellen, werden 4 Bits benötigt. ≈ 22,7% 1 − 3,09375 4 → Aufgabe S. 40

Lösung zu Aufgabe 33 – KOD-AG • Absolute Häufigkeiten: Zeichen Häufigkeit

W 1

T 1

S 1

F 1

I 1

A 1

N 2

O 3

E 3

L 6

Σ 20

144

Lösungen • Huffman-Baum:  







  









  









 

















 









 

































• Huffman-Kodierung c: Zeichen Code

W 0111

T 0110

• Codelänge L(c): 1 1 L(c) = 20 ·4 + 20 ·4 +

1 20 ·4

+

S 0011 1 20 ·4

+

F 0001 1 20 ·4

+

1 20 ·4

I 0010

A 0000

+

+

2 20 ·3

3 20 ·3

N 010 +

3 20 ·3

+

6 20 ·2

E 100 =

60 20

L 11 =3

→ Aufgabe S. 41

Lösung zu Aufgabe 34 – KOD-AH • Absolute Häufigkeiten: Zeichen Häufigkeit

O 101

E 9

F 5

H 5

U 5

G 4

K 2

Σ 30

Lösungen

145

• Huffman-Baum:    



  

















  





 

















• Huffman-Kodierung: E 10

Zeichen Code • Codelänge L(c): 9 5 L(c) = 30 · 2 + 30 ·2+

5 30

·3+

5 30

F 110

·3+

4 30

H 111 ·3+

U 00

2 30

G 011

K 010

8 · 3 = 2 15

→ Aufgabe S. 41

Lösung zu Aufgabe 35 – KOD-AI • Absolute Häufigkeiten: Zeichen Häufigkeit

U 3

R 3

B 2

E 2

A 2

− 2

S 1

C 1

H 1

T 1

Σ 18

146

Lösungen • Huffman-Baum:  

 

     















 



























 

  





































• Kodierung c: Zeichen Code

U 111

R 110

B 010

E 100

− 000

A 001

S 1010

C 0110

H 0111

→ Aufgabe S. 41

Lösung zu Aufgabe 36 – KOD-AF • Absolute Häufigkeiten: Zeichen Häufigkeit

I 1

T 1011

H 1

E 1

R 1

D 2

N 3

L 3

M 6

U 8

Σ 26

Lösungen

147

• Huffman-Baum:    



  



 













 

















 





  































• Kodierung c: Zeichen Code

U 11

L 001

• Codelänge L(c): 8 6 L(c) = 26 · 2 + 26 ·2+

3 26

I 0000

·3+

3 26

H 10111

·3+

2 26

·4+

E 10110 1 26

·4+

R 0001 1 26

·4+

D 1010 1 26

·5+

N 100 1 26

M 01

· 5 = 2 10 13

148

Lösungen → Aufgabe S. 42

Lösung zu Aufgabe 37 – KOD-AJ a)

• Absolute Häufigkeiten: Zeichen Häufigkeiten

R 4

B 3

E 3

A 2

U 2

N 1

I 1

Σ 16

• Huffman-Baum:   



 



















  

  

 















 







• Kodierung c: Zeichen Code • Codelänge L(c): 3 4 L(c) = 16 · 2 + 16 ·2+

R 10 3 16

B 111

·3+

2 16

E 00 ·3+

A 010 2 16

·3+

U 110 1 16

·4+

N 0111 1 16

·4=

I 0110 43 16

= 2 11 16

Lösungen

149 → Aufgabe S. 42

Lösung zu Aufgabe 37 – KOD-AJ b) Nein, c ist keine Huffman-Kodierung für den angegebenen Text:

1) Die Fano-Bedingung ist nicht erfüllt, beispielsweise ist c (R) = 00 ein Präfix von c (A) = 001. 2) Die Kodierung ist auch nicht minimal, da sich die Länge der Codewörter von c und c nur für U unterscheiden und hier gilt: |c(U)| < |c (U)|. → Aufgabe S. 42

Lösung zu Aufgabe 38 – KOD-AQ a)

• Absolute Häufigkeiten: D 2

Zeichen Häufigkeiten

E 5

I 4

K 7

L 8

O 1





Σ 30

R 3

• Huffman-Baum:  







 

  















 

 











 





 





• Kodierung c: Zeichen Code

D 0001

E 111

I 110

K 01

L 10

O 0000

R 001

150

Lösungen → Aufgabe S. 42

Lösung zu Aufgabe 38 – KOD-AQ b) Dekodierung des Strings: 01 001 0000 01 0000 0001 110 10 111 Das entspricht: KROKODI LE

→ Aufgabe S. 42

Lösung zu Aufgabe 38 – KOD-AQ

c) Nein, da man zum Beispiel durch Kippen aller Bits ebenfalls eine minimale Kodierung erzeugen kann. → Aufgabe S. 42

Lösung zu Aufgabe 38 – KOD-AQ d) Codelänge L(c): 1 2 L(c) = 30 · 4 + 30 ·4+

3 30

·3+

4 30

·3+

5 30

·3+

7 30

·2+

8 30

· 2 = 2,6 → Aufgabe S. 42

Lösung zu Aufgabe 38 – KOD-AQ e) Zusätzlicher Speicherplatz: 3 2,6 − 1 ≈ 15,38%

→ Aufgabe S. 43

Lösung zu Aufgabe 39 – KOD-AD a)

• Absolute Häufigkeiten: Zeichen Häufigkeiten

a 14

b 10

c 3

d 9

e 36

f 4

Σ 76

Lösungen

151 • Huffman-Baum:    













  





































• Kodierung c: e 0

Zeichen Code • Codelänge L(c): 14 L(c) = 36 76 · 1 + 76 · 3 +

10 76

·3+

a 111 9 76

b 110

·3+

4 76

d 101 ·4+

3 76

f 1001

c 1000

· 4 = 2 11 76

• Einsparung gegenüber der 4-Bit-Kodierung: 11 1 − 2 4/76 = 46,38% Lösung zu Aufgabe 39 – KOD-AD b)

→ Aufgabe S. 43

• Er muss die Fano-Bedingung erfüllen (kein Codewort darf Präfix eines anderen Codewortes sein). • Die Codelänge des Codes muss minimal sein.

152

Lösungen → Aufgabe S. 43

Lösung zu Aufgabe 39 – KOD-AD c) Codewörter g und h g und i h und i

Hammingabstand 4 4 2

Die Hammingzahl ergibt sich somit zu hc = 2 (minimaler Hammingabstand) → Aufgabe S. 43

Lösung zu Aufgabe 39 – KOD-AD d)

Wahr

Falsch

Die Huffman-Kodierung ist ein Standard-Verfahren zur Datenkompression.





Huffman-Codes sind eindeutig bestimmt.





Die Kodierung aus c) ist 2-fehlererkennbar.





Die Kodierung aus c) ist 1-fehlerkorrigierbar.





Lösung zu Aufgabe 40 – KOD-AK

→ Aufgabe S. 44

a) b v w b e n a c w a f d x p Lösung zu Aufgabe 40 – KOD-AK

→ Aufgabe S. 44

b) Da der Schlüssel die Länge 5 hat und der bekannte Teil der Nachricht die Länge 6, wird das Zeichen „_“ vorne und hinten mit demselben Buchstaben des Schlüssels chiffriert. Die abgefangene Nachricht enthält nur einen Textteil, der nach dem Prinzip „abcd“ aufgebaut ist (  = Verschlüsselung von „_“ und abcd  = Verschlüsselung von „easy“): der Teil „hudalh“. Daraus folgt, dass aus „_“ ein „h“ wurde und die restlichen Buchstaben können dementsprechend auch zugewiesen werden: k0 = „(h - _)“ mod 28 = (9 − 1) mod 28 = 8  = g k1 = „(u - e)“ mod 28 = (22 − 6) mod 28 = 16  = o k2 = „(d - a)“ mod 28 = (5 − 2) mod 28 = 3  = b k3 = „(a - s)“ mod 28 = (2 − 20) mod 28 = 10  = i k4 = „(l - y)“ mod 28 = (13 − 26) mod 28 = 15  = n

Lösungen

153

Man sieht, dass „gobin“ ein möglicher Schlüssel ist. Aber man weiß noch nicht, ob dieser Schlüssel die richtige Reihenfolge der Buchstaben wiedergibt, bis man den Schlüssel unter den chiffrierten Text wiederholt aneinanderreiht beginnend bei dem bereits identifizierten Teil „hudalh“): ysvmbh_thslzwmfcsfhudalhhrjsmsugc_o bingobingobingobingobingobingobingo vigenere_cipher_is_easy_to_decrypt! Man sieht also dass „bingo“ der Schlüssel ist und hat damit die Wahrheit des in der unteren Tabellenzeile entschlüsselten Nachrichtentexts gezeigt. Lösung zu Aufgabe 41 – KOD-AA

→ Aufgabe S. 50

a) Einige der gebräuchlichen n-Bit-Codes lauten: • ASCII (American Standard Code For Information Interchange): 7-Bit-Code (und 1 Prüfbit) oder 8-Bit-Code • EBCDIC (Extended Binary Coded Decimal Interchange Code): 8-Bit-Code • Unicode: 16-Bit pro Zeichen Lösung zu Aufgabe 41 – KOD-AA b)

→ Aufgabe S. 50

• 510 = 11110101EBCDIC • 710 = 11110111EBCDIC

Lösung zu Aufgabe 41 – KOD-AA

→ Aufgabe S. 50

c) Die Tetradenkodierung ist eine Blockkodierung, bei der die Ziffern immer durch 4 Bits dargestellt werden. Vertreter sind • BCD-Kodierung, • Exzess-3-Code sowie • Aiken-Code. Anmerkung: Der 2-aus-5-Code ist eine Blockkodierung mit 5 Bits.

154

Lösungen → Aufgabe S. 50

Lösung zu Aufgabe 41 – KOD-AA d) Zahl / Kodierung 2 6 9

BCD 0010 0110 1001

Aiken 0010 1100 1111

→ Aufgabe S. 50

Lösung zu Aufgabe 41 – KOD-AA e)

1) String 10001001011010000100100101000011 01000000000111010011001010110001 01110011010110100100101101100101

BCD x

Exzess-3 x x

→ Aufgabe S. 50

2) String 10001001011010000100100101000011 01000000000111010011001010110001 01110011010110100100101101100101

Lösung zu Aufgabe 42 – ZAH-AE a)

Aiken x

Lösung zu Aufgabe 41 – KOD-AA e)

Exzess-3 0101 1001 1100

BCD 89684943

Aiken

Exzess-3 56351610

40173251 40271832 → Aufgabe S. 51

• Der Zahlenwert 8 in Exzess-3-Darstellung entspricht der Darstellung der Zahl 8 + 3 = 11 in Dualdarstellung, da eine Verschiebung um 3 vorliegt. 1110 = 10112 → 810 = 1011Exzess−3 • Der BCD-Code ist eine Blockkodierung mit 4 Bits. Demnach können 4 Bits die Zahlen 0 bis 9 darstellen. Damit ergibt sich: 810 = 1000BCD • Der Aiken-Code ist eine Blockkodierung mit 4 Bits. Um eine Zahl d zwischen 5 und 9 darzustellen, wird für den Aiken-Code die Zahl d + 6 in Dualdarstellung angegeben (zwischen 0 und 4 wird einfach d in Dualdarstellung angegeben). 1410 = 11102 → 810 = 1110Aiken

Lösungen

155 → Aufgabe S. 51

Lösung zu Aufgabe 42 – ZAH-AE b) Hierfür werden drei 4-Bit-Blöcke des BCD-Codes benötigt: 23510 = 0010 0011 0101BCD

→ Aufgabe S. 51

Lösung zu Aufgabe 42 – ZAH-AE c) Zweikomplement-Darstellung: 510 = 01012K,4 −710 = 10012K,4

Um −7 darzustellen, wird zunächst die 7 in Dualdarstellung dargestellt, man erhält 0111. Werden nun alle Bits gekippt und 1 addiert, so erhält man die obige Darstellung. Addition: +

1 0

0 1

0 0

1

1

1

1 1

1

0

Überprüfung: 510 + −710 = −210 = 11102K,4 → Aufgabe S. 51

Lösung zu Aufgabe 43 – ZAH-AB

a) Darstellung des Zahlenbereiches mit n Bits (unsymmetrisch zum Nullpunkt): A2K,n = {−2n−1 , . . . , 0, . . . , 2n−1 − 1} Hier: A2K,8 = {−128, . . . , 127} Berechnung der Werte: (62)10 = (32 + 16 + 8 + 4 + 2)10 = (0 · 27 + 0 · 26 + 1 · 25 + 1 · 24 + 1 · 23 + 1 · 22 + 1 · 21 + 0 · 20 )10 = (00111110)2K,8 (−37)10 = −(32 + 4 + 1)10 = −(0 · 27 + 0 · 26 + 1 · 25 + 0 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 1 · 20 )10 = −(00100101)2K,8 = (11011011)2K,8 („Kippen aller Bits und Addition von 1“) Berechnen der Differenz durch Addition des Komplements: (62 − (−37))10 = (62 + 37)10 = 9910 Daher: 0 0 1 1 1 1 1 0 + 0 0 1 0 0 1 0 1 =

0

1

1

1

1

1

1

0

0

0

1

1

156

Lösungen → Aufgabe S. 51

Lösung zu Aufgabe 43 – ZAH-AB

b) Darstellung des Zahlenbereiches mit n Bits (symmetrisch zum Nullpunkt, also zwei Darstellungen der Null): A1K,n = {−2n−1 + 1, . . . , 0, . . . , 2n−1 − 1} Hier: A1K,8 = {−127, . . . , 127} Negative Zahlen erhält man jetzt durch einfaches Kippen der Bits der Darstellung der positiven Zahl: −3710 = (11011010)1K,8 Die Berechnung der Differenz erfolgt analog zur Zweikomplement-Darstellung. → Aufgabe S. 52

Lösung zu Aufgabe 44 – ZAH-AI a) Darstellung von 128 als Dualzahl zur Basis 2 mit 32 Bits: 128 = 27 = 0000 0000 0000 0000 0000 0000 1000 00002 Kippen der Bits: 1111 1111 1111 1111 1111 1111 0111 1111 Addition von 1: −12810 = 1111 1111 1111 1111 1111 1111 1000 00002K,32

→ Aufgabe S. 52

Lösung zu Aufgabe 44 – ZAH-AI b) 8193 = 213 + 20 = 0000 0000 0000 0000 0010 0000 0000 00012K,32

→ Aufgabe S. 52

Lösung zu Aufgabe 44 – ZAH-AI c)

3310 = 25 + 20 = 0000 0000 0010 0001VZB = 0000 0000 0010 00012K,16 −1710 = −(24 + 20 ) = 1000 0000 0001 0001VZB = 1111 1111 1110 11112K,16 → Aufgabe S. 52

Lösung zu Aufgabe 45 – ZAH-AK

a) Darstellbarer Zahlenbereich bei 4 Bits (Einskomplement-Darstellung): 7 1000

6

7 0111

1001 5

6 0110 0101 5

1010

4 1011 3

0100 4

1100

0011 1101

2

0010 1110 1

0000 1111 0

0001 1

2

3

Lösungen

157 • Negation: Kippen aller Bits. • Addition: bitweise Addition wie bei Dualzahlen (u. U. ist eine Überlaufbehandlung durch Reduktion mod 2n − 1, also durch Addition des Überlaufs notwendig). • Subtraktion: bitweise Addition der Negation. • Darstellbarer Bereich: {−2n−1 + 1, . . . , 0, . . . , 2n−1 − 1}. • Weitere Eigenschaften: symmetrisch zum Nullpunkt, es existieren zwei Darstellungen der Null. → Aufgabe S. 52

Lösung zu Aufgabe 45 – ZAH-AK

b) Darstellbarer Zahlenbereich bei 4 Bits (Zweikomplement-Darstellung): 8 7 1000 1001

6

7 0111

1010 5

6 0110 0101 5

1011

4 1100

0100 4

3 1101 1110 2

0011

3

0010 1111 1

0000 0

0001 1

2

• Negation: Kippen aller Bits und duale Addition von 1. • Addition: bitweise Addition wie bei Dualzahlen (u. U. ist eine Überlaufbehandlung durch Reduktion mod 2n , also durch Ignorieren des Überlaufs notwendig). • Subtraktion: bitweise Addition der Negation. • Darstellbarer Bereich A = {−2n−1 , . . . , 0, . . . , 2n−1 − 1}. • Weitere Eigenschaften: asymmetrisch zum Nullpunkt, eine Darstellung der Null.

158

Lösungen → Aufgabe S. 52

Lösung zu Aufgabe 45 – ZAH-AK c)

• Einskomplement-Darstellung: 710 = 01111K,4 • Zweikomplement-Darstellung: 710 = 01112K,4 → Aufgabe S. 52

Lösung zu Aufgabe 45 – ZAH-AK d)

• Einskomplement-Darstellung: −710 = 10001K,4 • Zweikomplement-Darstellung: −710 = 10012K,4 → Aufgabe S. 52

Lösung zu Aufgabe 45 – ZAH-AK

e) Mit 4 Bits ist +12 in beiden Darstellungsarten nicht darstellbar, da der darstellbare Zahlenbereich verlassen wird. → Aufgabe S. 52

Lösung zu Aufgabe 46 – ZAH-AD

a) Die Zahl sei bitweise gegeben als z ∈ B32 : z = v c7 . . . c0 m−1 . . . m−23    Vorzeichenbit Charakteristik c Mantisse (ohne impl. 1) m Die Werte für das Vorzeichen V, die Charakteristik C und die Mantisse M werden wie folgt berechnet: V = (−1)v C=

7 

2i

i=0

M =1+

−1 

2i · mi

i=−23

Der Exponent E der normierten Gleitpunktzahl wird in Exzess-q-Darstellung gespeichert. Daher benötigt man zur Umrechnung das q, welches sich für eine Charakteristik der Länge |c| = 8 wie folgt ergibt: q = 2|c|−1 − 1 = 27 − 1 = 127 Damit ergibt sich  der Exponent zu: E = C − q = 7i=0 2i − 127 Der Zahlenwert der Gleitpunktzahl ergibt sich dann zu: 7 i  E v 2 −127) i ( i=0 · 1 + −1 G(z) = V · 2 · M = (−1) · 2 i=−23 2

Lösungen

159 → Aufgabe S. 52

Lösung zu Aufgabe 46 – ZAH-AD b) Mit der IEEE-754-Darstellung ergibt sich −2052/128 = (−1)1 · (16 + 4 + 32/128 + 16/128 + 4/128) = (−1)1 · (16 + 4 + 1/4 + 1/8 + 1/32) = (−1)1 · (24 + 22 + 2−2 + 2−3 + 2−5 ) V

2E

M

   = (−1)1 · 24 · (1 + 2−2 + 2−6 + 2−7 + 2−9 ) ⇒v=1 C = E + q = 4 + 127 = 13110 = 100000112 c = 10000011 m = 01000110100000000000000 ⇒ −2052/128 = 1 10000011 01000110100000000000000GPZ Lösung zu Aufgabe 47 – ZAH-AH

→ Aufgabe S. 53

a) Gleitpunktzahl gemäß der IEEE-754-Darstellung mit einfacher Genauigkeit bedeutet, dass 32 Bits unterteilt werden in 1 Bit für das Vorzeichen v, 8 Bits für die Charakteristik c und 23 Bits für die Mantisse ohne implizite Eins m . −1397/128 = (−1)1 · (23 + 22 + 20 + 2−1 + 2−2 + 2−7 ) = (−1)1 · 23 · (1 + 2−1 + 2−3 + 2−4 + 2−5 + 2−10 ) = (−1)1 · 2130−127 · (1 + 2−1 + 2−3 + 2−4 + 2−5 + 2−10 ) Daraus ergibt sich: v=1 c = 10000010 m = 10111000010000000000000 −1397/128 = 1 10000010 10111000010000000000000GPZ

160

Lösungen

Lösung zu Aufgabe 47 – ZAH-AH

→ Aufgabe S. 53

b) Gemäß IEEE-754-Darstellung ergibt sich V C E M

=1 = 100110112 = 15510 = 155 − 127 = 28 = 1 + 0, 011100100000000000000002 = 185/128 = 1,4453125

G(x) = (−1)V · 2E · M = −228 · 185/128 = −387973120 Lösung zu Aufgabe 48 – ZAH-AA

→ Aufgabe S. 53

 Die Mantisse −1 i ohne implizite Eins m wird durch folgende Formel berechnet:  m = i=−4 2 · mi Die  Charakteristik c wird durch folgende Formel berechnet: c = 2i=0 2i · ci Der Zahlenwert G(z) einer als Gleitpunktzahl in obiger Darstellung kodierten Zahl z wird folgendermaßen berechnet: G(z) = (−1)v · 2c−q · (1 + m ) Dabei berechnet sich q als: q = 23−1 − 1 = 3 Es ergibt sich:

G(0 101 1101) =(−1)0 · 25−3 · (1 + 2−1 + 2−2 + 2−4 ) = 29/4 G(1 001 0001) =(−1)1 · 21−3 · (1 + 2−4 ) = −17/64 G(1 110 1110) =(−1)1 · 26−3 · (1 + 2−1 + 2−2 + 2−3 ) = −15

Lösung zu Aufgabe 49 – ZAH-AJ a)

→ Aufgabe S. 54

• Darstellung von -12,43 als Festpunktzahl. Die Zahl −12,43 ergibt sich als Zweikomplement der Dualdarstellung von 12,43. Die Vorkommazahl lässt sich wie folgt zerlegen: 12 = 23 + 22 . Also ist die Binärdarstellung der Vorkommazahl 012 1100. Für die Berechnung der Nachkommabits wenden wir einen Trick an: Wir multiplizieren nur die Nachkommastellen wiederholt mit 2. Ergibt sich dabei eine 1 vor dem Komma, muss auch das entsprechende Bit gesetzt werden. Wenn sich keine 1 ergibt, steht eine 0 an der entsprechenden Bit-Position. Dieses Verfahren wiederholen wir (und ignorieren dabei die Vorkommastellen beim Multiplizieren) so lange, bis wir eine Periodizität der Nachkommabits erkennen oder 16 Nachkommabits berechnet haben.

Lösungen

161 Stelle 0 1 2 3 4 5 6 7

Berechnung 0,43 · 2 = 0,86 0,86 · 2 = 1,72 0,72 · 2 = 1,44 0,44 · 2 = 0,88 0,88 · 2 = 1,76 0,76 · 2 = 1,52 0,52 · 2 = 1,04 0,04 · 2 = 0,08

Stelle 8 9 10 11 12 13 14 15

Berechnung 0,08 · 2 = 0,16 0,16 · 2 = 0,32 0,32 · 2 = 0,64 0,64 · 2 = 1,28 0,28 · 2 = 0,56 0,56 · 2 = 1,12 0,12 · 2 = 0,24 0,24 · 2 = 0,48

Unsere gesuchte Festpunkt-Darstellung von 12,43 lautet also: 0000 0000 0000 1100 , 0110 1110 0001 0100 Nun müssen wir noch das Zweikomplement der Zahl berechnen, um die Darstellung von −12,43 zu erhalten. Dazu invertieren wir die Zahl und addieren 1 auf die niederwertigste Stelle: 1111 1111 1111 0011 , 1001 0001 1110 1100 • Darstellung von 27,875 als Festpunktzahl. Die Vorkommazahl lässt sich wie folgt zerlegen: 27 = 24 + 23 + 21 + 20 . Daraus ergeben sich die Vorkommabits zu 011 11011. Zur Berechnung der Nachkommastellen verwenden wir wieder den oben beschriebenen Trick: Stelle 0 1 2 3 .. .

Berechnung 0,875 · 2 = 1,75 0,750 · 2 = 1,50 0,500 · 2 = 1,00 0,000 · 2 = 0,00 .. .

Die Darstellung von 27,875 als Festpunktzahl lautet also: 0000 0000 0001 1011 , 1110 0000 0000 0000

→ Aufgabe S. 54

Lösung zu Aufgabe 49 – ZAH-AJ b)

• Darstellung von -12,43 als Gleitpunktzahl. Wir nutzen die Ergebnisse aus Teilaufgabe a). Da der größte Exponent 23 ist, kann man Zahlen bis 2−20 darstellen. Man muss also noch weitere Nachkommabits berechnen: Stelle 15 16 17 18 19 20

Berechnung 0,24 · 2 = 0,48 0,48 · 2 = 0,96 0,96 · 2 = 1,92 0,92 · 2 = 1,84 0,84 · 2 = 1,68 0,68 · 2 = 1,36

162

Lösungen Demnach ergibt sich: −12,43 =(−1)1 · (23 + 22 + 2−2 + 2−3 + 2−5 + 2−6 + 2−7 + 2−12 + 2−14 + 2−18 + 2−19 + 2−20 + 2−21 ) =(−1)1 · 2130−127 · (1 + 2−1 + 2−5 + 2−6 + 2−8 + 2−9 + 2−10 + 2−15 + 2−17 + 2−21 + 2−22 + 2−23 + 2−24 ) Es ist also V = 1, C = 13010 = 100000102 und m = 10001101110000101001000 (da 2−24 ebenfalls ein Summand ist, runden wir auf). Demzufolge lautet die IEEE754-Darstellung der Zahl: 1 10000010 10001101110000101001000 • Darstellung von 27,875 als Gleitpunktzahl. 27,875 =(−1)0 · (24 + 23 + 21 + 20 + 2−1 + 2−2 + 2−3 ) =(−1)0 · 2131−127 · (1 + 2−1 + 2−3 + 2−4 + 2−5 + 2−6 + 2−7 ) Also ist V = 0, C = 13110 = 100000112 und m = 10111110000000000000000. Somit lautet die IEEE-754-Darstellung der Zahl: 0 10000011 10111110000000000000000 → Aufgabe S. 54

Lösung zu Aufgabe 49 – ZAH-AJ c)

• Addition in Festpunkt-Darstellung. + 1

1111 0000 0000

1111 0000 0000

1111 0001 0000

0011 1011 1111

, , ,

1001 1110 0111

0001 0000 0001

1110 0000 1110

1100 0000 1100

Unter Vernachlässigung der durch Übertrag entstandenen 1 erhalten wir die Festpunkt-Darstellung der Summe: 0000 0000 0000 1111 , 0111 0001 1110 1100 • Addition in Gleitpunkt-Darstellung. Zur Addition in Gleitpunkt-Darstellung muss zunächst die Differenz der Exponenten betrachtet werden. Da der Exponent der zweiten Zahl um 1 größer ist als der Exponent der ersten Zahl, muss die Mantisse der zweiten Zahl um eins nach links verschoben werden. Zudem ist die erste Zahl negativ, weshalb wir sie von der zweiten Zahl binär subtrahieren. Vor beiden Mantissen muss die implizite 1 ergänzt werden. Die binäre Subtraktion der Mantissen ergibt sich zu: −

1 0

1011 1100 1111

1110 0110 0111

0000 1110 0001

0000 0001 1110

0000 0100 1011

0000 1000 1000

Lösungen

163 Für die Charakteristik der neuen Zahl wird die größere der Charakteristiken der beiden Ausgangszahlen minus der Anzahl der führenden Nullen im Ergebnis der Subtraktion der Mantissen genommen, also Cadd = (131 − 1)10 = 13010 = 100000102 . Das Vorzeichen ist positiv, wie man durch einen Vergleich der Zahlen für die Mantissen-Subtraktion erkennen kann, also gilt Vadd = 0. Die neue Mantisse ergibt sich, indem man aus dem Ergebnis der obigen Berechnung die führende Null und die dahinterstehende implizite Eins weglässt. Die IEEE-754 Darstellung der neuen Zahl lautet also: 0 10000010 11101110001111010111000 → Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG a) 99400008

→ Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG b) 231 + 228 + 227 + 224 + 222 + 23 = 2571108360

→ Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG c) −(228 + 227 + 224 + 222 + 23 ) = −423624712

→ Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG d) −(231 − 1) + 228 + 227 + 224 + 222 + 23 = −1723858935

→ Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG e) −231 + 228 + 227 + 224 + 222 + 23 = −1723858936

→ Aufgabe S. 54

Lösung zu Aufgabe 50 – ZAH-AG f)  1 00110010  10000000000000000001000  v

m

c

V=1 E = 001100102 − 127 = 25 + 24 + 21 − 127 = 50 − 127 = −77 M = 100 0000 0000 0000 0000 10002 + 1 = 2−1 + 2−20 + 1 G(x) = (−1)V · 2E · M = −2−77 · (1 + 2−1 + 2−20 ) ≈ −9,926174 · 10−24

164

Lösungen → Aufgabe S. 55

Lösung zu Aufgabe 51 – ZAH-AF a)

• Zerlegung der Zahl in Vorzeichen und Zweierpotenzen: −50,25 = (−1)1 · (32 + 16 + 2 + 1/4) = (−1)1 · (25 + 24 + 21 + 2−2 ) • Ausklammern der größten Zweierpotenz; da für die Mantisse M gelten soll 1≤M 2 · 15 min 16

s

8 s

Lösung zu Aufgabe 74 – REK-AK

→ Aufgabe S. 78

b) Datentransfer über das Internet wäre in diesem Fall schneller (zum Missfallen des Studenten), denn: 4,7 GB 4,7 GB Megabit = 25 MB = 1504 s ≈ 25,07 min < 2 · 15 min 25

s

8 s

Lösung zu Aufgabe 75 – VER-AD

→ Aufgabe S. 78

Wahr

Falsch

Die Zeit, die benötigt wird, um auf einen Datensatz an einer bestimmten Adresse einer Festplatte zuzugreifen, ist für dieselbe Festplatte immer die gleiche.





Hyperthreading gaukelt dem Betriebssystem mehr Prozessorkerne vor als tatsächlich vorhanden sind.





Beim Hyperthreading werden Programme mit wenigen Threads in mehr Threads zerlegt, bevor sie ausgeführt werden.





Busse haben immer genau zwei angeschlossene Geräte, die Daten untereinander austauschen.





Seitenfehler bringen Betriebssysteme gewöhnlich zum Absturz.





Beim „preemptive Scheduling“ kann ein Prozess so lange über den Prozessor verfügen, wie er möchte.





182

Lösungen

Lösung zu Aufgabe 76 – PRO-AA

→ Aufgabe S. 88

Um die Arbeit des Programmierers etwas angenehmer zu gestalten, wurden im Laufe der Zeit verschiedene Programmierebenen eingeführt, die durch unterschiedliche Abstraktionsgrade von der Maschinensprache an gegebene Problemstellungen angepasst sind. Somit gibt es heute eine Hierarchie von Sprachebenen, deren Programme durch Übersetzung ineinander überführbar sind. Durch Interpretierung können diese Programme direkt ausgeführt werden. Dabei stellt sich jede Ebene nach außen als abstrakte Maschine dar. Die unterste Programmierebene ist die Mikroprogrammierung . Diese ist in der Regel jedoch nicht frei zugänglich für den Programmierer.

Lösung zu Aufgabe 77 – PRO-AB

Die Programmiersprachenebenen kann man von höhersprachlich zu hardwarenah folgendermaßen sortieren: Objektorientiere Sprachen → Assemblersprachen → Mikroprogrammierung → Maschinensprachen → Hardware.

→ Aufgabe S. 88

Wahr

Falsch





Erklärung: Eine richtige Sortierung wäre: problemorientierte Sprachen (imperative, objektorientierte, funktionale, prädikative) → Assemblersprachen → Maschinensprachen → Mikroprogrammierung. Problemorientierte Programmiersprachen sind weitgehend unabhängig von der Hardware der Rechenmaschinen.





Befehle in Assemblersprachen werden nicht binär, sondern symbolisch notiert.





Durch Übersetzung sind Programme aus höheren Sprachebenen in niedrigere überführbar. Durch Interpretierung sind Programme aller Sprachenebenen direkt ausführbar.





Sowohl die Ebene der Maschinensprachen, als auch die der Mikroprogrammierung sind dem Anwender nicht zugänglich.





Erklärung: Die Ebene der Maschinensprachen ist dem Anwender zugänglich, die Ebene der Mikroprogrammierung üblicherweise nicht. Eine Maschinensprache stellt Befehle in binärer Kodierung dar.





Lösungen

183

Problemorientierte Programmiersprachen können folgendermaßen kategorisiert werden: iterative Programmiersprachen, funktionale und additive Programmiersprachen, prädikative und operative Programmiersprachen.





Erklärung: Man kategorisiert in imperative, objektorientierte, funktionale und prädikative Programmiersprachen. Programme in prädikativen Programmiersprachen, bestehen aus Mengen von Fakten und Regeln. Ein Beispiel aus dieser Klasse von Programmiersprachen ist PROLOG.

Lösung zu Aufgabe 78 – PRO-AC





→ Aufgabe S. 89

1) Lexikalische Analyse (scanning): • Zerlegung des Programms in Tokens 2) Syntaktische Analyse (parsing): • Überprüfung der Korrektheit des Programms • Erzeugung des syntaktischen Ableitungsbaums entsprechend der zur Programmiersprache gehörenden kontextfreien Grammatik 3) Semantische Analyse und Codegenerierung: • Überprüfung semantischer Regeln (Typenverträglichkeit usw.) • Erzeugung des Assembler-/Maschinenprogramms aus dem Syntaxbaum 4) Codeoptimierung: • Laufzeitoptimierung • Speicherplatzoptimierung Lösung zu Aufgabe 79 – PRO-AD a)

• Lade Register indirekt mit 11 ⇒ 19. • Lade Register direkt mit 9 ⇒ 5. • Lade Register indiziert mit 1 ⇒ 4. • Lade Register unmittelbar mit 10 ⇒ 10.

→ Aufgabe S. 89

184

Lösungen

Lösung zu Aufgabe 79 – PRO-AD

→ Aufgabe S. 89

b) Relative Adressierung und implizite Adressierung fehlen noch. Lösung zu Aufgabe 80 – PRO-AE a)

→ Aufgabe S. 90

• Holen von Befehlen (FETCH): Der Befehlszähler PC (program counter) des Steuerwerks enthält die Adresse des aktuellen Befehls im Speicher. Dieser aktuelle Befehl wird anschließend adressiert und der Inhalt der adressierten Speicherzelle wird ins Instruktionsregister IR geladen. • Entschlüsseln von Befehlen (DECODE): Der Inhalt von IR wird analysiert und die Befehlsart wird erkannt. Der Befehl wird in den Operationsteil („Was soll gemacht werden?“ – Beispielsweise Addition, Subtraktion, . . . ) und den Operandenteil („Mit welchen Werten soll die Operation durchgeführt werden?“) zerlegt. • Initiieren der Befehlsausführung (EXECUTE): Die für die Befehlsausführung benötigten Funktionseinheiten werden mit den notwendigen Steuersignalen versorgt: ∗ Adressierung der beteiligten Operanden und Laden aus dem Speicher, ∗ Ausführung der Operation, ∗ Speichern des Ergebnisses und ∗ Hochzählen des Befehlszählers (PC).

Lösung zu Aufgabe 80 – PRO-AE b)

→ Aufgabe S. 90

• FETCH: Der Inhalt von Speicherzelle 347 (vom Befehlszähler PC adressiert) wird ins Instruktionsregister IR geladen. • DECODE: Das Steuerwerk erkennt, dass die Konstante 50 vom Inhalt der Speicherzelle 114 subtrahiert werden soll. • EXECUTE: Die Operanden werden geholt und der Befehl ausgeführt: ∗ der Inhalt von Speicherzelle 114 wird geholt, ∗ die Subtraktion wird durchgeführt (895 − 50), ∗ das Ergebnis (845) wird in Speicherzelle 114 geschrieben und ∗ der Befehlszähler PC wird auf den nächsten Wert 348 hochgezählt.

Lösungen

185 → Aufgabe S. 91

Lösung zu Aufgabe 81 – ASS-AF

Programm in Assemblersprache für f (mit # wird unmittelbare Adressierung gekennzeichnet):

LOOP

LOAD JUMPZERO LOAD STORE

R1 END #1 R3

JUMPZERO LOAD MULTIPLY ADD STORE

END R3 R3 R2 R2

// i2 im Akkumulator zwischenspeichern. // Bisher berechnete Summe dazu addieren... // ...und in R2 speichern.

LOAD ADD STORE

R3 #1 R3

// i um eins erhöhen.

LOAD SUB STORE

R1 #1 R1

// Schleifenzähler um eins verringern.

JUMP

LOOP

// Spezialfall n = 0 berücksichtigen. // 1 initial in R3 speichern. // Schleifenabbruch.

END

→ Aufgabe S. 91

Lösung zu Aufgabe 82 – ASS-AB Programm in Assemblersprache für f : LOAD SUB STORE LOAD ADD STORE LOAD MUL DIV ADD STORE

R1 R2 R6 R3 R4 R7 R4 R6 R7 R3 R5

186

Lösungen → Aufgabe S. 92

Lösung zu Aufgabe 83 – ASS-AD a) Die Funktion f (n) berechnet die n-te Fibonacci-Zahl: f (0) = 1, f (1) = 1; f (n) = f (n − 2) + f (n − 1), n > 1

→ Aufgabe S. 92

Lösung zu Aufgabe 83 – ASS-AD b) Programm in Assemblersprache:

LOOP

LOAD STORE LOAD JUMPZERO DIV STORE LOAD MODULO ADD STORE LOAD STORE JUMP

#0 R3 R1 END #10 R2 R1 #10 R3 R3 R2 R1 LOOP

END Lösung zu Aufgabe 84 – ASS-AA

→ Aufgabe S. 93

Es wird die Funktion f (a, b) = ab berechnet. Lösung zu Aufgabe 85 – ASS-AC

→ Aufgabe S. 93

a) R3 = 10 bzw. R3 = 15. Lösung zu Aufgabe 85 – ASS-AC b) f (n) =

n i=1

i=

n·(n+1) 2 ,n

→ Aufgabe S. 93

∈ N0 , wenn anfangs R1= n gilt.

Lösung zu Aufgabe 86 – ASS-AE  a) f (n) = ni=1 i = 1/2 · n · (n + 1)

→ Aufgabe S. 94

Lösungen

187 → Aufgabe S. 94

Lösung zu Aufgabe 86 – ASS-AE b) Wegen  f (n) = ni=1 i = 1/2 · n · (n + 1) und weil n · (n + 1) immer eine gerade Zahl ist: Store Add Multiply Divide Lösung zu Aufgabe 87 – BET-AD

R1 R1 R2 R2

#1 R1 #2

R2 R1 R2 R2 → Aufgabe S. 100

a) Definition Betriebssystem: Gesamtheit aller Systemprogramme einer Rechenanlage. Sie übernehmen anfallende Verwaltungs-, Steuerungs- und Dienstleistungsaufgaben für den Prozessor, den Speicher, die E/A-Geräte sowie die Programme und Daten. Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

b) Aspekte der Sicherheit, die ein Betriebssystem gewährleisten muss: • Vertraulichkeit: Das Betriebssystem muss Dienste bereitstellen, die es ermöglichen, den Zugriff auf Informationen auf spezifizierte Kommunikationspartner bzw. Benutzer einzuschränken (beispielsweise durch Verschlüsselung). • Zugriffsschutz: Das Betriebssystem muss gewährleisten, dass kein unberechtigter Zugriff auf Daten oder auf Dienste möglich ist. • Nachvollziehbarkeit: Das Betriebssystem muss gewährleisten, dass Zugriffe auf Daten oder Dienste nachvollziehbar sind (beispielsweise durch Logging). • Verfügbarkeit: Das Betriebssystem muss gewährleisten, dass auch beim Ausfall von Komponenten die vom Betriebssystem zu erbringenden Dienste für den Benutzer bereitstehen. • Zuverlässigkeit: Das Betriebssystem muss garantieren, dass die übernommenen Aufgaben korrekt entsprechend den spezifizierten Anforderungen erfüllt werden. Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

c) Typische Dienste von Betriebssystemen: • Prozessorverwaltung (Scheduling), • Hauptspeicherverwaltung, • Programmausführung (Laden der Befehle und Daten in den Hauptspeicher), • Zugriff auf E/A-Geräte (Umsetzung allgemeiner Lese-und Schreiboperationen in gerätespezifische Steuersignale), • Netzzugriff, • Zugriff auf Dateien,

188

Lösungen • Systemzugriff, • Buchführung (Systemlog), • usw.

Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

d) Ein Prozess ist der zeitliche Ablauf einer Folge von Aktionen eines Rechners, die zu einer identifizierbaren funktionellen Einheit zusammengefasst sind. Er wird durch das auszuführende Programm, die zu verwendenden Daten und den Ausführungskontext charakterisiert. Ein Vorteil und die Motivation der Aufteilung eines Auftrags in mehrere Prozesse ist, dass dadurch Aufträge zeitlich verzahnt ausgeführt werden können. Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

e) Zustände, die ein Prozess annehmen kann: • Initiiert: Der Prozess ist dem Betriebssystem bekannt und in den Zwischenspeicher abgelegt, aber noch nicht zur Bearbeitung zugelassen. • Bereit: Der Prozess besitzt mit Ausnahme des Prozessors alle zu seiner Bearbeitung notwendigen Betriebsmittel. • Aktiv: Der Prozess hat zusätzlich Prozessorzugriff und wird vom Prozessor ausgeführt (höchstens ein Prozess kann gleichzeitig in diesem Zustand sein, es sei denn, es gibt mehrere Prozessoren). • Blockiert: Der Prozess wartet auf den Eintritt eines bestimmten Ereignisses (beispielsweise Abschluss einer E/A-Operation oder Zuteilung eines Betriebsmittels). • Terminiert: Der Prozess hat seine Berechnungen beendet und die von ihm belegten Betriebsmittel freigegeben. Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

f) Nein, ein direkter Übergang von bereit nach blockiert ist nicht möglich. Der Prozess muss zunächst den Zustand aktiv erreichen, bevor er blockiert werden kann. Lösung zu Aufgabe 87 – BET-AD

→ Aufgabe S. 100

g) Mögliche Zustandsübergänge mit zuständiger Betriebssystemkomponente: • Initiiert → bereit: Auftragssteuerung (job scheduler), • Bereit → aktiv: Prozessorverwaltung (CPU scheduler), • Aktiv → bereit: Prozessorverwaltung (CPU scheduler), • Aktiv → blockiert: Betriebsmittelverwaltung, • Aktiv → terminiert: Betriebsmittelverwaltung, • Blockiert → bereit: Betriebsmittelverwaltung.

Lösungen

189

Initiiert

Bereit

Aktiv

Terminiert

Blockiert

Lösung zu Aufgabe 88 – BET-AB

→ Aufgabe S. 100

• Stapelbetrieb (batch mode): – Motivation: möglichst gute Nutzung der Komponenten eines Rechners. – Merkmale: ∗ Aufträge müssen vor Übergabe an die Rechenanlage inklusive aller Eingabedaten vollständig definiert sein. ∗ Ein Auftrag wird immer zusammenhängend übergeben (beispielsweise in Form einer Systemdatei). ∗ Kein modifizierendes Eingreifen während der Bearbeitung eines Auftrags möglich („off-line“-Ausführung). ∗ Keine Zeitanforderungen hinsichtlich der Beendigung der Aufträge möglich (aber eventuell hinsichtlich des Beginns). ∗ Maximierung des Durchsatzes ist Hauptzweck (Durchsatz = Anzahl der pro Zeiteinheit vollständig bearbeiteten Aufträge). – Typische Anwendungen: Heute nur noch rechen- und/oder datenintensive Programme ohne Interaktion mit dem Benutzer, beispielsweise statistische Auswertungen, technisch/wissenschaftliche Berechnungen usw. • Multiprogrammbetrieb (multiprogramming mode): – Merkmale: ∗ Mehrere Prozesse können gleichzeitig im Hauptspeicher resident sein. ∗ Bearbeitung der Prozesse zeitlich verzahnt (quasi-parallel oder nebenläufig). ∗ Hauptaufgaben sind die Zuteilung von Betriebsmitteln an Prozesse, die Aktivierung und Blockierung von Prozessen und die gegenseitige Isolation der Prozesse (zur Vermeidung unerwünschter gegenseitiger Beeinflussung beim Zugriff auf gemeinsam benutzte Betriebsmittel). ∗ Vorteil: bessere Ausnutzung der Betriebsmittel einer Rechenanlage.

190

Lösungen • Dialogbetrieb (time sharing mode): – Merkmale: ∗ Ein Auftrag wird erst im Verlauf einer Dialogsitzung interaktiv definiert (Reaktion auf Ergebnisse abgeschlossener Teilaufträge möglich). ∗ Man unterscheidet zwei Arten von Dialogbetrieb: · Teilhaberbetrieb: alle Benutzer verwenden dasselbe Programm. · Teilnehmerbetrieb: die Benutzer können der Rechenanlage unabhängig voneinander verschiedene Aufträge übergeben. ∗ Hauptaufgabe des Timesharing-Betriebssystems: ähnlich wie beim Multiprogrammbetrieb, jedoch schnellere Bedienung der Benutzer, also Minimierung der Antwortzeit (= Wartezeit des (Teil-) Auftrags auf Beginn/Fortsetzung seiner Bearbeitung plus Bearbeitungszeit durch Prozessor). – Typische Anwendungen: ∗ Großrechner mit vielen Terminals. ∗ Teilhaberbetrieb: Platzbuchungssystem eines Reisebüros, Programme für Schalterterminals einer Bank. ∗ Teilnehmerbetrieb: interaktive Programmentwicklung. • Echtzeitbetrieb (real-time mode): – Merkmale: im Prinzip wie Dialogbetrieb, jedoch zusätzlich: ∗ Einhaltung von Zeitrestriktionen, es kann also für die Bearbeitung eines Auftrags eine Höchstdauer vorgegeben werden. ∗ Zuteilung von Betriebsmitteln an Aufträge aufgrund ihrer Priorität (Maß für Dringlichkeit). ∗ Je nach Anwendung geeignete E/A-Geräte (Messfühler, Steuerungsventile, „Sensoren“, „Aktoren“ usw.) erforderlich (s. u.). ∗ Unterbrechungsmöglichkeit bei der Auftragsbearbeitung (weniger dringlicher Auftrag muss zugunsten eines dringenderen unterbrochen werden können). ∗ Hauptaufgabe ist eine garantierte größtmögliche und zeitgerechte Verfügbarkeit der Betriebsmittel einer Rechenanlage (also bei Anforderung soll das entsprechende Betriebsmittel sofort frei sein). – Typische Anwendungen: ∗ Mess- und Regelungsaufgaben bei technischen Prozessen, ∗ Kfz-Elektronik, ∗ Telekommunikation.

Lösungen

191

• Client/Server-Betrieb (verteilte Aufgaben): – Merkmale: ∗ Im Server werden zentrale Systemfunktionen bereitgestellt, beispielsweise: · Benutzerverwaltung, · Dateiverwaltung, · Datenbank-Management, · Mail-Server, · WWW-Server und · Druckersteuerung. ∗ Jeder Rechner („Client“) kann Funktionen des Servers durch „Remote Procedure Calls“ (RPC) aufrufen. ∗ Während der Ausführung eines RPCs kann der Client andere Aufgaben bearbeiten. ∗ Sind Rechner sowohl Clients als auch Server, so heißen sie auch Peers. – Typische Anwendung: Nutzung von Diensten über das Internet. Lösung zu Aufgabe 89 – BET-AC

→ Aufgabe S. 101

a) Arten der Synchronisation: • Prozesskooperation: Prozesse, die voneinander abhängig sind, kennen einander und koordinieren sich gegenseitig. • Wechselseitiger Ausschluss: Der Zugriff eines Prozesses, welcher von anderen abhängig ist, verhindert den Zugriff anderer Prozesse auf das Betriebsmittel. Der wechselseitige Ausschluss kann zu einem Deadlock führen. Es handelt sich dabei um eine gegenseitige Blockade voneinander abhängiger Prozesse. So könnte beispielsweise Prozess 1 auf Betriebsmittel 2 warten, während er Betriebsmittel 1 belegt, und Prozess 2 auf Betriebsmittel 1 warten, während er Betriebsmittel 2 belegt. Das ist ein zentrales Problem in Betriebssystemen. Lösung zu Aufgabe 89 – BET-AC

→ Aufgabe S. 101

b) Ursache falscher Ergebnisse ist, dass kritische Bereiche von Prozessen nicht beachtet werden. Der kritische Bereich ist eine Folge von Operationen, in denen ein Prozess nicht unterbrochen werden darf. Kritische Bereiche entstehen, wenn mehrere Prozesse um das gleiche Betriebsmittel konkurrieren. Solche Prozesse nennt man auch voneinander abhängig.

192

Lösungen → Aufgabe S. 101

Lösung zu Aufgabe 90 – BET-AA

Stapelbetrieb (batch mode), da einzelne Programmabläufe keine Interaktion benötigen, keine zeitlichen Beschränkungen gefordert sind und maximaler Durchsatz erwünscht ist. → Aufgabe S. 102

Lösung zu Aufgabe 91 – BET-AE Verfahren zur Zuteilung von Rechenzeit:

• Einfache Zuteilungsverfahren, beispielsweise „first-come, first-serve“ (FCFS). Das Prinzip ist, möglichst viel Prozessorleistung für Benutzerprozesse und möglichst wenig für Zuteilungsprozesse bereitzustellen. Bei FCFS erhält daher einfach der erste Prozess, der anfragt, als erster Rechenzeit: Warteschlange …

Prozess3

Prozess2

Prozess1

Prozessor

• Prioritätsgesteuerte Zuteilungsverfahren. – Beispiel eines einfachen prioritätsgesteuerten Zuteilungsverfahrens: weise jedem bereiten Prozess eine Priorität zu und aktiviere immer den Prozess mit der höchsten Priorität. – Beispiel eines komplizierteren prioritätsgesteuerten Zuteilungsverfahrens: teile die Menge der bereiten Prozesse in Klassen unterschiedlicher Priorität ein, beispielsweise: Betriebssystemprozesse

Hohe Priorität

InteraktiveProzesse

Übersetzungsprozesse

Editierprozesse

Batchprozesse

Niedrige Priorität

– Weitere Möglichkeiten der Prioritätszuweisung sind „shortest job first“ (erzielt sehr gute mittlere Wartezeiten), eine Kombination von Wartezeit und erwarteter Laufzeit usw.

Lösungen

193

• Zeitscheibenverfahren (auch „Round-Robin“). Die Menge der bereiten Prozesse wird zirkulär durchlaufen. Pro Durchlauf erhält jeder Prozess genau einmal höchstens die fest vorgegebene Prozessorzeit t und wird danach in der Ausführung bis zum nächsten Durchlauf unterbrochen. Benötigt ein Prozess nur die Zeit t < t, wird vorzeitig mit dem nächsten Prozess fortgefahren (vgl. P7 , P8 in der Abbildung). Das Verfahren wird auch preemptive Scheduling genannt, da ein Prozess vor seiner Fertigstellung unterbrochen werden kann, falls t > t. Im Gegensatz dazu, wird ein Verfahren, bei dem ein Prozess nie vor seiner Fertigstellung unterbrochen werden kann, nonpreemptive Scheduling genannt. (Vgl. auch Lösungen zu Aufgaben BET-AF und BET-AG.)

p

P9

P1

P8

t

P2

P7 P6

P3 P5

P4 → Aufgabe S. 102

Lösung zu Aufgabe 92 – BET-AG a) Prioritätsgesteuertes Zuteilungsverfahren: P5:66

P3:48

P2:17 P4:9

P1:33 147

0

25

50

66

75

100

114

125

164 173

150

175

t [ms]

→ Aufgabe S. 102

Lösung zu Aufgabe 92 – BET-AG b) Zeitscheibenverfahren:

P5

15

P4

15

15

15

6

9

P3

15

P2

15

P1

15

25

3

2

15

0

15

15

50

69

75

3

100 116 125

167 173 149

150

175

t [ms]

194

Lösungen → Aufgabe S. 102

Lösung zu Aufgabe 92 – BET-AG

c) Beim preemptive Scheduling kann ein Prozess vor der Fertigstellung unterbrochen und später wieder fortgesetzt werden. Beim nonpreemptive Scheduling kann ein Prozess dagegen nicht vorzeitig abgebrochen bzw. unterbrochen werden. (Vgl. auch Lösungen zu Aufgaben BET-AE und BET-AF.) Prioritätsgesteuerte Zuteilungsverfahren gehören zum nonpreemptive Scheduling, Zeitscheibenverfahren zum preemptive Scheduling. → Aufgabe S. 103

Lösung zu Aufgabe 93 – BET-AF

a) Allen Prozessen, die sich im Wartebereich befinden (also den Prozesszustand bereit einnehmen), wird eine maximale feste Zeitspanne („time-slice“) zugeordnet. Nach Ablauf der maximalen Zeitspanne (spätestens) wird dem Prozess der Prozessor entzogen und dem nächsten zugeteilt. Ein solches Verfahren wird auch als preemptive Scheduling bezeichnet, weil ein Prozess vor seiner Fertigstellung unterbrochen werden kann. (Vgl. auch Lösungen zu Aufgaben BET-AE und BET-AG.) → Aufgabe S. 103

Lösung zu Aufgabe 93 – BET-AF b) Ablauf der Abarbeitung der Prozesse:

P4

25

P3

25

22

P2

25

P1

7

13 97

0

14

25

40

50

63

75

89

100

122

125

t [ms]

Auf die vier Prozesse wird die Gesamtzeit von 100 ms verteilt, indem die „time-slice“ auf 25 ms gesetzt wird. Der erzeugte Overhead, also der Zeitverlust durch die Prozesswechsel, beträgt 5 ms, da es bei sechs Prozessabschnitten insgesamt fünf Kontextwechsel gibt. Lösung zu Aufgabe 94 – DAT-AF

→ Aufgabe S. 109

• Die PO legt fest, wie interne Datensätze auf dem Speichermedium abgelegt werden und wie sie wiedergefunden werden können. Die PO bestimmt also die Anordnung von Sätzen bei der physischen Speicherung (Erstabspeicherung). Man unterscheidet unter anderem sequentielle und gestreute POs. – Eine sequentielle PO ordnet zusammenhängende Folgen von Sätzen entweder unsortiert oder sortiert direkt hintereinander auf dem Speichermedium an. Im unsortierten Fall (auch „seriell“) wird der Primärschlüssel nicht beachtet, sondern beim Einfügen einfach der Eingabereihenfolge gefolgt. Im sortierten Fall wird die Reihenfolge durch einen Primärschlüssel definiert.

Lösungen

195 – Eine gestreute PO sucht nach geeigneten freien Speicherplätzen ohne auf eine physisch zusammenhängende Speicherung der Sätze zu achten. Hierzu kann beispielsweise eine Hash-Organisation, die den Speicherplatz mittels einer Funktion berechnet, oder eine Index-sequentielle Organisation, bei der der Speicherplatz mittels einer Tabelle bestimmt wird, verwendet werden.

• Die SO beeinflusst die physische Anordnung der Sätze nicht. Sie bietet eine „andere Sicht“ auf eine bereits bestehende solche Anordnung. Dies geschieht beispielsweise durch eine geeignete Datenstruktur (Zugriffspfad). Gegebenenfalls unterscheidet sie Sekundärschlüssel nach Schlüssel und Nichtschlüssel (Sekundärschlüssel müssen keine Schlüssel sein), um je nach Fall unterschiedliche Verfahren anzuwenden. Lösung zu Aufgabe 95 – DAT-AD a)

→ Aufgabe S. 109

• Aufwand für das Lesen und Schreiben eines Satzes (insbesondere sequentieller vs. wahlfreier Zugriff); • Aufwand für das Einfügen und Entfernen eines Satzes (inklusive Aufwand für Verwaltung der Dateiorganisation); • Speicherplatzausnutzung (inkl. Speicherplatz für Verwaltungsinformationen); • ...

Lösung zu Aufgabe 95 – DAT-AD b)

→ Aufgabe S. 109

• Die Speicherung der Daten auf externen Speichermedien, also auf großen, nichtflüchtigen Speichern mit Sicherungsmöglichkeiten (d. h. Sicherheitskopien) oder Übertragungsmöglichkeiten auf andere Datenverarbeitungsanlagen sollte möglich sein; • Jedes Datum sollte schnell verfügbar sein, auch wenn große Datenmengen vorhanden sind. • Der Änderungsdienst für das Hinzufügen, Ändern und Entfernen von Daten sollte schnell und zuverlässig sein; • Die Strukturierung zusammengehörender Daten zu einer Einheit, beispielsweise Kundendaten nach einzelnen Kunden oder gesamtem Kundenbestand, sollte möglich sein; • Wichtige Sicherheitsaspekte sollten erfüllt werden; dazu gehört die Verwaltung von Zugriffsrechten und das Führen eines Datei-Logbuchs; • ...

196

Lösungen → Aufgabe S. 109

Lösung zu Aufgabe 96 – DAT-AB

a) Bei den Formen der Primärorganisation (PO) von Dateien unterscheidet man die sequentielle Primärorganisation von der gestreuten PO. Bei der sequentiellen PO werden die Sätze physisch zusammenhängend (also sequentiell einer nach dem anderen) auf dem Speichermedium abgespeichert. Dies kann unsortiert (gemäß der Eingabe-Reihenfolge, ohne Beachtung des Primärschlüssels) oder sortiert (Reihenfolge durch Primärschlüssel gegeben) erfolgen. Bei der gestreuten PO ist die Folge der Sätze nicht notwendigerweise physisch zusammenhängend. Stattdessen wird nach einem passenden freien Speicherplatz im gesamten Speicherraum oder einem Teil davon gesucht. Die Hash-Organisation zählt zur Gruppe der gestreuten POs. Der Speicherort wird hierbei durch eine Funktion berechnet. Zu den gestreuten POs gehört auch die Index-sequentielle Organisation, bei der der Speicherplatz mittels einer Tabelle bestimmt wird. → Aufgabe S. 109

Lösung zu Aufgabe 96 – DAT-AB

b) Da bei einer Hash-Organisation die Erstabspeicherung der Sätze auf einem beliebigen freien Speicherplatz erfolgen kann (die Erstabspeicherung ist also nicht notwendigerweise sequentiell, sondern gestreut), muss, um dies effizient zu ermöglichen, ein direkter/wahlfreier Zugriff auf den Speicher gegeben sein. An eine Hash-Funktion h selbst werden die folgenden Anforderungen gestellt: • Die Funktion muss surjektiv sein, das bedeutet, dass sie den gesamten Adressraum des Datenspeicherraums der Datei abbildet. • Sie soll effizient berechenbar sein. • Alle h−1 (a) mit a ∈ AR(D) sollen etwa gleichmächtig sein. → Aufgabe S. 109

Lösung zu Aufgabe 96 – DAT-AB c)

• Zum Beispiel h : N → {0, 1, 2, 3, 4} : s → s mod k, k ≤ M = 5. • Für h(s) = s mod 5 ergeben sich folgende Tabellen: Schlüssel s h(s) RSN 0 1 2 3 4

46 1

29 4

98 3

60 0

Satz mit Schlüssel 60 46 162 98 29

In diesem Fall sind keine Kollisionen aufgetreten.

162 2

Lösungen

197

Lösung zu Aufgabe 97 – DAT-AE

Hash-Organisation Sequentielles Lesen Sequentielles Schreiben Wahlfreies Lesen

Wahlfreies Schreiben

Satz einfügen Satz entfernen Speicherplatznutzung

Sehr schlecht Sehr schlecht Im Mittel sehr gut (Zeit O(1)), im schlechtesten Fall sehr schlecht (Zeit O(N) bzw. O(M)) im Mittel sehr gut (Zeit O(1)), im schlechtesten Fall sehr schlecht (Zeit O(N) bzw. O(M)) Sehr gut (wenn Belegung gering) Sehr gut (logisches Entfernen) Weniger gut

→ Aufgabe S. 110

Index-sequentielle Organisation I. A. gut I. A. gut Schnell (falls keine langen Überlaufketten)

Schnell (falls keine langen Überlaufketten) Gut (u. U. Index aktualisieren) Schnell (falls keine langen Überlaufketten) Weniger gut

Logisches Entfernen bedeutet, dass Daten als gelöscht und überschreibbar markiert werden. N ist die Anzahl der Blöcke des verfügbaren Speicherraums, M die der relativen Satznummern (RSN). Lösung zu Aufgabe 98 – DAT-AC

→ Aufgabe S. 111

a) Eine Hash-Funktion ist eine effizient berechenbare, surjektive Abbildung; das bedeutet, dass der Bildbereich kleiner sein kann als der Wertebereich. Insbesondere hat das zur Folge, dass mehrere Eingabewerte auf denselben Funktionswert abgebildet werden können bzw. dass die Umkehrabbildung h−1 : B → A einer Hash-Funktion h : A → B einen Wert b ∈ B auf eine Menge von Werten A ⊂ A abbilden kann. In der Dateiorganisation werden Hash-Funktionen vor allem für die gestreute Organisation von Sätzen eingesetzt. Lösung zu Aufgabe 98 – DAT-AC

→ Aufgabe S. 111

b) h1 , da Hash-Funktionen immer so gewählt werden sollten, dass die Schlüssel möglichst gleichmäßig verteilt sind, dass also für alle b ∈ B die Menge f −1 (b) ungefähr gleich mächtig ist. Man kann sich überlegen, dass bei Hash-Funktionen, die über die ModuloFunktion berechnet werden, dafür Primzahlen als Divisor besonders gut geeignet sind.

198

Lösungen → Aufgabe S. 111

Lösung zu Aufgabe 99 – DAT-AA a) Speicherblock: RSN 0 1 2 3 4 5 6 7

Satz mit Schlüssel 64 70 6 83 19 99 62 7 → Aufgabe S. 111

Lösung zu Aufgabe 99 – DAT-AA

b) Statt M = 8 wähle man beispielsweise M = p für eine Primzahl p; die verbesserte Hash-Funktion ist dann weiterhin h(s) = s mod M mit dem neuen M. Auf diese Weise werden die Schlüssel gleichmäßiger verteilt. → Aufgabe S. 112

Lösung zu Aufgabe 100 – DAT-AG a) Die Hashwerte lauten wie folgt s h(s)

135 1

102 1

28 10

61 10

6 10

14 1

94 10 → Aufgabe S. 112

Lösung zu Aufgabe 100 – DAT-AG

b) Speicher bei Vermeidung von Kollisionen durch lineares Austesten: RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s 61 135 102 6 14 94

28

Datensatz ... ... ... ... ... ... ... ... ... ... ...

Lösungen

199 → Aufgabe S. 112

Lösung zu Aufgabe 100 – DAT-AG

c) Speicher bei Vermeidung von Kollisionen durch lineares Austesten: RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s 28 14 61 94 102 135

6

Datensatz ... ... ... ... ... ... ... ... ... ... ... → Aufgabe S. 112

Lösung zu Aufgabe 100 – DAT-AG d) Speicher nach separater Verkettung: RSN 0 1 2 3 4 5 6 7 8 9 10

Primärschlüssel s 135

28

Lösung zu Aufgabe 100 – DAT-AG

→ → → → → → → → → → →

102

61

→ → → → → → → → → → →

Verkettungen → 14 → → → → → → → → → 6 → 94

→ → → → → → → → → → →

→ → → → → → → → → → →

→ Aufgabe S. 112

e) Nein. Durch die lineare Funktion s · a + b können sich zwar für verschiedene Werte für a und b die Ergebnisse von h(s) verändern, eine der Eigenschaften der Modulo-Funktion ist jedoch, dass die Gruppierungen sich durch eine solche Funktion nicht weiter unterteilen lassen; es werden folglich weiterhin die gleichen Schlüssel kollidieren. Für bestimmte a und b fallen sogar bisher getrennte Mengen zu einer größeren Kollisionsmenge zusammen. Beispielsweise ergibt sich für a = 11, b = 0 stets das Ergebnis h(s) = 0.

200

Lösungen

Lösung zu Aufgabe 100 – DAT-AG

→ Aufgabe S. 112

f) Da sich die Ergebnisse von h(s) durch verschiedene Werte für a und b verändern können, kann es dazu kommen, dass die Kollisionen einer auf diese Art veränderten HashFunktion auf anderen RSN-Zeilen auftreten.

A

Mathematische Grundlagen

In diesem Anhang werden mathematische Grundlagen erläutert, die so allgemein sind, dass sie nicht einzelnen Kapiteln zugeordnet werden können. Es handelt sich dabei entweder um sehr allgemeine Themen wie Mengen, Funktionen oder Graphen oder um Themen, die in zwei oder mehr Kapiteln vorkommen und entweder keinem vorrangig zugeordnet werden können oder aus Gründen der einfacheren Nachschlagbarkeit hier untergebracht sind. Um das Auffinden der Definitionen einfacher zu gestalten, ist der Anhang in beiden Bänden des Aufgabenbuches „100 Übungsaufgaben zu Grundlagen der Informatik“ vollständig abgedruckt. Es wird allerdings auf eine Einführung der gängigen mathematischen Begriffe und Notationen aus Mengentheorie, Algebra usw. verzichtet und deren Kenntnis als vorhanden vorausgesetzt.

A.1

Mengen und Funktionen

Für Mengenrelationen, algebraische Operationen und Relationen, Terme und ähnlich gebräuchliche mathematische  Konstrukte werden die üblichen Notationen verwendet (beispielsweise ∈, ∪, ∩, +, −, ·, /, , , , ≥, . . .). Eine Menge kann explizit angegeben werden durch • die Auflistung ihrer Elemente, beispielsweise B = {true, f alse}, N = {1, 2, . . .} oder • eine Einschränkung der Elemente einer anderen Menge mithilfe einer Aussage über diese Elemente, beispielsweise PRI MES = {x ∈ N | x ist Primzahl} Darüber hinaus können Mengen durch Vereinigung, Schnittbildung, usw. aus anderen Mengen abgeleitet werden. Mengen können unter anderem endlich, abzählbar oder überabzählbar sein. Für eine endliche Menge Me ist die Anzahl ihrer Elemente endlich und wir bezeichnen mit |Me | die Anzahl der in Me enthaltenen Elemente. Für eine abzählbare Menge Ma gibt es eine injektive Abbildung von Ma in die natürlichen Zahlen; insbesondere ist eine endliche Menge also auch abzählbar. Für eine überabzählbare Menge existiert so eine Abbildung nicht. Für jede Menge M wird mit ℘(M) =de f {M  | M  ⊆ M} die Potenzmenge von M, also die Menge aller Teilmengen von M, angegeben. Die Potenzmenge einer endlichen Menge M hat 2|M| Elemente (daher auch die manchmal gebräuchliche alternative Notation ℘(M) = 2 M ), die Potenzmenge einer abzählbaren nichtendlichen Menge ist überabzählbar.

202

A Mathematische Grundlagen

Die folgenden speziellen Mengen werden in dieser Aufgabensammlung häufig verwendet: • Mengen der natürlichen (ohne 0), ganzen, rationalen und reellen Zahlen N, Z, Q und R; • Menge der natürlichen Zahlen mit 0, Mengen der positiven und negativen (jeweils ohne 0) ganzen, rationalen und reellen Zahlen N0 , Z+ , Z− , Q+ , Q− , R+ , R− ; • Boolesche Menge B = {true, f alse}, wobei wir true auch mit 1 und f alse auch mit 0 identifizieren. Eine Funktion f aus einer Urbildmenge M in eine Bildmenge N wird durch f : M → N : m → f (m) notiert, wobei m ∈ M und f (m) ∈ N gilt. Dabei kann f (m) auch durch einen Term angegeben werden. Falls eine Umkehrabbildung existiert (im Fall einer injektiven Funktion f ), wird diese bezeichnet als f −1 : N → M

A.2

Graphen

Ein Graph ist ein Tupel G = (V, E) aus einer Menge von Knoten („vertices“) V und einer Menge von Kanten („edges“) E. Wir betrachten nur Graphen ohne Mehrfachkanten; diese können gerichtet sein (in diesem Fall ist E ⊆ V × V) oder ungerichtet (in diesem Fall ist E Teilmenge aller zweielementigen Teilmengen von V). Die maximal mögliche Anzahl an Kanten ist in einem gerichteten Graphen |V|2 und in einem ungerichteten |V|2 /2. Graphen werden dargestellt, indem jeder Knoten als Kreis gezeichnet wird; in einem ungerichteten Graphen wird jede Kante e = {v1 , v2 } ∈ E als Linie zwischen den Knoten v1 und v2 gezeichnet; in gerichteten Graphen wird für jede Kante e = (v1 , v2 ) ∈ E die entsprechende Linie als Pfeil von v1 nach v2 gezeichnet. Die Kante e heißt in diesem Fall von v1 ausgehend und in v2 eingehend. Im ungerichteten Fall ist der Grad eines Knotens die Anzahl der anliegenden Kanten. Im gerichteten Fall unterscheiden wir für jeden Knoten einen Ausgangsgrad und einen Eingangsgrad anhand der Anzahl der ausgehenden und eingehenden Kanten. Sowohl die Knoten als auch die Kanten eines Graphen können beschriftet werden. Eine Teilmenge der gerichteten bzw. ungerichteten Graphen stellen gerichtete bzw. ungerichtete Bäume dar. Im ungerichteten Fall ist ein Baum definiert als ein zusammenhängender kreisfreier Graph. Die Knoten mit Grad 1 heißen Blätter, alle anderen Knoten heißen innere Knoten. Wenn ein beliebiger Knoten eines ungerichteten Baums als Wurzel ausgezeichnet wird, erhält man einen gerichteten Baum, indem man alle Kanten von der Wurzel zu den Blättern ausrichtet. Anders ausgedrückt ist ein gerichteter Baum ein gerichteter kreisfreier Graph mit genau einer Wurzel, wobei eine Wurzel als Knoten mit Eingangsgrad 0 definiert ist. Knoten mit Ausgangsgrad 0 heißen hier Blätter. In einem gerichteten Baum werden für einen Knoten v ∈ V alle Knoten v ∈ V Kindknoten genannt, zu denen eine Kante (v, v ) ∈ E existiert, während v Vaterknoten für all diese v heißt. Ein gerichteter Baum heißt Binärbaum, wenn jeder seiner Knoten höchstens 2 Kindknoten hat.

A.3 Alphabete, Zeichen, Wörter und Sprachen

A.3

203

Alphabete, Zeichen, Wörter und Sprachen

Eine nichtleere endliche Menge E wird als Alphabet bezeichnet. Die Elemente eines Alphabets heißen Zeichen oder Symbole, die durch Hintereinanderschreibung zu Wörtern werden. Ein Wort ist also ein Tupel (e1 , e2 , . . .), wobei e1 , e2 , . . . ∈ E. Ein Spezialfall ist das leere Wort λ, das keine Zeichen enthält bzw. durch die null-fache Hintereinanderschreibung der Zeichen aus E entsteht. Formal sind Wörter Tupel aus Zeichen, wir verzichten aber auf das Schreiben von Klammern und Kommas und schreiben die Zeichen direkt hintereinander. Die Menge aller Wörter, die über einem Alphabet E gebildet werden können (inklusive dem leeren Wort λ) wird durch E  bezeichnet. Beispielsweise gilt: E = {0, 1} ⇒ E  = {λ, 0, 1, 00, 01, 10, 11, . . .} Eine (formale) Sprache ist eine beliebige Menge von Wörtern, also eine Teilmenge der Menge E  für ein gegebenes Alphabet E. Die Menge aller Sprachen über einem Alphabet E ergibt sich somit zu ℘(E  ). Wir benutzen neben der Schreibweise E  für Wörter beliebiger Länge über dem Alphabet E auch noch die Bezeichnung E n ⊂ E  für die Menge aller Wörter der Länge n über E. Darüber hinaus wird die Bezeichnung E + =de f E  \{λ} für die Menge aller nichtleeren Wörter über E verwendet. Für eine Sprache L ⊆ E  bezeichnen wir deren Komplementsprache mit L =de f E  \L Für ein Alphabet E und ein Wort w ∈ E  bezeichnet |w| die Anzahl der in w vorkommenden Zeichen. Formal: ⎧ ⎪ ⎪ falls w = λ ⎨0, |w| =de f ⎪ ⎪ ⎩|v| + 1, falls w = va, v ∈ E  , a ∈ E Für ein Alphabet E, ein Wort w ∈ E  und ein Zeichen a ∈ E bezeichnet |w|a die Anzahl der in w vorkommenden a’s. Formal:

|w|a =de f

⎧ ⎪ 0, ⎪ ⎪ ⎪ ⎨ |v|a + 1, ⎪ ⎪ ⎪ ⎪ ⎩|v| , a

falls w = λ falls w = va, v ∈ E  falls w = vb, v ∈ E  , a  b ∈ E

Für ein Alphabet E und ein Wort w ∈ E  bezeichnen wir durch w die „Rückwärtsschreibung“ von w: ⎧ ⎪ ⎪ falls |w| ≤ 1 ⎨w,  w =de f ⎪ ⎪ ⎩av , falls w = va, v ∈ E  , a ∈ E Gilt w = w , heißt w Palindrom. Als Wortproblem einer Sprache bezeichnen wir das algorithmische Problem, zu einem beliebigen gegebenen Wort festzustellen, ob es zu der Sprache gehört oder nicht.

204

A Mathematische Grundlagen

A.4

Landau-Notation

Die Landau-Notation wird verwendet, um das asymptotische Verhalten von Funktionen und Folgen zu beschreiben. Die Landau-Symbole werden auf Funktionen f angewendet und bezeichnen jeweils eine Menge von Funktionen, die eine bestimmte Eigenschaft in Relation zu f haben. Wir nutzen die folgenden Symbole mit der im Anschluss definierten Bedeutung (wobei f, g : N → R):   f (x)  =0 f ∈ o(g) ⇔de f lim  x→∞ g(x)    f (x)   < ∞ ⇔ ∃c, x0 > 0 ∀x > x0 : | f (x)| ≤ c · |g(x)| f ∈ O(g) ⇔de f lim sup  g(x)  x→∞     f (x)  f (x)        < ∞ ⇔ f ∈ O(g) ∧ g ∈ O( f ) f ∈ Θ(g) ⇔de f 0 < lim inf  ≤ lim sup  x→∞ g(x)  g(x)  x→∞   f (x)   ≤ ∞ ⇔ ∃c, x0 > 0 ∀x > x0 : | f (x)| ≥ c · |g(x)| ⇔ g ∈ O( f ) f ∈ Ω(g) ⇔de f 0 < lim inf  x→∞ g(x)    f (x)   = ∞ ⇔ g ∈ o( f ) f ∈ ω(g) ⇔de f lim  x→∞ g(x)  Die wichtigsten Landau-Symbole sind • O( f ): Funktionen, die asymptotisch höchstens so schnell wachsen wie f , • Ω( f ): Funktionen, die asymptotisch mindestens so schnell wachsen wie f und • Θ( f ): Funktionen, die asymptotisch mit f wachsen. Für diese sind oben neben den Definitionen über den Limes auch die äquivalenten, vielleicht etwas greifbareren Definitionen über Quantoren angegeben. So ist eine Funktion f ∈ O(g), wenn für alle x über einer bestimmten Größe x0 der Wert f (x) höchstens um einen konstanten Faktor c größer (im Wesentlichen also kleiner oder gleich) ist als g(x). Aus den Definitionen ergeben sich direkt die folgenden Beziehungen: Θ( f ) = O( f ) ∩ Ω( f ) und damit Θ( f ) ⊆ O( f ) und Θ( f ) ⊆ Ω( f )

A.5

Boolesche Algebren

Eine Boolesche Algebra ist eine algebraische Struktur (M; ·, +,  ), also eine Menge M versehen mit den Verknüpfungen +, ·,  auf dieser Menge (vgl. auch algebraische Strukturen wie Gruppen, Ringe oder Körper sowie die verwandten Begriffe der Booleschen Räume und Booleschen Verbände). Dabei gilt |M| ≥ 2, und die Verknüpfungen sind definiert als · : M × M → M : (a, b) → a · b (Boolesches Produkt), + : M × M → M : (a, b) → a + b (Boolesche Summe), 

: M → M : a → a (Boolesches Komplement),

A.5 Boolesche Algebren

205

wobei die Huntingtonschen Axiome gelten: BA1: „·“ und „+“ sind kommutativ: a · b = b · a, a + b = b + a; BA2: „·“ und „+“ sind wechselseitig distributiv: a·(b+c) = a·b+a·c, a+(b·c) = (a+b)·(a+c); BA3: es gibt neutrale Elemente 0 und 1: a · 1 = a, a + 0 = a; BA4: a ist komplementär zu a in der folgenden Weise: a · a = 0. Aus diesen Axiomen ergibt sich eine Vielzahl weiterer Gesetze, zu denen insbesondere das De-Morgansche Gesetz ∀a, b ∈ M : (a · b) = a + b , (a + b) = a · b und das Assoziativgesetz ∀a, b, c ∈ M : a · (b · c) = (a · b) · c, a + (b + c) = (a + b) + c zählen. Wir nutzen in dieser Aufgabensammlung die einfachste Boolesche Algebra mit der zweielementigen Menge M = B. Typische Beispiele für Boolesche Algebren sind die Aussagenlogik mit den Verknüpfungen ∨, ∧, ¬, die Mengenalgebra mit den Verknüpfungen ∪, ∩, x und die Schaltalgebra mit den Verknüpfungen ∨, ∧, x, die in Band 2, Kapitel 1 definiert wird. Als (n-stellige) Boolesche Funktionen werden Funktionen der Form Bn → B bezeichnet. Zu jeder Booleschen Funktion lässt sich ein Boolescher Ausdruck (oder Boolescher Term) angeben. Umgekehrt definiert jeder Boolesche Ausdruck mit n verschiedenen Variablen genau eine n-stellige Boolesche Funktion. Dabei sind Boolesche Ausdrücke wie folgt definiert: Seien V = {a1 , . . . , an } eine Menge Boolescher Variablen, S = {0, 1, ·, +, , (, )} eine Menge von Symbolen und V ∩ S = ∅. • Jedes Symbol 0 und 1 (Konstanten) und jede Variable a ∈ V ist ein Boolescher Ausdruck. • Sind A und B Boolesche Ausdrücke, so auch A , (A · B) und (A + B). • Nur Zeichenreihen, die sich mit den obigen beiden Regeln in endlich vielen Schritten konstruieren lassen, sowie deren „Abkürzungen“ gemäß den Vorrangregeln (Klammer vor  vor · vor +) sind Boolesche Ausdrücke. Beispielsweise ist (a · b) + c ein (abgekürzter) Boolescher Ausdruck über den Variablen a, b und c. Die Auswertung („Semantik“) eines Booleschen Ausdrucks ergibt sich aus den oben angegebenen Gesetzen der Booleschen Algebren.

206

A Mathematische Grundlagen

A.6

Kodierung

Für zwei Alphabete A, B heißt eine Abbildung c : A → B Kodierung von A. Der Bildbereich c(A) =de f {c(a) | a ∈ A} heißt Code und jedes Element b ∈ c(A) heißt Codewort. Die natürliche Fortsetzung der Kodierung c ist definiert durch ⎧ ⎪ ⎪ falls w = λ ⎨λ, c : A → B : w → ⎪ ⎪ ⎩c (w )c(a) falls w = w a, w ∈ A , a ∈ A 





Insbesondere gilt c (a) = c(a) für alle a ∈ A. Wir unterscheiden die folgenden Klassen von Kodierungen: • c : A → B heißt Chiffrierung, c(A) heißt Chiffre; • c : A → Bn , n ∈ N heißt Blockkodierung; • c : A → B heißt Binärkodierung; • c : A → Bn , n ∈ N heißt n-Bit-Kodierung. Wenn die Kodierung c injektiv ist, existiert eine Umkehrabbildung c−1 : c(A) → A; diese wird Dekodierung von c(A) genannt. Die Kodierung c erfüllt die Fano-Bedingung genau dann, wenn kein Codewort Anfang eines anderen Codewortes ist, also wenn ∀u, w ∈ c(A) ∀v ∈ B : (w = uv ⇒ v = λ) Es gilt stets c injektiv ⇒ c injektiv c injektiv und c erfüllt die Fano-Bedingung ⇒ c injektiv

A.7

Zahlendarstellung

Wenn Zahlen in diesem Buch vorkommen, wird die Darstellungsart normalerweise aus dem Kontext erschlossen. So wird eine Zeichenkette, die aus den Ziffern 0, . . . , 9 besteht, als Zahl in Dezimaldarstellung interpretiert. Wenn eine Zeichenkette w ∈ E  für ein Alphabet E explizit als Zahl in einer bestimmten Darstellungsart D interpretiert werden soll, wird die Zeichenkette eingeklammert und die Darstellungsart als Index im Anschluss an die Zahl geschrieben als (w)D . Man kann beispielsweise schreiben: (10)2 = (2)10 Wenn die Interpretation eindeutig ist, kann die Klammer auch weggelassen werden.

A.8 Maßeinheiten für die Größe von Daten

207

Jeder Index D bezeichnet also eine Dekodierung D : E → R Insbesondere sind also eigentlich nur Zeichen aus E in der Klammer zulässig, wenn die Interpretation eindeutig ist, wird aber auch die Berechnung eines Terms in der Klammer zugelassen. In diesem Fall wird die Funktion auf die Zeichenkette angewendet, die sich aus der Berechnung des Terms ergibt, beispielsweise (12 + 24)10 = (36)10 = 36 Für D sind folgende Funktionen zulässig: • 1, 2, . . . , 8, . . . , 10, . . . , 16, . . .: unäre, duale, . . . , oktale, . . . , dezimale, . . . , hexadezimale, . . . , allgemein D-adische Darstellung mit E = {0, . . . , D − 1}; Ausnahme: D = 1 ⇒ E = {1}. Dabei ist für ein Wort w = en−1 en−2 . . . e0 ∈ E  der Wert wD definiert als wD =de f

n−1 

e i Di

i=0

• Exzess-q: Um q gegenüber der Dualdarstellung „verschobene“ Darstellung mit E = {0, 1}, also wExzess-q =de f w2 − q. • 1K: Einskomplement-Darstellung mit E = {0, 1}, siehe Band 2, Kapitel 5. • 2K: Zweikomplement-Darstellung mit E = {0, 1}, siehe Band 2, Kapitel 5. • FPZ: Festpunkt-Darstellung mit E = {0, 1}, siehe Band 2, Kapitel 5. • GPZ: Gleitpunkt-Darstellung mit E = {0, 1}, siehe Band 2, Kapitel 5. • IEEE-754: IEEE-Gleitpunkt-Darstellung, einfache Genauigkeit (mit E = {0, 1}), siehe Band 2, Kapitel 5. • BCD: Binary Coded Decimal mit E = {0000, 0001, . . . , 1001}, siehe Band 2, Kapitel 5. • Aiken: Aiken-Darstellung mit E = {0000, . . . , 0100, 1011, . . . 1111}, siehe Band 2, Kapitel 5. • 2-aus-5: 2-aus-5-Darstellung mit E ⊂ {0, 1}5 , siehe Band 2, Kapitel 5. Durch Anhängen von „ , n“ an den Index kann die Beschränkung auf n Bits gekennzeichnet werden. Besonders wichtig über alle Aufgaben dieses Aufgabenbuchs hinweg ist neben der Dezimaldarstellung die Dualdarstellung.

A.8

Maßeinheiten für die Größe von Daten

Da Computer auf Hardwareebene mit binären Werten arbeiten, ist die kleinste relevante Dateneinheit das Bit, welches entweder eine 0 oder eine 1 darstellt. Der Wert eines Bits kann in einem

208

A Mathematische Grundlagen

Flipflop gespeichert werden (vgl. Band 2, Kapitel 1). 8 Bits werden zu einem Byte zusammengefasst und mehrere Bytes werden auch Wort genannt (meist zwei oder vier Bytes, der Begriff ist aber nicht eindeutig definiert). Für größere Datenmengen sind die folgenden Maßeinheiten gebräuchlich: • Kibibyte (KiB): 1 KiB = 210 = 1.024 ≈ 103 Bytes = 1 Kilobyte • Mebibyte (MiB): 1 MiB = 220 = 1.048.576 ≈ 106 Bytes = 1 Megabyte • Gebibyte (GiB): 1 GiB = 230 = 1.073.741.824 ≈ 109 Bytes = 1 Gigabyte • Tebibyte (TiB): 1 TiB = 240 = 1.099.511.627.776 ≈ 1012 Bytes = 1 Terabyte ?

• Pebibyte (PiB): 1 PiB = 250 = 1.125.899.906.842.624 ≈ 1015 Bytes = 1 Petabyte • ... Für die fettgedruckten Einheiten werden umgangssprachlich oft auch alternativ die Begriffe Kilobyte (kB), Megabyte (MB), Gigabyte (GB), Terabyte (TB) und Petabyte (PB) genutzt, die jedoch strenggenommen die Zehnerpotenzen 103 , 106 , . . . bezeichnen und somit nicht genau den über Zweierpotenzen definierten Werten 210 , 220 , . . . entsprechen. Um präzise Aussagen über Speichervolumina zu machen, sollte man diesen Unterschied genau kennen (zumal sich jeweils die beiden alternativen Begriffe in ihrer Bedeutung mit zunehmender Größe relativ immer weiter voneinander entfernen; ob 1 PiB noch als „ungefähr gleich“ zu 1 PB gilt, bei einer Abweichung von etwa 12,6%, ist je nach Kontext schon zweifelhaft).

Literaturverzeichnis [Esc93]

B. Eschermann. Funktionaler Entwurf Digitaler Schaltungen: Methoden und CAD-Techniken. Springer-Verlag, 1993.

[Fly72]

M. Flynn. „Some Computer Organizations and Their Effectiveness“. In: IEEE Transactions on Computers C-21 (1972), S. 948–960.

[GW05]

D. Goldin und P. Wegner. „The Church-Turing Thesis: Breaking the Myth“. In: New Computational Paradigms. Springer, 2005, S. 152–168.

[HMU11]

J. E. Hopcroft, R. Motwani und J. D. Ullman. Einführung in Automatentheorie, Formale Sprachen und Berechenbarkeit. Addison-Wesley, 2011.

[Jaf78]

J. Jaffe. „A necessary and sufficient pumping lemma for regular languages“. In: SIGACT News 10 (1978), S. 48–49.

[Jun+12]

J. Jung u. a. „Walking intent detection algorithm for paraplegic patients using a robotic exoskeleton walking assistant with crutches“. In: International Journal of Control, Automation and Systems 10 (2012), S. 954–962.

[KMS09]

L. König, S. Mostaghim und H. Schmeck. „Decentralized Evolution of Robotic Behavior using Finite State Machines“. In: International Journal of Intelligent Computing and Cybernetics 2 (2009), S. 695–723.

[Pfe+12]

F. Pfeiffer u. a. „An Interactive Pool of Exercises for Individual Learning Support in Academic Courses“. In: Proceedings of the 2012 World Conference on Educational Media and Technology (EdMedia2012). AACE, 2012, S. 442–452.

[Ric73]

C. L. Richards. „An easy way to design complex program controllers“. In: Electronics 1 (1973), S. 107–113.

[Sch08]

U. Schöning. Theoretische Informatik – kurz gefasst. Spektrum, 2008.

[Tan07]

A. S. Tanenbaum. Modern Operating Systems. Prentice Hall, 2007.

[Tur36]

A. M. Turing. „On computable numbers, with an application to the Entscheidungsproblem“. In: Proceedings of the London mathematical society 42.2 (1936), S. 230–265.

[Weg05]

I. Wegener. Theoretische Informatik – eine algorithmenorientierte Einführung. Teubner Verlag, 2005.

[Wob01]

R. Wobst. Abenteuer Kryptologie – Methoden, Risiken und Nutzen der Datenverschüsselung. Addison-Wesley, 2001.