1. Organisation und Überblick
Informatik II
Vorlesung: 4 Semesterwochenstunden
Informatik II
SS 2005
Übung zur Vorlesung: 2 Semesterwochenstunden
Kapitel 1: Organisation und Überblick
Dienstag, 14:15-15:45 Uhr, MN67 Freitag, 14:15-15:45 Uhr, MN67
Dienstag, 16:00-17:30 Uhr, MN67
Theoretische/praktische Tutorenstunden:
2 Semesterwochenstunden Raum/Zeit je nach Gruppe
Dr. Michael Ebner Dipl.-Inf. René Soltwisch Lehrstuhl für Telematik Institut für Informatik Universität Göttingen - Informatik II - SS 2005
1. Organisation und Überblick
1. Organisation und Überblick
Verantwortliche Personen
Webseiten
Dr. Michael Ebner (Vorlesung)
Vorlesungsseite: http://user.informatik.uni-goettingen.de/~info2/SS2005/
Univis: http://univis.uni-goettingen.de (Vorlesungsverzeichnis Æ Interdisziplinäre Wissenschaftliche Zentren Æ ZFI Æ Pflichtblöcke Æ Informatik)
Bachelor/Master Studiengang Informatik: http://www.informatik.uni-goettingen.de/studies
Email:
[email protected] Telefon: (05 51) 39-1 44 09
Dipl.-Inf. René Soltwisch Email:
[email protected] Telefon: (05 51) 39-1 44 13
Dipl.-Inform. Andre Siebeck (Übung/Tutorien) Email:
[email protected] Telefon: (05 51) 39-1 35 80
1.2
Gemeinsame email Adressen:
[email protected]: Ebner, Soltwisch, Siebeck v_info2_1@, ..., v_info2_7@: Jeweiliger Tutor v_info2_all@: Dozenten und Tutoren
Universität Göttingen - Informatik II - SS 2005
1.3
Universität Göttingen - Informatik II - SS 2005
1.4
1. Organisation und Überblick
1. Organisation und Überblick
Tutorien
Übungszettel I
Einteilung über verteilte Tutorenliste Gruppenwechsel sind in eigener Regie vorzunehmen und sind mit den jeweiligen Tutoren abzustimmen Wechsel zwischen theoretischer und praktischer Tutorenstunde entscheidet Tutor bzw. Gruppe Konto im Informatik CIP-Pool ist notwendig (nicht Numerik-Pool!)
Termine
Ausgabe: Vor der Übung am Dienstag
Erste Ausgabe am 12. April
Rückgabe:
Dienstag, bis 14:15 Uhr, Info II Kästen in der NAM elektronische Abgabe nur bei Programmen
CIP = Computer-Investitions-Programm des BMBF
Voraussichtlich 11 Übungszettel á 100 Punkte
max. zwei Studierende können einen Übungszettel gemeinsam abgeben (Gemeinsame Abgabe ist sogar erwünscht!)
50% der Gesamtpunktzahl sind zum Bestehen der Übungszettel hinreichend
Montag 14-16Uhr und 16-18Uhr
Mittwoch 11-13Uhr, 16-18Uhr und 18-20Uhr
Donnerstag 9-11Uhr
Freitag 16-18Uhr
Tutorien beginnen ab dem 18. April Die Einteilung wird am Freitag, den 15. April bekannt gegeben
Universität Göttingen - Informatik II - SS 2005
1.5
Universität Göttingen - Informatik II - SS 2005
1. Organisation und Überblick
1. Organisation und Überblick
Übungszettel II
Klausur
Sollten wir anhand der gemachten Fehler erkennen, dass
Schriftliche Klausur über gesamten Stoff der Vorlesung
Übungszettel abgeschrieben worden sind, erkennen wir diese nicht
an. Korrekt abgeschriebene Lösungen helfen Ihnen nicht, Ihr
Wissen zu überprüfen und zu intensivieren und helfen uns nicht
missverständliche Vorlesungsinhalte zu erkennen und ggf. zu
MUNOPAG/WOPAG für BScInf, WiInf, WiPäd, etc. Ansonsten erfolgt die Anmeldung über eine Liste im Sekretariat des Lehrstuhls für Telematik
Leistungszertifikate und Scheine können nur über das Bestehen der Klausur erstanden werden
1.7
Dauer: 120 Minuten Termin: Montag, 25. Juli, 9:00 - 11:00Uhr Ort: ZHG 011 Kreditpunkte: 9 ECTS
Anmeldung
verbessern bzw. zu wiederholen.
Universität Göttingen - Informatik II - SS 2005
1.6
Für Nebenfächler werden wahlweise benotete und unbenotete Scheine ausgestellt
Universität Göttingen - Informatik II - SS 2005
1.8
1. Organisation und Überblick
1. Organisation und Überblick
Literatur I
Literatur II
Douglas E. Comer: “Essentials of Computer Architecture”, Prentice Hall International, ISBN: 0-13-196426-7, 2004, http://www.eca.cs.purdue.edu W. Stallings: „Betriebssysteme - Prinzipien und Umsetzung“, Prentice Hall, 2003, ISBN 3-8273-7030-2 Hopcroft, Motwani, Ullman: „Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie“, Pearson Studium 2002, ISBN 3827370205 Uwe Schöning: „Theoretische Informatik kurzgefaßt“, 2001, ISBN 3827410991 Uwe Schöning: „Logik für Informatiker“, Spektrum Akademie Verlag Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: „Compilerbau.“Oldenbourg Verlag 1999, Teil 1: ISBN 3-486-25294-1, Teil 2: ISBN 3-486-25266-6 G. Krüger & D. Reschke: „Lehr- und Übungsbuch Telematik --- Netze – Dienste – Protokolle“, Fachbuchverlag Leipzig (Carl-Hanser), 2. Auflage, ISBN 3-446-22073-9, 2002
Universität Göttingen - Informatik II - SS 2005
1.9
1. Organisation und Überblick
Überblick
Rechenberg & Pomberger: „Informatik-Handbuch“, Hanser Verlag, ISBN 3446-21842-4
Wikipedia: http://de.wikipedia.org
Wikibooks: http://www.wikibooks.de
Weitere Literaturangaben sind auf der Webseite zur Vorlesung zu finden oder werden im Laufe der Vorlesung bekannt gegeben
Die Folien zur Vorlesung werden auf der Webseite zur Vorlesung veröffentlicht
VORSICHT: Nicht alle Inhalte der Vorlesung sind auf den Folien berücksichtigt!
Der Tafelanschrieb ist daher auch zu berücksichtigen!!!
Fehler auf den Folien bitte per email melden (Nobody is perfect!)
Universität Göttingen - Informatik II - SS 2005
1.10
1. Organisation und Überblick
Detaillierter Überblick I
Compilerbau (Kapitel 7) Automaten und Sprachen (Kapitel 6)
1. Einführung
Betriebssysteme (Kapitel 5)
Vorstellung der beteiligten Personen Ablauf der Übungen Inhalt der Vorlesung
2. Zahlen und Logik
Maschinenorientierte Programmierung (Kapitel 4)
von-Neumann-Rechner (Kapitel 3)
3. Von-Neumann-Rechner
Speicher Zahlen und Logik (Kapitel 2)
Kommunikation (Kapitel 8)
Logische Schaltnetze und Schaltwerke Rechnermodelle
4. Grundlagen der maschinenorientierten Programmierung
von-Neumann-Rechner Universität Göttingen - Informatik II - SS 2005
Informationsdarstellung Zahlensysteme Rechnerarithmetik Aussagenlogik und logische Gatter Prädikatenlogik
1.11
Assemblerprogrammierung
Universität Göttingen - Informatik II - SS 2005
1.12
1. Organisation und Überblick
1. Organisation und Überblick
Detaillierter Überblick II
Motivation: Wie funktioniert ein Computer??? Anwendungen (Browser, Email, etc.)
5. Grundlagen von Betriebssystemen
Prozesse und Threads Interprozesskommunikation
Automaten Betriebssystem & Formale (Linux, Compiler Sprachen Windows, Assembler MacOS, ...) Software
6. Automaten und formale Sprachen
Chomsky-Hierarchie Reguläre Sprachen und endliche Automaten Kontextfreie Sprachen und Kellerautomaten
Befehlsarchitektur Hardware
Prozessor Speicher
7. Compilerbau
Digitale Logik Schaltkreisdesign Transistoren, Layout integrierte Schaltungen
Grundlagen Rechnernetze Grundlegende Protokollmechanismen Lokale Netze und Internet
1.13
Wo und wie Daten abgelegt werden macht einen großen Unterschied. Schon das Umordnen von Statements kann hilfreich sein.
Jeder Rechner hat 5 klassische Komponenten Compiler können optimierten Code für einen Prozessor erzeugen Betriebssysteme verwalten Ressourcen Gutes Eingabe/Ausgabe Verhalten ist für Datenbanken und Netzwerke wichtig Verwaltung der eigenen Daten/Code im Speicher
Universität Göttingen - Informatik II - SS 2005
1.15
Grundlegende Hardwarekomponenten: Datenpfad, Speicher, Eingabe/Ausgabe Geräte und Kontrolle; sowie die darunterliegende digitale Schaltungen/Logik Prinzipien von Software: Betriebssysteme, Kommunikationssysteme, Compiler; Automaten und formale Sprachen
Prinzipien der Abstraktion sind wichtig zum Verstehen und Bauen von geschichteten Systemen
Softwareentwicklung erfordert oftmals wissen über Rechnersysteme
Informatik II studiert die Funktionsweise von Rechnern
Was passiert beim Übersetzen des Quellcodes? Warum ist Rechnerarithmetik manchmal falsch? Was ist ein Busfehler oder Speicherzugriffsfehler?
Wie kann schneller ausführbarer Code erstellt werden?
Zusammenfassung
Das Wissen über die Rechnerarchitektur hilft das Design von Programmiersprachen zu verstehen
1.14
1. Organisation und Überblick
Architektur und Programmierung
Verberge unnötige Implementierungsdetails Hilft zur Beherrschung realer, komplexer Systeme
Universität Göttingen - Informatik II - SS 2005
1. Organisation und Überblick
Informatik II
Grundidee: Ebenen der Abstraktion
Universität Göttingen - Informatik II - SS 2005
E/A System
Datenpfade & Kontrolle
Aufbau und Funktionsweise von Compilern Lexer und Parser Konzepte von Programmiersprachen
8. Grundlagen von verteilten Systemen
Netzwerke (TCP/IP, Ethernet, WLAN, ...
Datenrepräsentation ist wichtig für die Leistung des Systems, Verwendung von Ressourcen und besseren Genauigkeit. Abstraktion und hierarchisches Design sind fundamentale Konzepte zur Handhabung von Komplexität Rohe Daten (Bitmuster) können alles bedeuten (integer, float, char, etc.). Erst ein Programm legt die Bedeutung fest
Wissen über Rechnersysteme hilft beim Programmieren und beim Software-Engineering
Universität Göttingen - Informatik II - SS 2005
1.16
2. Zahlen und Logik
Überblick Zahlen Informationsdarstellung Zahlensysteme Rechnerarithmetik
Informatik II
Logik
SS 2005
Aussagenlogik und logische Gatter Prädikatenlogik
Kapitel 2: Zahlen und Logik Teil 1: Zahlen Dr. Michael Ebner Dipl.-Inf. René Soltwisch Lehrstuhl für Telematik Institut für Informatik
Universität Göttingen - Informatik II - SS 2005
2. Zahlen und Logik
2. Zahlen und Logik
Nachricht, Daten, Information (1)
Nachricht, Daten, Information (2) Gleiche Informationen sind in verschiedenen Codierungen möglich Für verschiedene Empfänger hat die gleiche Information oft unterschiedliche Bedeutung Information muss für den Empfänger nicht neu sein, evtl. ist der Informationsgehalt auch leer
Nachricht „Zeichen oder kontinuierliche Funktion, die zum Zwecke der Weitergabe Information aufgrund bekannter oder unterstellter Abmachungen darstellen.“ (DIN 44300)
Daten „Zeichen oder kontinuierliche Funktion, die zum Zwecke der Verarbeitung Information aufgrund bekannter oder unterstellter Abmachungen darstellen.“ (DIN 44300)
Information
Information „Inhalt von Nachrichten oder Daten“
Nachricht Daten Information
2.1-2
Codierung Information Codierung Information
Weitergabe Verarbeitung Bedeutung/Inhalt
Codierung
2.1-3
Zweck
Nachricht
‘5 Grad’
menschliche Sprache
Duden
Weitergabe der Information in einem Gespräch
Datum
‘5 Grad’
1011’0101 0010’0000 1100’0111 1111’0010 0110’0001 0110’0100
ASCII
Weiterverarbeitung in einem Textverarbeitungsprogramm
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
Interpretation
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-4
2. Zahlen und Logik
2. Zahlen und Logik
Informationsdarstellung
Analoge Daten & Digitale Daten
Zur Übertragung von Nachrichten/Daten müssen diese in Signale umgesetzt werden. Signal: physikalische Darstellung von Nachrichten/Daten Signaltypen: Radiowellen, Rauchsignale, Stromfluss, Schallwellen, usw.
Physikalische Prozesse werden im Allgemeinen durch kontinuierliche Funktionen beschrieben. Diese liefern im Prinzip unendlich viele Werte, wobei sich diese aufgrund der Unschärferelation nicht unbedingt unterscheiden lassen. Wo begegnen uns analoge Daten? Quecksilberthermometer, Uhren, Schallplatten, Audio-Kassetten, Waagen
Digitale Daten
Signalparameter: Ausprägung eines Signals mit dessen Hilfe Nachrichten/Daten dargestellt werden. Parameterarten: Frequenz, Farbe, Form, Spannung, Lautstärke, usw. Signal
Analoge Daten
Quantisierung, d.h. der eventuell unendliche Wertebereich wird auf endlich viele Werte abgebildet Wo begegnen uns digitale Daten? DVD, CD, Computerdisketten, digitale Uhren, digitale Thermometer, MP3
Information/Wissen
Nachricht/Daten Informationsdarstellung
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-5
2. Zahlen und Logik
Universität Göttingen - Informatik II - SS 2005
2.1-6
2. Zahlen und Logik
Vorteile von digitalen Daten
Wie kommt man in einer ‘analogen‘ Welt zu digitalen Daten?
Auswahl diskreter Werte zur digitalen Interpretation erleichtert die rechnergestützte Verarbeitung und kann auch die Genauigkeit erhöhen Daten werden in Rechnern praktisch ausschließlich in digitaler Form dargestellt/verarbeitet. Meist in Form von „binären“ Signalen Binäre Signale: Signale, die nur zwei Zustände annehmen können.
Beispiel: Digitalisierung von Sprache Analoge Telephonie basiert auf der “Ähnlichkeit” von elektronischen Wellen und Schallwellen Sprachübertragung in der analogen Telephonie (‘analog‘ ≅ ‘ähnlich‘)
Zustand 1
0
Anmerkung: Prinzip gilt auch für die Digitalisierung von Musik (z.B. MP3), erfordert aber eigene Annahmen.
Zeit Informationsdarstellung
Universität Göttingen - Informatik II - SS 2005
2.1-7
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-8
2. Zahlen und Logik
2. Zahlen und Logik
Sprach- und Signalisierungsübertragung
Digitalisierung: Prinzip (1/3) „digital“ ≅ „ziffernmäßig“ Beispiel:
Zusätzlich zur Nutzinformation werden Signalinformationen übertragen.
Menge von Kartoffeln in einem Sack lässt sich durch zählen oder wiegen beschreiben. 100 kg lässt sich durch die Folge 1-0-0 im Dezimalsystem beschreiben Digitaltechnik: binärer Zeichenvorrat, d.h. 0 und 1 10010 ≅ 11001002
Ähnlich lassen sich elektrische Wellen in einem Telefon und der Telefonleitung beschreiben. Fazit: Elektrische Welle wird in regelmäßigen Abständen “abgehorcht” und der dann aktuelle Wert wird notiert
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-9
2. Zahlen und Logik
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-10
2. Zahlen und Logik
Digitalisierung (2/3)
Digitalisierung (3/3)
Abtasttheorem Ein Signal muss mindestens mit einer (Abtast-) Frequenz abgetastet werden, die doppelt so hoch ist wie die höchste im Signal enthaltene Frequenz. Andernfalls kann das Signal nicht originalgetreu reproduziert werden. Abtastfrequenz = 1/(Abstand zwischen zwei Abtastpunkten)
•Filter für Frequenzen >3400Hz
Telephonie: Frequenzen (Töne): Abtastfrequenz: Tiefpass:
300 Hz bis 3400 Hz 8000 Hz Filter für Frequenzen > 3400 Hz
•(------------ Hüllkurve angedeutet)
Durch Abtastung entsteht eine Folge von Impulsen (Werten). Hüllkurve dieser Abtastwerte ergibt wieder das alte Signal. Verfahren: Pulsamplitudenmodulation (PAM) Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-11
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-12
2. Zahlen und Logik
2. Zahlen und Logik
Quantisierung (1/2)
Quantisierung (2/2)
Impulse sind ja immer noch analog, d.h. die gemessenen Werte sind für die digitale Repräsentation u.U. noch zu genau. Sie müssen zu digitalen Signalen verarbeitet werden. (⇒ Einschränkung auf eine darstellbare endliche Wertemenge) Maximal mögliche Amplitudenwert wird in eine endliche Anzahl von Amplitudenstufen unterteilt (=quantisiert) Je mehr Stufen (Quantisierungsschritte) benutzt werden, desto genauer wird das Originalsignal abgetastet und desto originalgetreuer kann es wieder gewonnen werden.
Telekom-Netzbetreiber verwenden 28 = 256 Quantisierungsschritte (mit 8Bit darstellbar) Bitrate eines Fernsprechkanals? Abtastfrequenz: 8000Hz = 8000/s 8Bit * 8000/s = 64000 Bit/s = 64 kBit/s Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-13
2. Zahlen und Logik
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-14
2. Zahlen und Logik
Zeitmultiplexverfahren
Datenaufbewahrung Physikalische Prozesse mit deren Hilfe sich Signale und Informationen aufbewahren und wiederherstellen lassen Je nach Anwendung kann man zwischen RAM und ROM unterscheiden:
Speichermedium ROM
RAM
2.1-15
Wert 1
Webstuhl-Brettchen
Bohrung
Keine Bohrung
Lochstreifen/Lochkarte
Lochung
Keine Lochung
Kippschalter
Kontakt zu
Kontakt offen
Magnetschicht
↑H
↓H
Transistor
0,5 V
4,5 V
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
Wert 0
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-16
2. Zahlen und Logik
2. Zahlen und Logik
Codierung - Grundlagen
Codierung - Codes (1/2)
Alphabet (Zeichenvorrat):
Code:
Endliche Menge von Zeichen, die zur Darstellung von Informationen benutzt wird Beispiele: Ziffern: {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Alphanumerisches Alphabet: {a,...,z, A,...,Z, 0,...,9} Binärzeichen: {0, 1}
zwei Zeichenvorräte: Urbildmenge und Bildmenge eindeutige Abbildung von der Urbildmenge auf die Bildmenge
Binärcode: Code, bei dem jedes Zeichen der Bildmenge ein Wort aus Binärzeichen (Binärcode) ist.
Wort: Folge von Zeichen, die in einem bestimmten Kontext als Einheit betrachtet werden Beispiele: Zahlwörter: Schreibwörter: Binärwörter:
105, 75, 73, 15, ... Kohlkopf, Hunger, Hund 001, 10010010, 1, 0, ...
Bemerkungen zum Kontext: in Englisch hat das Wort ‘Kohlkopf’ keine Bedeutung ‘010’ kann von Rechner mit Wortlänge 8 nicht verarbeitet werden Informationsdarstellung
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-17
2. Zahlen und Logik
Alphanumerische Codes Sind zur gemeinsamen Darstellung von Zahlen und Buchstaben in Texten notwendig. Alphabet:
Beispiel: Codierung der Zahlen 0 ... 9 als Binärwörter Abkürzungen BCD: Binary Coded Decimal EBCDIC: Extended Binary Decimal Interchange Code ASCII: American Standard Code for Information Interchange BCD
EBCDIC
(Dualzahl)
0 1 2 3 4 5 6 7 8 9 + -
2.1-18
2. Zahlen und Logik
Codierung - Codes (2/2)
Dezimalzahl
Universität Göttingen - Informatik II - SS 2005
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011
ASCII (P: Paritätsbit)
1111’0000 1111’0001 1111’0010 1111’0011 1111’0100 1111’0101 1111’0110 1111’0111 1111’1000 1111’1001
P011’0000 P011’0001 P011’0010 P011’0011 P011’0100 P011’0101 P011’0110 P011’0111 P011’1000 P011’1001 P010’1011 P010’1101
26
Großbuchstaben
(A ... Z)
26
Kleinbuchstaben
(a ... z)
10
Zahlen
(0 ... 9)
62
Zeichen
62 Zeichen lassen sich in einem Binärwort der Länge 6 codieren (26 = 64). Was ist mit nationalen Sonderzeichen und Satzzeichen? Zum Beispiel: Ä Ü Ö , ; : - + ( ) Man benutzt daher einen 7 Bit Code mit dem sich 128 Zeichen (27 Zeichen) codieren lassen.
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-19
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-20
2. Zahlen und Logik
2. Zahlen und Logik
Codierung - ASCII Code (1/2)
Bits P000 76543210
ASCII: American Standard Code for Information Interchange 8 - Bit Code: 7 Bit zur Codierung von Zeichen 1 Bit Paritätsbit
P001 P010 P011 P100 P101 P110 P111
0000
NULL
DC0
0001 0010 0011 0100 0101 0110 0111 1000 1001 1010
SOM EOA EOM EOT WRU RU BELL FE HT/SK LF
DC1 DC2 DC3 DC4 ERR SYNC LEM S0 S1 S2
! „ # $ % & ‘ ( ) *
1011
V/TAB
S3
1100 1101 1110 1111
FF CR SO SI
S4 S5 S6 S7
0
@
P
‘
p
1 2 3 4 5 6 7 8 9 :
A B C D E F G H I J
Q R S T U V W X Y Z
a b c d e f g h i j
q r s t u v w x y z
+
;
K
, . /
< = > ?
L M N O
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-21
2. Zahlen und Logik
↑ ←
l m n o
ACK UC ESC DEL Informationsdarstellung
Universität Göttingen - Informatik II - SS 2005
2.1-22
2. Zahlen und Logik
Codierung - ASCII Code (2/2)
Der Unicode-Standard (1/4)
Die meisten Computer arbeiten jedoch mit einer 8 Bit Codierung ohne Paritätsbit, d.h. anstelle von 27 (=128) Zeichen werden 28 (= 256) Zeichen kodiert. Man spricht dann von “Extended Character Sets“. Extended Character Sets werden z.B. benutzt um Linienzeichnungen (z.B. ⎤ oder ⎝) und andere wichtige Zeichen zu kodieren (z.B. ☺ oder ). Natürlich auch zur Berücksichtigung von nationalen Varianten (z.B. ß, ü, Ü, ö, Ö, ä, Ä, û, ú, ù, Æ, æ, è, é, Ó). Typischerweise reichen 256 Zeichen jedoch nur aus um eine nationale Variante zu unterstützen, wodurch es dann wieder viele verschiedene nationale Extended Character Sets gibt. Ein Ausweg aus diesem Chaos soll der Unicode sein, einer 16 Bit Kodierung von Zeichen, bei der die ersten 128 Kodierungen der normalen 7 Bit ASCII entsprechen.
Allgemeines Universeller Standard zur Zeichencodierung Voll Identisch mit ISO/IEC 10646:2003: Information Technology Universal Multiple- Octet Coded Character Set (UCS) Ziele: Codierung multilingualer Texte Einfacher Austausch von Textdateien über nationale Grenzen hinweg Einbeziehung mathematischer und technischer Symbole
Unicode ist Standardcodierung bei Java Unterstützung in C++ durch Datentyp wchar_t und Klassenbibliotheken wie QT
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
k \
2.1-23
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-24
2. Zahlen und Logik
2. Zahlen und Logik
Der Unicode-Standard (2/4)
Der Unicode-Standard (3/4)
Zeichenumfang
Zeichencodierung
Jedes Zeichen ist eindeutig einem 16-Bit-Codewert zugewiesen ≈ 65.500 Zeichen; ausreichend für die Codierung aller Zeichen aller geschriebenen Sprachen Codierung (v.4.0) Alphabetics, Symbols 11 649 CJK Ideographs
27 786???
Hangul Syllables
11 172
Private Use
6 400
Surrogates
2 048
Controls
65
Unicode entspricht in Not Characters den unteren Total assigned 16-bit code values 128 Werten Unassigned 16-bit code values dem ASCII-Code
34 59 213
Unterstützte Sprachen: Latein, Griechisch, Chinesisch/Japanisch/Koreanisch, Kyrillisch, Arabisch, Bengalisch, Gujarati,... Zusammengesetzte Zeichen (z. B. Umlaute) können wahlweise dargestellt werden: durch „vorkomponierte“ Zeichen (aus Kompatibilität), z. B. ä, oder durch Kombination von Grundzeichen und Diakritika (vorteilhaft bei Sortierung), z. B. a“ Änderung der Schreibrichtung kann durch spezielle Zeichen eingeleitet werden, z. B. beim Wechsel zwischen Englisch und Arabisch Unicode legt nicht das Aussehen (glyph) von Zeichen fest; statt dessen Zuweisung eines Namens, z. B. „LATIN CAPITAL LETTER A“
6 3236 Informationsdarstellung
Universität Göttingen - Informatik II - SS 2005
2.1-25
2. Zahlen und Logik
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2. Zahlen und Logik
Der Unicode-Standard (4/4)
Codierung - Schichtenmodell Schichtenmodell als Gedankenmodell
Quellen Unicode Consortium (http://www.unicode.org) The Unicode Consortium. The Unicode Standard, Version 4.1.0, defined by: The Unicode Standard, Version 4.0 (Boston, MA, Addison-Wesley, 2003. ISBN 0-321-18578-1), as amended by Unicode 4.0.1 (http://www.unicode.org/versions/Unicode4.0.1) and by Unicode 4.1.0 (http://www.unicode.org/versions/Unicode4.1.0).
C3 C2 C1 C0 Beispiel:
Codierungen sind häufig geschachtelt. D.h. eine höhere Schicht stützt sich auf die nächst tiefere ab. Die höhere Schicht nimmt Zeichen entgegen, ignoriert aber deren tiefere Codierung.
C++ – Schlüsselwörter Großbuchstaben ISO ISO 7-Bit 8-Bit Bytes Binärstellen, Bits Schaltzustände Elektronenebene
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-26
2.1-27
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-28
2. Zahlen und Logik
2. Zahlen und Logik
Rückblick: Information und Informationsdarstellung
Überblick
Signal, Daten, Nachricht, Information Analoge Daten & digitale Daten Codierungen
Zahlen Informationsdarstellung Zahlensysteme Rechnerarithmetik
Zahlencodes alphanumerische Codes
Logik Aussagenlogik und logische Gatter Prädikatenlogik
Codes BCD Code EBCDIC Code ASCII Code Unicode
Schichtung von Codierungen
Informationsdarstellung Universität Göttingen - Informatik II - SS 2005
2.1-29
2. Zahlen und Logik
2.1-30
2. Zahlen und Logik
Polyadische Zahlensysteme (1/2)
Polyadische Zahlensysteme (2/2)
Potenzen zu einer Basis B als Stellenwert N-1
n = ∑ai * Bi
z.B. Codierung von 198510 BCD (kein polyadisches Zahlensystem): 0001 1001 1000 0101
(B, ai ∈ N0, B > 1)
i=0
1
9
= ((...(aN-1 * B) + aN-2) * B + ...)*B + a1) *B + a0 (Horner Schema) besagt das einen Wert im Zahlensystem mit der Basis beschreibt. z.B. 12310 123 im Dezimalsystem, 11102 1110 im Dualsystem
5
Dualsystem (Basis 2): 111110000012 = 1*210 + 1*29 + 1*28 + 1*27 + 1*26 + 0*25 + 0*24 + 0*23 + 0*22 + 0*21 + 0*20 =(((((((((1*2 + 1)*2 + 1)*2 + 1)*2 + 1)*2 + 0)*2 + 0)*2 + 0)*2+ 0)*2+ 0)*2+ 1 =198510
Zahlensysteme
Universität Göttingen - Informatik II - SS 2005
8
Dezimalsystem (Basis 10): 198510 = 1 * 103+9 * 102 +8 * 101 + 5 * 100 = ((1 * 10) + 9) * 10 + 8) *10 + 5
= aN-1 * BN-1 + aN-2 * BN-2 + ... + a1 * B1 + a0
Konvention:
Universität Göttingen - Informatik II - SS 2005
2.1-31
Zahlensysteme Universität Göttingen - Informatik II - SS 2005
2.1-32
2. Zahlen und Logik
2. Zahlen und Logik
Zahlensysteme mit Zweierpotenz als Basis
Umrechnung zwischen Zahlensystemen
Binärsystem (Basis 2) Vierersystem (Basis 4) Oktalsystem (Basis 8) Hexadezimalsystem (Basis 16) (Zeichenvorrat: 0...9, A...F) Einfache Umrechnung: „Umgruppieren der Binärstellen“ Beispiel: 146310 = 101101101112 =
01
01
10
11
01
11
1
1
2
3
1
3
= =
010
110
110
111
2
6
6
7
0101
1011
0111
5
B
7
Im allgemeinen reicht es nicht aus einfach nur die Binärstellen umzugruppieren. Empfehlung für die manuelle Umrechnung: I. Darstellung mit Basis B1 Multiplikative Umrechnung im Zielsystem (hier Basis 10)
(1)
* II. Darstellung mit Basis 10
= 1123134
Dividierende Umrechnung im Quellsystem (hier Basis 10)
(2)
/ =26678
III. Darstellung mit Basis B2 =5B716
Zahlensysteme
Universität Göttingen - Informatik II - SS 2005
2.1-33
2. Zahlen und Logik
Beispiel für manuelle Umrechnung (2/3)
DB716 = ???7 (1) Multiplikative Umrechnung mit Basis 10
(2)
+ B16 * 16101
+
716 * 16100
= D16 * 25610
+
B16 * 1610
+
716
= 1310 * 25610
+ 1110 * 1610
+
=
332810
+
+
=
351110
=
D16 * 16102
17610
710 710
oder entsprechend dem Horner Schema =
Dividierende Umrechnung im Quellsystem
(Quellsystem: Basis 10, Zielsystem: Basis 7)
(Einfaches ‘Ausmultiplizieren’)
DB716
2.1-34
2. Zahlen und Logik
Beispiel für manuelle Umrechnung (1/3)
DB716
Zahlensysteme Universität Göttingen - Informatik II - SS 2005
((D16 * 1610) + B16) * 1610 + 716
351110
/
7
=
501
Rest 4
=
a0
501
/
7
=
71
Rest 4
=
a1
71
/
7
=
10
Rest 1
=
a2
10
/
7
=
1
Rest 3
=
a3
1
/
7
=
0
Rest 1
=
a4
0
/
7
=
0
Rest 0
=
a5
...
/
7
=
0
Rest 0
=
a6
...
...
...
...
... ...
...
...
...
...
...
...
... 0
=
an
=
((1310 * 1610) + 1110) * 1610 + 710
...
=
(20810 + 1110) * 1610 + 710
...
=
350410 + 710
=
351110
Universität Göttingen - Informatik II - SS 2005
(a4a3a2a1a0)7 = 131447 Zahlensysteme 2.1-35
Zahlensysteme Universität Göttingen - Informatik II - SS 2005
2.1-36
2. Zahlen und Logik
2. Zahlen und Logik
Empfehlung für manuelle Umrechnung zwischen Zahlensystemen (Zusammenfassung)
Beispiel für manuelle Umrechnung (3/3)
Beispiel: DB716 = ???7
I. Darstellung mit Basis B1
Also: (1)
Multiplikative Umrechnung im Zielsystem (hier Basis 10)
* DB716
=
351110
=
131447
Schritt (1)
Schritt (2)
(Multiplikation)
(Division)
DB716 = ((D16 * 16) + B16) * 16 + 716 = ((13 * 16) + 11)*16 +7 = (208 + 11) * 16 + 7 = 219 * 16 + 7 = 3504 + 7 = 351110
II. Darstellung mit Basis 10 (2)
Dividierende Umrechnung im Quellsystem (hier Basis 10)
/
3511 501 71 10 1
:7 :7 :7 :7 :7
= 501 = 71 = 10 = 1 Rest = 0 Rest
Zahlensysteme 2.1-37
2. Zahlen und Logik
Zahlensysteme Universität Göttingen - Informatik II - SS 2005
2.1-38
2. Zahlen und Logik
Direkte Umrechnung einer Zahlendarstellung mit Basis B1 in eine Zahlendarstellung mit der Basis B2 (1/2)
Direkte Umrechnung einer Zahlendarstellung mit Basis B1 in eine Zahlendarstellung mit der Basis B2 (2/2) Dividierende Umrechnung im Quellsystem
Multiplikative Umrechnung im Zielsystem
Beispiel: DB716 = ???7
Beispiel: DB716 = ???7 Einfaches ‘Ausmultiplizieren’ DB716
4 = a0 4 = a1 1 = a2 = a3 = a4
DB716 = 351110 = 131447
III. Darstellung mit Basis B2
Universität Göttingen - Informatik II - SS 2005
Rest Rest Rest 3 1
= = = =
D16 * 5147 167 * 5147 124637 131447
( 1610 = 1016 = 227, 16102= 25610 = 5147) + + +
B16 * 227 147 * 227 3417
+ + +
716 107 107
DB716
/
716
= 1F516
1F516
/
716
=
4716
/
716
A16
/
116
/
Rest 4
= a0
4716
Rest 4
= a1
=
A16
Rest 1
= a2
716
=
116
Rest 3
= a3
716
=
016
Rest 1
= a4
oder entsprechend dem Horner Schema DB716
= = = = =
((D16 * 227) + B16) * 227 + 716 ((167 * 227) + 147) * 227 + 107 (4157 + 147) * 227 + 107 131347 + 107 131447
a4 a3 a2 a1 a0 = 131447 Zahlensysteme
Universität Göttingen - Informatik II - SS 2005
2.1-39
Zahlensysteme Universität Göttingen - Informatik II - SS 2005
2.1-40
2. Zahlen und Logik
2. Zahlen und Logik
Darstellung von Brüchen
Handhabung von unechten Brüchen
Brüche werden als negative Potenzen der Basis dargestellt. zB =
-N
∑ai * Bi
Vor dem Komma anfallende Ziffern entsprechen dem Rest bei der Division im Quellsystem (vgl. Folie 2.1-36).
(B, ai ∈ N0, B > 1, ai 128
-38
negatives Vorzeichen Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-51
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-52
2. Zahlen und Logik
2. Zahlen und Logik
3 Darstellungsformen für Zahlen 1. 2. 3.
Darstellung mit Vorzeichen und Betrag (1/2)
Vorzeichen und Betrag (engl. Sign-/Magnitude) Stellenkomplement Basiskomplement
Wortlänge N N-1 Bits beschreiben den Betrag der Zahl 1 Bit beschreibt das Vorzeichen der Zahl zwei Darstellungen für die NULL engl. ‘Sign-/Magnitude Representation‘ Die Vorzeichen und Betrag Darstellung entspricht dem was man so kennt.
Warum 3 Darstellungsformen? Ziel: möglichst einfache ALU (CPU Baustein, der Rechenoperationen durchführt) Wie macht man das? Subtraktion wird auf die Addition zurückgeführt Multiplikation wird auf die Addition zurückgeführt Division wird auf die Multiplikation (d.h. Addition) zurückgeführt
Rechnerarithmetik
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
Universität Göttingen - Informatik II - SS 2005
2.1-53
2. Zahlen und Logik
2. Zahlen und Logik
Darstellung mit Vorzeichen und Betrag (2/2) 0
Nachteile der Betrag-/Vorzeichen-Darstellung Man benötigt Addier- und Subtrahierwerk in der ALU Man benötigt spezielle Logik um zu bestimmen, ob addiert oder subtrahiert werden soll Beispiel: die Operanden x und y sollen addiert werden
011...1 100...0
111...1
-0 +0 111...1
2.1-54
10...0
00...0
es sind folgende Fälle zu unterscheiden:
011...1
Fall
Beispiel für diese Darstellung: Dezimal
Vorzeichen Betrag
+
92
0000 0101 1100
-
92
1000 0101 1100
Operanden
2.1-55
⇒ x≥0
–x ⇒ x < 0
+y
⇒ y≥0
–y ⇒ y < 0
Auszuführende Operation
1
+x +y
(zwei positive Operanden)
Addition
2
-x-y
(zwei negative Operanden)
Addition -(x + y)
3
|positiver Operand| ≥ |negativer Operand| +x, -y, |x| ≥ |y| bzw. +y, -x, |y| ≥ |x|
Subtraktion x – y bzw. y – x
4
|negativer Operand| ≥ |positiver Operand| +x, -y, |x| < |y| bzw. +y, -x, |y| < |x|
Subtraktion –(|y| – |x|) bzw. – (|x| – |y|)
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
+x
x+y
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-56
2. Zahlen und Logik
2. Zahlen und Logik
Komplementdarstellungen 1. 2.
Stellenkomplement (1/2) C für das Stellenkomplement: N-1 C = BN – 1 Darstellung einer Zahl a: n = ∑ai * Bi i=0 Komplementbildung:
Stellenkomplement (B-1 Komplement) Basiskomplement
N-1
a= C–a=
Ziel: Rückführung der Subtraktionen auf die Addition
(BN-1) -
ai * Bi i=0
Komplementbildung: b = C – b (für geeignetes C) Subtraktion durch Addition des Komplements: a+b =
a–b+C
⇔ a–b =
a+b–C
N-1
=
N-1
Bi+1 -
N-1
Bi
i=0
-
i=0
ai * Bi i=0
|
BN – 1 N-1
= d.h. wenn (1.) das Komplement leicht zu bilden ist und (2.) die Reduktion mod C einfach ist, dann kann die Subtraktion auf eine Addition des Komplements zurückgeführt werden
((B – 1) – ai)
* Bi
i=0
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-57
2. Zahlen und Logik
((B – 1) – ai) bedeutet: (B-1)-Komplement kann für jede Stelle (= Stellenkomplement) gebildet werden. Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-58
2. Zahlen und Logik
Stellenkomplement für die Basis 2
Stellenkomplement und andere Basen N-1
N-1
Wie funktioniert die (B-1)-Komplementbildung für die Basis 2? einsetzen in die bekannten Formeln: N-1 a = ∑ai * 2i
Formeln: a = ∑ai * Bi;
a = ∑ ((2 – 1) - ai ) * 2i
Man kann das Stellenkomplement auch auf andere Zahlensysteme (neben dem Dualsystem) anwenden, z.B. Dezimalsystem (d.h. B = 10):
a=
i=0
((B – 1) – ai) * Bi
i=0
im Dualsystem: Komplementbildung ≅ „Bits stellenweise invertieren“
i=0 N-1 i=0
N-1
= ∑ (1 - ai ) * 2i i=0
(1 – ai ) d.h. Invertierung jeder Stelle der Dualzahl
x=357
Beispiel: x = x5 x4 x3 x2 x1 x0 = 0 1 0 0 1 0
x5 = 0 x4 = 1 x3 = 0 x2 = 0 x1 = 1 x0 = 0
→ → → → → →
x5 = 1 – x5 = 1 – 0 = 1 x4 = 1 – x4 = 1 – 1 = 0 x3 = 1 – x3 = 1 – 0 = 1 x2 = 1 – x2 = 1 – 0 = 1 x1 = 1 – x1 = 1 – 1 = 0 x0 = 1 – x0 = 1 – 0 = 1
Universität Göttingen - Informatik II - SS 2005
x=101101
x2 = 3
→
x2 = (10 – 1) – x2 = 9 – 3 = 6
x1 = 5
→
x1 = (10 – 1) – x1 = 9 – 5 = 4
x0 = 7
→
x0 = (10 – 1) – x0 = 9 – 7 = 2
x=642 Rechnerarithmetik 2.1-59
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-60
2. Zahlen und Logik
2. Zahlen und Logik
Eigenschaften Stellenkomplement (Dualsystem)
Zahlenring im Stellenkomplement
Im Rechner werden die negativen Zahlen als Komplemente der positiven Zahlen dargestellt. Das „most significant Bit“ beschreibt das Vorzeichen der repräsentierten Zahl:
-7 8 1000
1 ⇒ –
Darstellbarer Zahlenbereich –(½ * BN – 1) ...
6
positive Zahlen
-3 12 1100
1 1 1 ... 1
0101
4
3
-2 13 1101
2 -1 14 1110
+(½ * BN – 1)
0110
5
negative Zahlen
-4 11 1011
Zwei Darstellungen der Null Und
0111
-5 10 1010
0 ⇒ +
0 0 0 ... 0
7
-6 9 1001
+-
0
1
0100
0011
0010
0001
0000 1111
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-61
2. Zahlen und Logik
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-62
2. Zahlen und Logik
Stellenkomplement: Reduktion mod C (1/7)
Stellenkomplement: Reduktion mod C (2/7) 1. Fall: a, b > 0 ; a > b ⇒ d > 0
Erinnerung: Stellenkomplement ist nur sinnvoll, wenn
Abschätzung: BN ≤ a + b < 2*BN d.h.: Es tritt ein Überlauf von 1 in die (nicht existierende) (N+1).te Stelle auf. Warum? a+b= a+( C – b)
Komplementbildung einfach ist (Stellenweise invertieren) Reduktion mod C einfach ist
|
Reduktion mod C: d = a – b = a + b –C Es sind 3 Fälle zu unterscheiden:
= =
a+( a–b
BN
–1 – 1 + BN
– b)
|
0 < d < BN
1. Fall (zwei positive Zahlen)
a, b > 0 ; a > b
⇒
d>0
2. Fall (zwei positive Zahlen)
a, b > 0 ; a ≤ b
⇒
d≤0
3. Fall (zwei negative Zahlen)
d = –a – b < 0 ; |d| = a + b
Ignorieren des Übertrags entspricht einer Subtraktion von BN Aufaddieren einer 1 entspricht dann einer Subtraktion von C = BN – 1 d.h. man muß den Überlauf addieren um zum richtigen Ergebnis zu gelangen. Stichwort: “Einserrücklauf“
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-63
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-64
2. Zahlen und Logik
2. Zahlen und Logik
Stellenkomplement: Reduktion mod C (3/7)
Stellenkomplement: Reduktion mod C (4/7)
1. Fall: 3 Beispiele
1. Fall: 3 Beispiele
I. Dezimalsystem (N = 3) a–b 65 – 43
Komplementbildung
III. Dualsystem (N = 5) Dezimal a+b–1 14 01110 – 0 + 11111 1 01101 1 14 01110
a+b–1 065 + 956 1 021
43 = 999 – 043 = 956
1 022
22
II. Dualsystem (N = 5) a–b 01110 ⇒ –00111
a+b–1 01110 + 11000 1 00110 1 00111
Bemerkung 1: 00000 = 11111
Bemerkung 2: „negative Null stört nicht“
Dezimal (Komplement)
–
⇒
14 7
7 Rechnerarithmetik
Universität Göttingen - Informatik II - SS 2005
2.1-65
2. Zahlen und Logik
Stellenkomplement: Reduktion mod C (6/7)
2. Fall: a, b > 0 ; a ≤ b ⇒ d ≤ 0
3. Fall: d = –a – b < 0 ; |d| = a + b
Differenz d = a – b ist negativ, d.h. d muß selbst in der Komplementdarstellung vorliegen: d ⇒ C – |d|
d in Komplementdarstellung d = C - |d| ist erwünscht a + b = (C – a) + (C – b) = (C – (a + b)) + C = (C – |d|) + C = |d| + (BN – 1)
d = – |d| = a + b – C ⇔ C – |d| = a + b ≤ C = BN – 1
verschwindet durch ignorieren des Überlaufs und Einserrücklauf
d.h. die Addition des Komplements liefert bereits d in der richtigen Darstellung! Es tritt kein Überlauf in die (N+1).te Stelle auf, weil: a + b ≤ BN – 1 Beispiel: 5 – 7 – 2 Universität Göttingen - Informatik II - SS 2005
2.1-66
2. Zahlen und Logik
Stellenkomplement: Reduktion mod C (5/7)
dezimal
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
dual
– 00101 00111
Gewünschte Ergebnis
a+b
⇒
+ 00101 11000 11101 Rechnerarithmetik 2.1-67
Überlauf in die (N+1).te Stelle und Einserrücklauf liefern |d| in Komplementdarstellung (d.h. das gewünschte Ergebnis) Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-68
2. Zahlen und Logik
2. Zahlen und Logik
Stellenkomplement: Reduktion mod C (7/7)
Basiskomplement (B-Komplement)
3. Fall: d = –a – b < 0 ; |d| = a + b
C für das Basiskomplement: C = BN Komplementbildung: N-1 N-1 Ba = BN – ai * Bi ) + 1 ai * Bi = (BN-1) – (
Beispiel:
– –
7 5
Dual 11000 + 11010
=
– 12
i=0
i=0
+1
d.h. die Komplementbildung ist für das Basiskomplement etwas aufwendiger
1 10010 1 10011
B-1a
(B–1)–Komplement bilden Aufaddieren einer 1
(12 ≅ 0 1 1 0 0)
Beispiel: (B-1)-Komplement:
5
≅
00101
B–15
≅
11010
B5
≅
Aufaddieren von 1:
+
1
11011
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-69
2. Zahlen und Logik
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-70
2. Zahlen und Logik
Eigenschaften Basiskomplement (Dualsystem)
Zahlenring im Basiskomplement -8 1000
Negative Zahlen werden als Komplemente der positiven Zahlen dargestellt. Das „most significant Bit“ beschreibt das Vorzeichen der Zahl.
-7 9 1001
0111 6
-5 11 1011
1 ⇒ – Es gibt nur eine Null Bemerkung: Komplement der Null liegt beim Basiskomplement, anders als beim Stellenkomplement, nicht mehr im darstellbaren Zahlenbereich (Übertrag in die (n+1).te Stelle).
negative Zahlen
-4 12 1100
positive Zahlen
+(½ *
– 1)
3
2 -1 15 1111
2.1-71
0101
4
-3 13 1101 -2 14 1110
BN
0110
5
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
7
-6 10 1010
0 ⇒ +
Darstellbarer Zahlenbereich ... –(½ * BN )
8
0 0000
1
0100
0011
0010
0001
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-72
2. Zahlen und Logik
2. Zahlen und Logik
Reduktion mod C im Basiskomplement (1/2)
Reduktion mod C im Basiskomplement (1/2)
einfach, da C = BN, d.h. Überlauf in die (N+1).te Stelle ignorieren entspricht bereits der Subtraktion von BN ⇒ „kein Einserrücklauf“ Beispiele: Dezimalsystem (N=3)
065 – 043
B043
= 956 + 1
⇒
022
Beispiele: Dualsystem (N=5) dezimal –
065 + 957 1 022 ⇓ 022
Dual 5 7
00101 +
–2
11001 11110
(≅ B2)
Fall d < 0: Ergebnis ist bereits in Komplementdarstellung
Dualsystem (N=5) dezimal –
Dual
14
01110
7
+ 11001
7
1 00111
(≅ B7) Rechnerarithmetik
Universität Göttingen - Informatik II - SS 2005
2.1-73
2. Zahlen und Logik
Stellen- und Basiskomplement (2/2)
Überschreiten des zulässigen Zahlenbereichs
Fall 1: a, b > 0
Bei Operanden mit ungleichem Vorzeichen ist ein Überschreiten des zulässigen Zahlenbereichs nicht möglich:
oder
|a – b| ≤ |b|
Ein Fehler entsteht dann, wenn gilt a + b ≥ BN-1 Das vorderste (‚most significant‘) Bit wird gesetzt und als falsches Resultat entsteht eine negative Zahl. Es gibt jedoch keinen Überlauf in die (N+1).te Stelle.
Fall 2:
Überschreitung möglich, wenn:
a, b < 0
2.1-74
2. Zahlen und Logik
Stellen- und Basiskomplement (1/2)
|a – b| ≤ |a|
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
a, b < 0
Ein Fehler entsteht dann, wenn gilt |a| + |b| > BN-1 (Basiskomplement) ≥ BN-1 (Stellenkomplement) Das Vorzeichenbit wird dann zurückgesetzt, es gibt einen Überlauf in die (N+1).te Stelle und es entsteht ein falsches ‚positives‘ Resultat. Beim Stellenkomplement führt dieses normalerweise zum Einserrücklauf
oder a, b > 0
da das oberste Bit das Vorzeichen repräsentiert, kann bei Überschreitung des Zahlenbereichs das Vorzeichen wechseln. In so einem Fall muß: - ein Überlauf angezeigt werden, - eine arithmetische Fehlerbedingung aktiviert werden - „Overflow error“ angezeigt werden, - .... - usw.
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-75
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-76
2. Zahlen und Logik
2. Zahlen und Logik
Gegenüberstellung der 3 Zahlencodierungen Rechenwerk
Multiplikation und Division (1/2)
Negation
Einserrücklauf
Vorzeichen-/ Betrag Add / Sub
Vorzeichen invertieren
Stellenkomplement Add
Ziffern komplementieren Ja
Basiskomplement
Add
Stellenkomplement+ 1
Nein Nein
zurückführen auf Addition (bzw. Subtraktion) Multiplikation: Wiederholtes Verschieben (Shift-Operationen) und Addieren im Dualsystem 010110101 * 0 1 0 0 0 0 0 1 0
Stellenkomplement: Verzögerung beim Rechnen wg. Einserrücklauf Zwei Darstellungen der NULL
+
Basiskomplement Mehraufwand beim Herstellen des Komplements Verzögerung beim Negieren
1 0 0 0 0
1 0 1 0 1 0
0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 Shift-Operationen
1 0 1 0 0 0 1 1 0
Praxis: heute fast nur noch Basiskomplement (Genügend Wortbreite für das Resultat angenommen) Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-77
2. Zahlen und Logik
BCD–Darstellung & BCD–Arithmetik (1/4) 4.te Alternative zur Darstellung und zum Rechnen mit ganzen Zahlen BCD–Darstellung und BCD–Arithmetik wird von verschiedenen Mikroprozessoren direkt unterstützt BCD–Codierung:
Division:
–
2.1-78
2. Zahlen und Logik
Multiplikation und Division (2/2)
1 1 0 –1 0 0 1 0 – 1 1 –
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
1 1 0 0 0 1
0 0 0 0 0 0 1 – 1
1 0 0 1 1 1 0 0 1 0 1
0 0 0 1 1 0 0
: 10010
= 10111 Rest: 1 0 1 1
0 0 0 1 1 0 1 1
010 110 210 310 410 510 610 710 810 910
Wiederholtes Verschieben und Subtrahieren im Dualsystem Schwierig bei negativem Divisor eine Lösung: rechnen mit absoluten Beträgen und anschließend Vorzeichenrechnung
Fehlermeldung für Divisor = 0
(„Zerodivide“)
≅ ≅ ≅ ≅ ≅ ≅ ≅ ≅ ≅ ≅
0000BCD 0001BCD 0010BCD 0011BCD 0100BCD 0101BCD 0110BCD 0111BCD 1000BCD 1001BCD
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-79
‘+‘
≅
1010
‘-‘
≅
1011 1100 1101 1110
ungenutzte Werte
6 Codierungen, die nicht zur Zahlendarstellung benutzt werden
1111
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-80
2. Zahlen und Logik
2. Zahlen und Logik
BCD–Darstellung & BCD–Arithmetik (2/4) Beispiel 1:
dezimal
BCD–Darstellung & BCD–Arithmetik (3/4) Beispiel 3: 4739 + 1287 = 6026
BCD –Darstellung
23
0010
0011
0100
0111
0011
1001
+14
0001
0100
0001
0010
1000
0111
1
37 0011 0111 normale Dualzahlenaddition liefert hier das korrekte Ergebnis
Beispiel 2:
dezimal
BCD –Darstellung
29
0010
1001
+14
0001
0100
3? (6)
0011
1101 0110
43
0100
1
0101
1001
1100
0000 0110
→ Übertrag →+6
0101
1001
1100
0110
→ ungültiger BCD Code
0101
→ ungültiger BCD Code → Korrektur
0011
Bei Überträgen und beim Erreichen von ungültigen BCD-Codierungen liefert die Addition von 610 (= 0110BCD) das richtige Ergebnis
→+6
1
0110
1010
0010
0110
0110
0110
0000
0010
0110
⇓ 0
⇓ 2
⇓ 6
⇓ 6
→ ungültiger BCD Code →+6
1
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-81
2. Zahlen und Logik
Rechnerarithmetik Universität Göttingen - Informatik II - SS 2005
2.1-82
2. Zahlen und Logik
BCD–Darstellung & BCD–Arithmetik (4/4)
Gleitkommazahlen: Motivation Häufig berichteter Fehler in GCC (GNU Compiler Collection)
Abschließende Bemerkungen: Der BCD-Code erlaubt auch das Rechnen mit Festzahlen, d.h. Zahlen bei denen die Anzahl der Stellen hinter dem Komma festliegt Wenn der Ablauf „Zahleneingabe, Arithmetik, Zahlenausgabe“ ohne Umwandlung ins Binärsystem erfolgen soll, wird der BCD-Code bevorzugt. Der BCD-Code wird vorwiegend im technischen Bereichen verwendet, z.B. für 7-Segment-Anzeigen zur Darstellung von Zahlen.
Quelle: http://gcc.gnu.org/bugs.html#known (Stand 19. April 2004) Non-bugs: „The following are not actually bugs, but are reported often enough to warrant a mention here.“ Inkorrekte Handhabung von Gleitkommazahlen, z.B.: #include int main() { double a = 0.5; double b = 0.01; std::cout , < ,….) erfüllt ist, wird in das Zielregister eine 1 geschrieben und sonst eine 0. Beispiel: seq Rd, Rs1, Rs2 Falls (Rs1)=(Rs2) Rd:=1, sonst Rd:=0 sne – ungleich; sge – größer oder gleich; sgeu – größer oder gleich (unsigned) usw. Bei den Vergleichen gibt es nur 4 Maschinenbefehle: slt Rd, Rs1, Rs2 sltu Rd, Rs1, Rs2 slti Rd, Rs1, Imm sltui Rd, Rs1, Imm
set less than set less than unsigned set less than immediate set less than immediate unsigned
Universität Göttingen - Informatik II - SS 2005
4-34
4. Assembler
Sprünge
Kontrollstrukturen
Sprünge machen Programme erst mächtig. Der Spim unterstützt bedingte und unbedingte Sprünge (jumping) an eine Marke (Label). Im Gegensatz zu Hochsprachen unterstützt der Assembler bedingte Sprünge nur aufgrund von Größenvergleichen zweier Register oder eines Registers mit einer Konstanten.
Sprünge (bedingte und unbedingte) If-then-else, Case Loop (n Durchläufe) While (Abbruchbedingung)
b label – unbedingter Sprung zum Label beq Rs1, Rs2 label – bedingter Sprung falls Rs1 = Rs2 Es gibt insgesamt 21 Befehle für bedingte Sprünge, die auch =,,=,,=0, usw. abfragen.
Mit den Sprüngen können wir die Schleifenkonstrukte und Fallunterscheidungen der Hochsprachen nachbilden. Eigentlich erwartet der Assembler einen Offset zu PC (Branching), wir verwenden allerdings Marken, damit sind die Befehle j und b identisch im Spim.
Universität Göttingen - Informatik II - SS 2005
4-35
Universität Göttingen - Informatik II - SS 2005
4-36
4. Assembler
4. Assembler
Beispiel: While in Assembler
Beispiel: if–then–else in Assembler if ($t8 < 0) $s0 = $t1 = } else{ $s0 = $t2 = } main:
$v0 = 1; while ($a1 < $a2) do{ $t1 = mem[$a1]; $t2 = mem[$a2]; if ($t1 != $t2) go to break; $a1 = $a1 +1; $a2 = $a2 –1;} return break: $v0 = 0 return
then{ 0 - $t8; $t1 + 1;
$t8; $t2 + 1;
bgez sub addi b
$t8, else $s0, $zero, $t8 $t1, $t1, 1 next
# # # #
if ($t8 is > or = zero) branch to else $s0 gets the negative of $t8 increment $t1 by 1 branch around the else code
ori addi
$s0, $t8, 0 $t2, $t2, 1
# $s0 gets a copy of $t8 # increment $t2 by 1
li
$v0, 1
# Load $v0 with the value 1
bgeu lb lb bne addi addi b
$a1, $t1, $t2, $t1, $a1, $a2, loop
# # # # # # #
li
$v0, 0
loop:
else:
next:
$a2, done 0($a1) 0($a2) $t2, break $a1, 1 $a2, -1
If( $a1 >= $a2) Branch to done Load a Byte: $t1 = mem[$a1 + 0] Load a Byte: $t2 = mem[$a2 + 0] If ($t1 != $t2) Branch to break $a1 = $a1 + 1 $a2 = $a2 - 1 Branch to loop
break: # Load $v0 with the value 0
done: Universität Göttingen - Informatik II - SS 2005
4-37
4. Assembler
Universität Göttingen - Informatik II - SS 2005
4-38
4. Assembler
Komplexe Datenstrukturen – Felder
Beispiel: Schleifen in Assembler $a0 = 0;
Wir können im MIPS Felder deklarieren, indem wir die Felder explizit belegen. Beispiel: .data feld: .word 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
For ( $t0 =10; $t0 > 0; $t0 = $t0 -1) do { $a0 = $a0 + $t0; }
li
$a0, 0
#
li
$t0, 10
# Initialize loop counter to 10
$a0 = 0
Oder wir reservieren den Platz für 13 Wörter Beispiel: .data feld: .space 52 Hier wird nur Platz reserviert, aber nicht initialisiert!
loop: add
$a0, $a0, $t0
addi
$t0, $t0, -1
# Decrement loop counter
bgtz
$t0, loop
# If ($t0 >0) Branch to loop
Ein Feld ist vergleichbar mit einem Array sw $t0, feld($t0) # feld[i] := i Universität Göttingen - Informatik II - SS 2005
4-39
Universität Göttingen - Informatik II - SS 2005
4-40
4. Assembler
4. Assembler
Der Stack
Keller für mehr Daten
Ein LIFO Speicher Kellerzeiger (SP) zeigt auf 0x7FFF FFFC Einige CISC Prozessoren verfügen über Extrabefehle (push, pop) zum Einkellern von Daten. Beim Spim müssen wir die Kellerverwaltung selbst übernehmen. Unterbrechungen müssen beachtet werden sw $t0, ($sp) addi $sp, -4 Besser: addi $t0, -4 sw $t0, 4($sp)
Für den Fall, dass man mehrere Daten speichern will addi $sp, -12 sw $t0, 12($sp) sw $t1, 8($sp) sw $t2, 4($sp)
Lesen analog mit dem Befehl lw Erst den Lesebefehl und dann den SP wieder neu setzen.
# tep. Reg. $t0 auf Stack # Stack Pointer neu setzen
Universität Göttingen - Informatik II - SS 2005
Wir sind nun in der Lage, die ganzen temporären Register zu sichern.
4-41
4. Assembler
Universität Göttingen - Informatik II - SS 2005
4-42
4. Assembler
Unterprogramme
Beispiel: Das Unterprogramm swap als C Programm
Aus Hochsprachen ist das Konzept von Unterprogrammen bekannt. In Hochsprachen heißen sie Prozeduren, Methoden, Subrotinen oder Funktionen. Der Grund von Unterprogrammen ist die Wiederverwendung von Programmteilen. Programme können leichter verständlich werden, wenn Unterprogramme sinnvoll eingesetzt werden. Auch Assembler unterstützen das Konzept von Unterprogrammen.
Universität Göttingen - Informatik II - SS 2005
#gleich für 3 Worte der SP setzen # t0 sichern # t1 sichern # t2 sichern
swap vertauscht v[k] mit v[k+1] swap (int v[], int k) { int temp; temp = v[k]; v[k] = v [k+1]; v[k+1] = temp; }
4-43
Universität Göttingen - Informatik II - SS 2005
4-44
4. Assembler
4. Assembler
Swap als MIPS Assembler Programm swap:
addi sw sw sw sll add
$29, $29, -12 $2, 4($29) $15, 8($29) $16, 12($29) $2, $5, 2 $2, $4, $2
lw lw sw sw lw lw lw addi jr
$15, 0($2) $16, 4($2) $16, 0($2) $15, 4($2) $2, 4($29) $15, 8($29) $16, 12($29) $29, $29, 12 $31
# # # # # # # # # # # # # # # #
Unterprogramme
reserve space on stack save $2 on stack save $15 on stack save $16 on stack reg $2 = k * 4 reg $2 = v + (k*4) $2 con. addr. of v[k] $15 v[k+1] restore $2 from stack restore $15 from stack restore $16 from stack restore stackpointer return
Universität Göttingen - Informatik II - SS 2005
Das Unterprogramm wird mit „jal swap“ aufgerufen. Die Parameter müssen in $4, $5 übergeben werden. Die Rückkehradresse wird automatisch in $31 gespeichert. jr $31 ist der Rücksprung aus dem Unterprogramm und entspricht einem Return.
4-45
4. Assembler
Universität Göttingen - Informatik II - SS 2005
4-46
4. Assembler
Konventionen für Prozeduren (Prolog)
Konventionen für Prozeduren (Epilog)
Für den Aufrufer (Caller)
Callee
Sichere $a0-$a3, $v0, $v1, da diese in der Prozedur verändert werden dürfen. Speichere die zu übergebenden Argumente in $a0 bis $a3. Weitere Argumente werden über den Stack übergeben (das fünfte ist das letzte Argument auf dem Stack). Beachte: Call-by-Value vs. Call-by-Reference. Prozedur wird mit jal gestartet.
Für den Aufgerufenen (Callee)
Rückgabe des Funktionswerts in $v0, $v1 Register wieder herstellen $fp als letztes Register wieder herstellen
Stackframe entfernen $sp = $sp – Größe des Frames
Return (jr $ra)
Caller Auf dem Stack gesicherten Register wieder herstellen Argumente vom Stack nehmen
Platz für Stackframe reservieren. Sichere alle „callee-saved“ Register, die verändert werden. $fp, $ra, $s0 - $s7 Achtung Fehlerquelle: der Befehl jal verändert $ra Erstelle $fp durch $sp + Stackframe
Universität Göttingen - Informatik II - SS 2005
4-47
Universität Göttingen - Informatik II - SS 2005
4-48
4. Assembler
4. Assembler
RISC- Prozessoren und Pipelining
Pipelining
Ein-Zyklus-Maschinenbefehle
IF Instruction Fetch ID Instruction Decode OF Operand Fetch OE Operation Execute OS Operand Store
Phasen-Pipelining im RISC
Möglichst alle Befehle laufen in einem Taktzyklus ab.
Ohne Pipelining
Load/Store-Architektur Nur über Load/Store-Befehle Zugriff auf den Hauptspeicher. Alle anderen Befehle: Reg.-Reg.
IF
ID
OF
OE
OS IF
Keine Mikroprogrammierung
ID
OF
OE
OS
Festverdrahtete Ablaufsteuerung
Mit Phasen-Pipelining
Möglichst wenige Befehle und Adressierungsarten Typischerweise ca. 50 Befehle, 2 Adressierungsarten: PC-relativ und indiziert. Nur Befehle aufnehmen, wenn sie eine deutliche Geschwindigkeitssteigerung im Mittel bringen.
Einheitliches Befehlsformat
IF
ID
OF
OE
OS
IF
ID
OF
OE
OS
IF
ID
OF
OE
OS
IF
ID
OF
OE
1 Wort = 1 Befehl (einfache Dekodierung)
Aufwandsverlagerung in den Compiler Optimierender Compiler erzeugt Code (später mehr dazu).
Universität Göttingen - Informatik II - SS 2005
4-49
4. Assembler
Universität Göttingen - Informatik II - SS 2005
4-50
4. Assembler
Pipelining
Optimierung des Phasen-Pipelinings
Der Befehl wird nicht schneller ausgeführt, aber es können mehr Befehle pro Zeit ausgeführt werden.
Data Forwarding Operand kann vor dem Rückspeichern an den nächsten Befehl übergeben werden.
Parallelität und damit eine Geschwindigkeitssteigerung um die Anzahl der Pipelinestufen.
Delayed Load Beim Ladebefehl darf nicht sofort im nächsten Befehl auf den geladenen Operanden zugegriffen werden, sondern erst im übernächsten. Es wird die „Blase“ vermieden, dafür müssen evt. nop Befehle eingeschoben werden. Mit „Blase“ ist die Zeit gemeint, in der der Prozessor nicht weiß, was er tun soll und auf das Rückspeichern wartet.
Pipelinekonflikte Datenfluss-Konflikt durch Datenabhängigkeiten (Data Interlock) Beispiel: add $t0, $t1, $t2 # $t0 $t1 + $t2 addi $t0, 1 # $t0 $t0 + 1 add
OS
ID
$t1,$t2
+
$t0
addi
ID
$t0
+1
Universität Göttingen - Informatik II - SS 2005
$t0
4-51
Universität Göttingen - Informatik II - SS 2005
4-52
4. Assembler
4. Assembler
Steuerfluss-Konflikte
Fazit und Ausblick
Delayed Branch (verzögerter Sprung)
RISC hat sich durchgesetzt
Verzweigung wird erst ab dem übernächsten Befehl wirksam. Das „Loch“ wird durch einen Befehl, der eigentlich vor dem Branch hätte ausgeführt werden sollen, gestopft.
Einsatz in PCs, Workstation, Parallelrechnern und zunehmend auch in Mikrocontrollern.
Moderne CICS- Prozessoren haben mehr und mehr RISC Techniken übernommen
Für den Programmierer lästig, für optimierende Compiler kein Problem. traditioneller Sprung LOAD X, R1 ADD 1, R1 BRANCH L ADD R1, R2 SUB R3, R2 L: STORE R1, Y
verzögerter Sprung LOAD X, R1 ADD 1, R1 BRANCH L NOP ADD R1, R2 SUB R3, R2 L: STORE R1, Y
optimierter verzögerter Sprung LOAD X, R1 BRANCH L ADD 1, R1 ADD R1, R2 SUB R3, R2 L: STORE R1, Y
Universität Göttingen - Informatik II - SS 2005
4-53
4. Assembler
Ausblick Compilerbau (Kapitel 7) Automaten und Sprachen (Kapitel 6)
Betriebssysteme (Kapitel 5)
Maschinenorientierte Programmierung (Kapitel 4)
von-Neumann-Rechner (Kapitel 3) Speicher Zahlen und Logik (Kapitel 2) Kommunikation (Kapitel 8) von-Neumann-Rechner Universität Göttingen - Informatik II - SS 2005
4-55
z.B. Intel Pentium-Familie
Neue Technologien besonders RISC geeignet (z.B. Galliumarsenid)
Universität Göttingen - Informatik II - SS 2005
4-54
5. Betriebssysteme
Überblick
Informatik II
SS 2005
Einführung Prozessverwaltung Speicherverwaltung Ein- und Ausgabe Dateisysteme
Kapitel 5: Betriebssysteme
Dr. Michael Ebner Dipl.-Inf. René Soltwisch Lehrstuhl für Telematik Institut für Informatik Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Literatur (1/2)
Literatur (2/2)
Das Kapitel orientiert sich an
William Stallings: „Betriebssysteme - Prinzipien und Umsetzung“, Prentice Hall (Pearson Studium), 4. überarbeitete Auflage, 2003, ISBN 3-8273-7030-2 (englisch: „Operating Systems: Internals and Design Principles“)
Andere, empfehlenswerte Bücher:
Universität Lübeck (ehemals Universität Braunschweig), Prof. Dr. S. Fischer: http://www.itm.uni-luebeck.de/teaching/ws0405/bks/index.html?lang=de
Universität Karlsruhe, Herr Liefländer:
http://i30www.ira.uka.de/teaching/currentcourses/lecture.php?courseid=91
Daran orientiert sich die Spezialvorlesung Betriebssysteme
A. Silberschatz, P. Galvin, G. Gagne: „Operating System Concepts“, John Wiley & Sons, ISBN 0-471-41743-2
Foliensätze zu Büchern:
A. Tanenbaum: „Moderne Betriebssysteme“, Prentice-Hall (Pearson Studium), ISBN 3-8273-7019-1 (englisch: „Modern Operating Systems“)
Foliensätze (aus denen Folien übernommen wurden):
5-2
Tanenbaum: http://www.cs.vu.nl/~ast/books/mos2/ Stallings: http://www.williamstallings.com/OS4e.html
Für die Genehmigung einen großen Dank an die Autoren! Einführung
Universität Göttingen - Informatik II - SS 2005
5-3
Einführung Universität Göttingen - Informatik II - SS 2005
5-4
5. Betriebssysteme
5. Betriebssysteme
Architektur eines Pentiumsystems
Potentielle Systemkomponenten Task Semantic
Objects
Example Operation
GUI/shell
window
execute shell script
Application
a.out
quit, kill, …
File System
directories, files
open, close, read,
Devices
printer, display
open, write, ...
Communication
ports
send, receive, …
Virtual Memory
segments, pages
write, fetch
Secondary Store
chunks, blocks
allocate, free,
Processes
task queue
exit, create…
Threads
ready queue
wakeup, execute,
Interrupts
interrupt handler
invoke, mask, ...
Einführung Universität Göttingen - Informatik II - SS 2005
5-5
Einführung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Was ist ein Betriebssystem?
Motivation
Silberschatz: „An operating system is similar to a government... Like a government the operating system performs no useful function by its self.“
Wo gibt es Betriebssysteme? Beispiele
DIN 44300: „Die Programme eines digitalen Rechensystems, die zusammen mit den Eigenschaften dieser Rechenanlage die Basis der möglichen Betriebsarten des digitalen Rechensystems bilden und die insbesondere die Abwicklung von Programmen steuern und überwachen.“
Arbeitsplatzrechner, Großrechner Netzwerkgeräte, wie Router, Bridges, Gateways, etc. Auto Flugzeug-Cockpit Waschmaschine Chipkarte Personal Digital Assistants (PDAs) Mobiles Telefon Spielekonsole (wie z.B. Playstation) etc.
Einführung Universität Göttingen - Informatik II - SS 2005
5-6
5-7
Einführung Universität Göttingen - Informatik II - SS 2005
5-8
5. Betriebssysteme
5. Betriebssysteme
Ziele und Randbedingungen
Ziele eines Betriebssystems
Definitionen eines Betriebssystems
Anpassung der Benutzerwelt an die Maschinenwelt Organisation und Koordination des Betriebsablaufs Steuerung und Protokollierung des Betriebsablaufs
Randbedingungen
Definition Betriebssystem als virtuelle Maschine
Effizienter Einsatz von Betriebsmitteln Geringer Rechenaufwand Robustheit Sicherheit
Definition Betriebssystem als Ressourcenverwalter
Ein Betriebssystem ist eine virtuelle Maschine, die dem Anwender eine einfache (dateiorientierte) Schnittstelle zur Hardware zur Verfügung stellt und einem die Programmierung dieser Hardware auf hohem logischen Niveau ermöglicht.
Ein Betriebssystem bezeichnet alle Programme eines Rechensystems, die die Ausführung der Benutzerprogramme, die Verteilung der Ressourcen auf die Benutzerprogramme und die Aufrechterhaltung der Betriebsart steuern und überwachen.
Definition Ressourcen (Betriebsmittel)
Die Ressourcen (Betriebsmittel) eines Betriebssystems sind alle Hardund Softwarekomponenten, die für die Programmausführung relevant sind.
Betriebsmittel: Prozessor, Hauptspeicher, I/O-Geräte, Hintergrundspeicher, etc.
Einführung Universität Göttingen - Informatik II - SS 2005
5-9
5. Betriebssysteme
Bank- Flugsystem Reservierung Editor
5-10
5. Betriebssysteme
Schichten eines Rechnersystems
Compiler
Einführung Universität Göttingen - Informatik II - SS 2005
Spiele
Kommandointerpreter
Zwei Sichten auf ein Betriebssystem Anwendungsprogramme
Anwendersicht: • Top-Down-Sicht • Betriebssystem ist eine
virtuelle Maschine
Systemprogramme
Betriebsystem BS-Entwicklersicht: • Bottom-Up-Sicht • Betriebssystem ist ein
Maschinensprache Mikroprogrammierung
Betriebsmittel(Ressourcen-) Verwalter
Hardware
Physikalische Geräte Einführung Universität Göttingen - Informatik II - SS 2005
5-11
Einführung Universität Göttingen - Informatik II - SS 2005
5-12
5. Betriebssysteme
5. Betriebssysteme
Aufgaben eines Betriebssystems (1/5)
Prozessverwaltung
Aufgaben eines Betriebssystems (2/5)
(Ein Prozess oder auch Task ist ein in Ausführung befindliches Programm) Erzeugen und Löschen von Prozessen Prozessorzuteilung (Scheduling) Prozesskommunikation Synchronisation nebenläufiger Prozesse, die gemeinsame Daten benutzen
Logische Sicht auf Speichereinheiten (Dateien)
Zuteilung des verfügbaren physikalischen Speichers an Prozesse Einbeziehen des Hintergrundspeichers (Platte) durch virtuelle Adressierung, demand Paging, Swapping (= Ein-/Auslagern von Prozessen), etc.
Benutzer arbeitet mit Dateinamen. Wie und wo die Dateien gespeichert werden, ist ihm egal.
Systemaufrufe für Dateioperationen
Speicherverwaltung
Verwaltung des Dateisystems
Erzeugen, Löschen, Öffnen, Lesen, Schreiben, Kopieren, etc.
Strukturierung mittels Verzeichnissen (Directory)
Einführung Universität Göttingen - Informatik II - SS 2005
5-13
Einführung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Aufgaben eines Betriebssystems (3/5)
Aufgaben eines Betriebssystems (4/5)
Verwaltung des Dateisystems (cont.)
5-14
Schutz von Dateien und Verzeichnissen vor unberechtigtem Zugriff
Geräteverwaltung
Unix: 9-Bit für Zugriffsrechte (Read, Write, eXecute) Datei/Verzeichnis gehört einem Eigentümer (user) und einer Benutzergruppe (group, z.B. Mitarbeiter, Projekt, etc.) z.B.
Monitoring, Accounting, Auditing
user rwx
group r--
Dateiname Uebung.txt
Befehl:
others r--
Dateiname Uebung.txt
Aktuelle Auslastung Aktueller freier Speicher Netzverkehr
Optionale Aufgaben
> chmod g+w Uebung.txt führt zu: group rw-
Erstellen & Verwalten von Systemstatistiken
others r--
user rwx
Auswahl und Bereitstellung von I/O-Geräten Anpassung an physikalische Eigenschaften der Geräte Überwachung der Datenübertragung
Laufzeit von Prozessen mitprotokollieren Speicherbedarf von Prozessen mitprotokollieren Eingeloggte Benutzer mitprotokollieren etc.
Einführung
Einführung Universität Göttingen - Informatik II - SS 2005
5-15
Universität Göttingen - Informatik II - SS 2005
5-16
5. Betriebssysteme
5. Betriebssysteme
Aufgaben eines Betriebssystems (5/5)
Strukturen von Betriebssystemen
Weitere wichtige Aspekte:
Fehlertoleranz
Graceful Degradation: Beim Ausfall einzelner Komponenten läuft das System mit vollem Funktionsumfang mit verminderter Leistung weiter. Fehlertoleranz wird durch Redundanz erkauft.
Realzeitbetrieb
Betriebssystem muss den Realzeit-kritischen Prozessen die Betriebsmittel so zuteilen, dass die angeforderten Zeitanforderungen eingehalten werden. Für zeitkritische Systeme: Meßsysteme, Anlagensteuerungen, etc.
Modularisiert in Komponenten und Subsysteme Kern („kernel“) läuft ständig und parallel zu anderen System- und Anwendungsprozessen Systemprogramme werden nur bei Bedarf geladen Dämonen („daemons“) sind Hilfsprozesse, die ständig existieren, aber meist passiv sind.
Warten auf ein Ereignis oder schauen selbst zeitgesteuert nach, ob Arbeit da ist.
Benutzeroberflächen
Betriebssystem muss eine ansprechende Benutzerschnittstelle für die eigene Bedienung enthalten. Betriebssystem muss Funktionen bereitstellen, mit denen aus Anwendungsprogrammen heraus auf die Benutzerschnittstelle zugegriffen werden kann. Einführung
Universität Göttingen - Informatik II - SS 2005
5-17
Einführung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
User und Kernel Mode
Einstiegspunkte in ein Betriebssystem
CPUs laufen in zwei Modi, kernel mode und user mode Benutzermodus (user mode)
Systemaufrufe
Prozessor bearbeitet ein Anwendungsprogramm Befehlssatz und verfügbare Register sind beschränkt Mögliche Beschränkung des Zugriffs auf die Hardware (hardware protection) Direkter Zugriff auf andere in Ausführung befindliche Programme ist verboten niedrigere Priorität
synchron (z.B. Division durch 0) Fehler wird an Applikation weitergeleitet
Hardware Interrupt (Unterbrechung)
Software Interrupt (Unterbrechung)
Prozessor bearbeitet Betriebssystem Alle Befehle und Register sind verfügbar Direkter, uneingeschränkter Zugriff auf die Hardware Manipulation interner Daten laufender Programme möglich höhere Priorität
synchron Parameterübergabe über z.B. Register oder Stack
Hardware Traps
Betriebssystemmodus (kernel mode)
asynchron (z.B. Modem) asynchron
Einführung Universität Göttingen - Informatik II - SS 2005
5-18
5-19
Einführung Universität Göttingen - Informatik II - SS 2005
5-20
5. Betriebssysteme
5. Betriebssysteme
Formen von Betriebssystemen
Architekturen von Betriebssystemen (1/2)
Stapelverarbeitung (batch processing) Dialogverarbeitung (time sharing) Echtzeitverarbeitung (real-time processing) Verteilte Verarbeitung (distributed processing) Eingebettete Betriebssysteme Smart-Card Betriebssysteme ...
Monolithische Systeme
Geschichtete Systeme (oder Hierarchische oder Schalen)
Sammlung von Prozeduren und Funktionen ohne (oder nur mit minimaler) Struktur („The big mess.“, A. Tanenbaum) mehrere Schichten wobei Schicht n+1 auf Schicht n aufbaut und neue Funktionalität bereitstellt Vereinfachte Fehlersuche und Qualitätssicherung Funktionszuweisung zu einer Schicht schwierig Strikte Einhaltung der Schichten und strenge Parameterprüfung erhöht den Overhead an den Schichtübergängen
Virtuelle Maschinen
Abstraktion betrifft nicht nur die Hardware, sondern kann auch höhere Funktionen betreffen. Emulation der Hardware zu so genannten virtuellen Maschinen (VM) Gleichzeitig verschiedene Betriebssysteme auf den VMs z.B. Java Virtual Machine, VMware, VirtualPC, User Mode Linux (UML)
Einführung Universität Göttingen - Informatik II - SS 2005
5-21
5. Betriebssysteme
5-22
5. Betriebssysteme
Architekturen von Betriebssystemen (2/2)
Einführung Universität Göttingen - Informatik II - SS 2005
Allgemeine Schalenstruktur von UNIX bzw. Linux
Minimale Kerne (engl. microkernel)
Kern mit minimalen Betriebssystemfunktionen (Kommunikationsprimitive und elementares multi-programming) um einen großen Hardware-nahen Kern zu vermeiden Minimale Kerne folgen dem Client-Server-Modell in verteilten Systemen Server können im Benutzermodus laufen und in einem Netzwerk verteilt werden (zentralisierte und verteilte Realisierung möglich) Vermehrte Kommunikation führt zu mehr Overhead Trennung von Mechanismen und Strategien
Einführung Universität Göttingen - Informatik II - SS 2005
5-23
Einführung Universität Göttingen - Informatik II - SS 2005
5-24
5. Betriebssysteme
5. Betriebssysteme
Windows Architektur
Standardisierung
Einige relevante Standards
AT&T:
System V Interface Definition (SVID)
1985
OSF: OSF:
Distributed Computing Environment (DCE) Motif 2.0 Graphical User Interface Toolkit
1995 1994
X/OPEN
Portability Guide (XPG-1, ..., XPG-4)
1984
IEEE
Portable Operating System Interface based on UNIX (POSIX)
1989
OpenGroup: Single UNIX Specification Version 2 OpenGroup: Common Desktop Environment (CDE) 1.0
1997 1996
ANSI/ISO: Programmiersprache C (X3.159, ISO/IEC 9899) ANSI/ISO: Programmiersprache C++ (X3J16)
1989 1998
Einführung Universität Göttingen - Informatik II - SS 2005
5-25
Einführung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
POSIX Standards
Ausblick
Standardisierung von Betriebssystemfunktionen mit dem Ziel, die Portabilität von Programmen zu verbessern.
POSIX-Standards werden durch eine Arbeitsgruppe des Institute of Electrical and Electronics Engineers (IEEE) ausgearbeitet und lehnen sich an UNIX an.
POSIX Standards (Stand 1994) POSIX.0 POSIX.1 POSIX.2 POSIX.3 POSIX.4 POSIX.5 POSIX.6 POSIX.7 POSIX.8 POSIX.9 POSIX.10
Guide and overview Library functions Shell and utilities Test methods and conformance Real-time extensions Ada language binding to POSIX.1 Security extensions System administration Transparent file access Fortran 77 binding to POSIX.1 Supercomputing profile
POSIX.11 POSIX.12 POSIX.13 POSIX.14 POSIX.15 POSIX.16 POSIX.17 POSIX.18 POSIX.19 POSIX.20 POSIX.21
Kurzer Blick auf Konzepte zur Realisierung der Aufgaben eines Betriebssystems Einfluss auf Programmierung von Anwenderprogrammen
Transaction processing Protocol independent communication Real-time profiles Multiprocessor profile Batch/supercomputer extensions Language-independent POSIX.1 Directory/name services Basic POSIX system profile Fortran-90 binding to POSIX.4 Ada binding to POSIX.4 Distributed real-time
Die Prozessverwaltung wird daher genauer vorgestellt
Es werden weiterhin Konzepte der folgenden, grundlegenden Teilgebiete kurz betrachtet Speicherverwaltung Ein- und Ausgabe Dateisysteme
Studenten des Studienganges „Angewandte Informatik“ wird der Besuch der Spezialvorlesung dringend empfohlen!
Einführung Universität Göttingen - Informatik II - SS 2005
5-26
5-27
Einführung Universität Göttingen - Informatik II - SS 2005
5-28
5. Betriebssysteme
5. Betriebssysteme
Prozessverwaltung
Prozesse
Prozesse und Threads Prozess-Scheduling Interprozesskommunikation Verklemmungen
Ein Prozess ist der Ablauf eines sequentiellen Programms. Benötigt Betriebsmittel (CPU, Speicher, Dateien, etc.) und ist selbst ein Betriebsmittel. Wird vom Betriebssystem verwaltet (Erzeugung, Terminierung, Scheduling, etc.) Ein Prozessor führt in jeder Zeiteinheit maximal einen Prozess aus. Laufen mehrere Prozesse, dann finden Prozesswechsel statt. Das Betriebssystem entscheidet über die Prozesswechsel.
Wir gehen von einem einfachen Prozessor aus. Prozessoren mit Hyperthreading, etc. können intern wiederum als mehrere, einfache Prozessoren angesehen werden.
Prozesse sind gegeneinander abgeschottet, d.h. jeder besitzt (virtuell) seine eigene Betriebsmittel, wie etwa den Adressraum. Das Betriebssystem sorgt für die Abschottung. Wir gehen von voneinander unabhängigen Prozessen aus. Bei Kooperation ist eine explizite Synchronisation erforderlich.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-29
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Eigenschaften von Prozessen
5-30
Prozesszustände
Programmcode: Folge von Maschinenbefehlen (text section) Interner Zustand: Aktueller Zustand durch Programmzähler und Registerinhalte Stack: Inhalt des Stapelspeichers, wo temporäre Variablen und Parameter für Funktionsaufrufe verwaltet werden Daten: Inhalt des Speichers, in dem die globalen Daten gehalten werden Externer Zustand: Beziehung zu anderen Betriebsmitteln
Typische definierte Prozesszustände und Zustandsübergänge
New
Admit
Assign
Ready
Running
Terminate
Exit
Release Block
Unblock
Blocked
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-31
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-32
5. Betriebssysteme
5. Betriebssysteme
Win-NT’s Prozesszustandsmodell (mit Sieben Zuständen)
Unix Prozesszustandsmodell Lazy versus eager loading
New
Admit
Ready
Preselect
Deblock
Assign
Standby
Release
Running
Terminate
Exit
Block on event i
Blocked Blocked Reinitialize
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-33
5. Betriebssysteme
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-34
5. Betriebssysteme
Mögliche Attribute für einen Prozessleitblock (PCB)
PCB Struktur
Kontext
Scheduling Familie
Zeit
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-35
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-36
5. Betriebssysteme
5. Betriebssysteme
Prozessbäume
Leichtgewichtsprozesse (Threads)
Alle existierenden Prozesse sind in einer Prozesstabelle gespeichert Prozesse können neue Prozesse erzeugen, wodurch eine Hierarchie (Baum) von Prozessen entsteht Cascading termination möglich, falls erzeugte Prozesse nicht ohne erzeugenden Prozess existieren dürfen/sollen Mutterprozess und Kinderprozesse teilen keine/einige/alle Ressourcen
Threads sind parallele Kontrollflüsse, die nicht gegeneinander abgeschottet sind
laufen innerhalb eines Adressraumes, innerhalb eines „echten“ Prozesses teilen sich gemeinsame Ressourcen
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-37
5. Betriebssysteme
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
Threads besitzen eigenen Stack
Thread Beispiel
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-38
5-39
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-40
5. Betriebssysteme
5. Betriebssysteme
Charakterisierung von Threads
Pro Prozess
Vorteile/Nachteile von Threads
Adressraum Globale Variablen Offene Dateien Kinderprozesse Unerledigte Alarme Signal und Signalkontroller Informationen für Systemstatistiken
Pro Thread
Kontextwechsel ist effizienter
Programmzähler Register Stack Zustand
kein Wechsel des Adressraumes kein automatisches Scheduling (Kernelthread bei BS, Benutzerthread bei Anwendung) kein Retten und Restaurieren des kompletten Kontextes (nur Programmzähler und Register)
Pro Zeiteinheit sind viel mehr Threadwechsel als Prozesswechsel möglich -> Leichtgewichtsprozesse Gleichzeitige Aktivitäten können besser modelliert werden, z.B. falls einige Aktivitäten von Zeit zu Zeit blockieren/warten Bessere Performance bei Erzeugung/Zerstörung und bei Mischung mit I/O intensiven Aufgaben (kein Vorteil bei reiner CPU-Nutzung) Nachteile
Schutzfunktionen fallen weg (z.B. getrennte Adressräume) Synchronisation erforderlich
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-41
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Prozessverwaltung
Prozesswechsel
Prozesse und Threads Prozess-Scheduling Interprozesskommunikation Verklemmungen
Mehrere Prozesse teilen sich einen Prozessor, weshalb Prozesswechsel notwendig sind Das Betriebssystem entscheidet über die Prozesswechsel Komponenten des Scheduling
Prozesswechselkosten
Warteschlangenmodelle
Prozesswechsel sind relativ teuer wegen Sicherung des Kontextes Wartende Prozesse werden in internen Warteschlangen gehalten Auswahlstrategie der Warteschlangen haben wesentlichen Einfluss auf Systemverhalten
Scheduling-Verfahren
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-42
5-43
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-44
5. Betriebssysteme
5. Betriebssysteme
Prozess-Scheduling (1/2)
Anforderungen
Prozess-Scheduling (2/2)
Fairness Effizienz Antwortzeit Verweilzeit Durchsatz
Maximierung des Durchsatzes (Jobs/Zeit) Maximierung der einzelnen Laufzeiten Maximierung der CPU-Nutzung
Interaktive Systeme
Realzeit-Systeme
nicht-präemptiv: laufender Prozess wird nicht von außen unterbrochen präemptiv: laufende Prozesse können von außen unterbrochen werden
Fairness Effizienz (Nutzung der Ressourcen) Umsetzung der gewünschten Policy
Batch-Systeme
Erzeugung eines neuen Prozesses Prozess terminiert oder blockiert I/O-Unterbrechungen (Interrupts) Zeitscheibe läuft ab Verfahren:
Alle Systeme
Entscheidungspunkte
Deterministische und probabilistisches Scheduling Verfahren hängt von gewünschten Eigenschaften ab
Minimierung der Antwortzeit Einhalten von Deadlines, Vermeidung von Datenverlusten Vermeidung von Qualitätsverlusten in Multimedia-Systemen Prozessverwaltung
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-45
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Scheduling-Verfahren
First-Come First Served (FCFS) Shortest Job First (SJF) Shortest Remaining Time Next (SRTN)
Prozesse und Threads Prozess-Scheduling Interprozesskommunikation Verklemmungen
Interaktiv:
Prozessverwaltung
Batch:
5-46
Round-Robin Priority Scheduling Shortest Process Next
Echtzeit:
Earliest Deadline First (EDF)
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-47
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-48
5. Betriebssysteme
5. Betriebssysteme
Interprozesskommunikation (IPC)
Kommunikationsformen
Prozesse arbeiten oft nicht allein, sondern müssen Informationen austauschen, um eine gemeinsame Aufgabe zu erfüllen.
Beim diesem Austausch müssen drei wichtige Fragen beantwortet werden:
Gemeinsame Variablen: vor allem in Ein-Prozessor und Multiprozessor-Systemen mit gemeinsamem physikalischen Speicher
Wie werden die Daten ausgetauscht?
Nachrichtenaustausch: vor allem bei verteilten Systemen, also Kommunikation über Rechnergrenzen hinweg Prozess
Über gemeinsame Variablen? Über Nachrichtenaustausch?
Rechner
Prozess
Wie wird sicher gestellt, dass die Prozesse nicht gleichzeitig auf gemeinsame Information zugreifen? Wie wird die richtige Reihenfolge des Zugriffs sicher gestellt (ProducerConsumer-Problem)?
Speicher
Netz
Prozess
Die beiden letzten Fragen beschreiben das Synchronisationsproblem. Prozess
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
Prozessverwaltung
5-49
Sychronisationsproblem
Problemstellung:
Zwei Prozesse besitzen einen gemeinsamen Puffer mit einer festen Länge (bounded buffer). Eine Prozess schreibt Informationen in den Puffer (producer), der andere liest Informationen aus dem Puffer (consumer). Der Erzeuger darf nicht in den vollen Puffer einfügen. Der Verbraucher darf nicht aus dem leeren Puffer lesen.
while (true) { produce(&item); while (count == N) sleep(1); buffer[in] := item; in := (in + 1) % N; count := count + 1; } insert
Puffer
Die Anweisungen count := count + 1 und count := count - 1 werden typischerweise zu den folgenden Maschinenbefehlen: P1: register1 := count P2: register1 := register1+1 := register1 P3: count
Eine fehlerhafte Lösung:
Erzeuger
5-50
5. Betriebssysteme
Erzeuger/Verbraucher-Problem
Rechner
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
Rechner
while (true) { while (count == 0) sleep(1); item = buffer[out]; out := (out + 1) % N; count := count - 1; consume(item); }
C1: register2 := count C2: register2 := register2-1 C3: count := register2
Nehmen wir an, der Wert von count sei 5. Was liefert die Ausführung der Befehle in der Reihenfolge
(a) P1, P2, C1, C2, P3, C3 und die Ausführung in der Reihenfolge (b) P1, P2, C1, C2, C3, P3?
remove Verbraucher Prozessverwaltung
Universität Göttingen - Informatik II - SS 2005
5-51
Universität Göttingen - Informatik II - SS 2005
5-52
5. Betriebssysteme
5. Betriebssysteme
Race Conditions
Kritischer Abschnitt (1/2)
(a) liefert den falschen Wert 4, (b) liefert den falschen Wert 6. Diese Werte sind falsch, da ja ein Element eingefügt und eines entfernt wird, der Wert müsste also bei 5 bleiben. Die angegebene Lösung erzeugt falsche Ergebnisse, die von der Bearbeitungsreihenfolge der Prozesse abhängen. Jede Situation, in der mehrere Prozesse gemeinsame Daten manipulieren, kann zu derartigen Synchronisationsproblemen (race conditions) führen. Synchronisationsverfahren garantieren, dass immer nur ein Prozess zu einem bestimmten Zeitpunkt gemeinsam benutzte Daten manipulieren kann.
Ein kritischer Abschnitt (critical section) eines Programms ist eine Menge von Instruktionen, in der das Ergebnis der Ausführung auf unvorhergesehene Weise variieren kann, wenn Variablen, die auch für andere parallel ablaufende Prozesse oder Threads zugreifbar sind, während der Ausführung verändert werden. Prinzipieller „Lebenszyklus“ eines Prozesses oder Threads:
Prozess wartet auf Erlaubnis
Eingangsabschnitt Kritischer Abschnitt Ausgangsabschnitt
Prozess gibt bekannt, dass er den kritischen Abschnitt verlassen hat
Unkritischer Abschnitt
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-53
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Kritischer Abschnitt (2/2)
Lösungen für die Synchronisation
Das Problem besteht darin, ein „Protokoll“ zu entwerfen, an das sich alle Prozesse oder Threads halten und das die Semantik des kritischen Abschnitts realisiert. Anforderungen an eine Lösung:
5-54
Zwei Prozesse dürfen nicht gleichzeitig in ihrem kritischen Abschnitt sein (safety). Es dürfen keine Annahmen über die Bearbeitungsgeschwindigkeit von Prozessen gemacht werden. Kein Prozess, der außerhalb eines kritischen Bereichs ist, darf andere Prozesse beim Eintritt in den kritischen Abschnitt behindern. Kein Prozess darf ewig auf den Eintritt in den kritischen Abschnitt warten müssen (fairness). Möglichst passives statt aktives Warten, da aktives Warten einerseits Rechenzeit verschwendet und andererseits Blockierungen auftreten können, wenn auf Prozesse/Threads mit niedriger Priorität gewartet werden muss.
Es wurden eine Reihe von Lösungen für die Synchronisation von Prozessen entwickelt, von denen wir die wichtigsten besprechen:
Semaphore Mutexe Monitore
Dies sind Lösungen für die Synchronisation bei Nutzung gemeinsamer Variablen. Bei Nachrichtenkommunikation wird diese Form der Synchronisation nicht benötigt.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-55
Universität Göttingen - Informatik II - SS 2005
5-56
5. Betriebssysteme
5. Betriebssysteme
Semaphore
Eigenschaften von Semaphoren & Mutexe
Ein Semaphor ist eine geschützte Variable, auf die nur die unteilbaren (atomaren) Operationen up (signal, V) und down (wait, P) ausgeführt werden können:
Semaphore
down(s) { s := s - 1; if (s < 0) queue_this_process_and_block(); }
up(s) { s := s + 1; if (s >= 0) wakeup_process_from_queue(); }
Semaphore können zählen und damit z.B. die Nutzung gemeinsamer Betriebsmittel überwachen. Semaphore werden durch spezielle Systemaufrufe implementiert, die die geforderten atomaren Operationen up und down realisieren. Semaphore können in beliebigen Programmiersprachen benutzt werden, da sie letztlich einem Systemaufruf entsprechen. Semaphore realisieren ein passives Warten bis zum Eintritt in den kritischen Abschnitt.
Mutexe
Oft wird die Fähigkeit zu zählen bei Semaphoren nicht benötigt, d.h., es genügt eine einfache binäre Aussage, ob ein kritischer Abschnitt frei ist oder nicht. Dazu kann eine einfacher zu implementierende Variante, der sogenannte Mutex (von „mutual exclusion“), verwendet werden.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-57
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Erzeuger/Verbraucher mit Semaphoren
Implementierung von Semaphoren
Das Erzeuger/Verbraucher Problem lässt sich elegant mit drei Semaphoren lösen: 1. Ein Semaphor zum Betreten der kritischen Abschnitte (mutex). 2. Ein Semaphor, das die freien Plätze im Puffer herunter zählt und den Prozess blockiert, der in einen vollen Puffer schreiben will (empty). 3. Ein Semaphor, das die belegten Plätze im Puffer herauf zählt und den Prozeß blockiert, der von einem leeren Puffer lesen will (full). while (true) { produce(&item); down(&empty); down(&mutex); add(&item); up(&mutex); up(&full); }
5-58
semaphore mutex = 1, empty = N, full = 0;
Universität Göttingen - Informatik II - SS 2005
while (true) { down(&full); down(&mutex); remove(&item); up(&mutex); up(&empty); consume(item); } Prozessverwaltung 5-59
Semaphore lassen sich als Systemaufrufe implementieren, wobei kurzzeitig sämtliche Unterbrechungen unterbunden werden. Da zur Implementation nur wenige Maschinenbefehle benötigt werden, ist diese Möglichkeit akzeptabel. Auf Mehrprozessor-Systemen muss ein Semaphor mit einer unteilbaren Prozessor-Operation implementiert werden, die das Semaphor vor gleichzeitigen Änderungen in anderen Prozessoren schützt. Beispiel: Test-And-Set-Lock (TSL): beim Ausführen der Operation wird der Memory-Bus für alle anderen Operationen gesperrt
Universität Göttingen - Informatik II - SS 2005
5-60
5. Betriebssysteme
5. Betriebssysteme
Probleme bei Semaphoren
Programmierfehler bei der Benutzung eines Semaphors können zu Verklemmungen oder inkorrekten Ergebnissen führen. Typische Fehler:
Monitore
Sprünge aus kritischen Bereichen, ohne das mutex-Semaphor freizugeben. Sprünge in kritische Bereiche, ohne das mutex Semaphor zu setzen. Vertauschungen von Semaphoren zum Schutz von kritischen Abschnitten und Semaphoren, die vorhandene Betriebsmittel zählen.
Alles in allem sind Semaphore eine „low-level“-Lösung, die erhebliche Disziplin vom Programmierer verlangt. Eine komfortablere Lösung bieten Monitore.
...
Universität Göttingen - Informatik II - SS 2005
5-61
5. Betriebssysteme
monitor ProducerConsumer condition full, empty integer count; procedure enter if count = N then wait(full); enter_item() count := count + 1; if count = 1 then signal(empty); end;
wait(c): Der aufrufende Prozess blockiert, bis ein signal() auf der Bedingungsvariablen c ausgeführt wird. Ein anderer Prozess darf den Monitor betreten. signal(c): Ein auf die Bedingungsvariable c wartender Prozeß wird aufgeweckt. Der aktuelle Prozess muss den Monitor sofort verlassen.
Der durch signal() aufgeweckte Prozess wird zum aktiven Prozess im Monitor, während der Prozess, der signal() ausgeführt hat, blockiert. Bedingungsvariablen sind keine Zähler. Ein signal(c) auf einer Variablen c ohne ein wait(c) geht einfach verloren.
procedure remove if count = 0 then wait(empty); remove_item(); count := count - 1; if count = N-1 then signal(full); end; count := 0; end monitor;
5-63
procedure producer while (true) do begin produce_item; ProducerConsumer.enter; end end;
procedure consumer while (true) do begin ProducerConsumer.remove; consume_item; end end; Prozessverwaltung
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-62
Erzeuger/Verbraucher-Problem mit einem Monitor
Bedingungsvariablen (condition variables) eines Monitors mit den zugehörigen Operationen wait() und signal() erlauben es, im Monitor auf andere Prozesse zu warten:
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
Bedingungsvariablen eines Monitors
Ein Monitor ist eine Sammlung von Schematischer Aufbau eines Monitors: Prozeduren, Variablen und Datenstrukturen, die in einem Modul gekapselt sind. Prozesse können die Prozeduren des Monitors aufrufen, aber keine EingangsGemeinsame internen Daten ändern. warteschlange Daten Monitore besitzen die Eigenschaft, dass immer nur genau ein Prozess im Monitor aktiv sein kann. Monitore sind Konstrukte einer Programmiersprache und erfordern daher spezielle Compiler. Es ist die Aufgabe des Compilers, Operationen Maschinenbefehle zu generieren, die den wechselseitigen Ausschluss Initialisierung im Monitor garantieren.
Universität Göttingen - Informatik II - SS 2005
5-64
5. Betriebssysteme
5. Betriebssysteme
Kritische Abschnitte mit Compilerunterstützung in Java
In Java können kritische Abschnitte als Anweisungsfolge geschrieben werden, denen das Schlüsselwort synchronized voran gestellt wird. Die kritischen Abschnitte schließen sich bzgl. des Sperrobjekts gegenseitig aus.
Synchronisation in Windows
class Buffer { private const int size = 8; private int count = 0, out = 0, in = 0; private int[] pool = new int[size]; public synchronized void insert(int i) { pool[in] = i; in = (in + 1) % size; count++; }
Verfügbare Mechanismen
Semaphoren Mutexe Kritische Sektionen Ereignisse
Synchronisation findet auf Thread-Ebene statt (andere Threads in einem Prozess sind nicht betroffen)
public sychronized int remove() { int res = pool[out]; out = (out + 1) % size; count--; return res; } public synchronized int cardinal() { return count; } }
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-65
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Interprozesskommunikation in Windows
Prozessverwaltung
Es stehen verschiedene Mechanismen zur Verfügung:
Pipes, Named Pipes (Kommunikation auf einem Rechner) Mailslots (ähnlich Pipes, mit leicht anderen Eigenschaften) Sockets (Kommunikation zwischen Rechnern) Remote Procedure Calls Shared Files
Prozesse und Threads Prozess-Scheduling Interprozesskommunikation Verklemmungen
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-66
5-67
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-68
5. Betriebssysteme
5. Betriebssysteme
Verklemmungen/Deadlocks
Deadlock – Illustration/Beispiel
Prozesse benötigen Betriebsmittel, meist sogar mehrere
Drucker Festplatte Speicher (z.B. in internen BS-Tabellen)
Was passiert wenn sich zwei Prozesse jeweils ein Betriebsmittel reservieren, das der andere auch benötigt?
Definition: Eine Menge von Prozessen befindet sich in einer Verklemmung (deadlock), wenn jeder Prozess der Menge auf ein Ereignis wartet, dass nur ein anderer Prozess aus der Menge auslösen kann.
(a) Ein potenzieller deadlock. (b) Ein tatsächlicher deadlock.
Diese Situation wird als Deadlock bezeichnet Thread 1
1. Aufruf von x 2. Aufruf von p
Thread 2 class A
synchronized void x( ) {... } synchronized void y( ) {...
}
4.Aufruf von g durch x blockiert 3. Aufruf von y durch p blockiert class B synchronized void p( ) { ...} synchronized void g( ) {
...}
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-69
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Ressourcen und deren Nutzung
Notwendige Bedingungen für eine Verklemmung 1.
Zwei Typen von Ressourcen
Wechselseitiger Ausschluss (mutual exclusion):
preemptable: vorzeitige Rückgabe möglich (z.B. Speicher) non-preemptable: vorzeitige Rückgabe ist NICHT möglich (z.B. DVD, Drucker)
2.
Zuweisung, Nutzen
3.
Es gibt einen Prozess, der ein Betriebsmittel belegt und auf ein anderes Betriebsmittel wartet, das von einem anderen Prozess belegt wird.
Keine Verdrängung (no preemption):
4.
Ein Betriebsmittel ist entweder genau einem Prozess zugeordnet oder es ist verfügbar.
Wartebedingung (hold and wait):
von BS oder selbst verwaltet Beispiel für Selbstverwaltung: gemeinsame Variablen Bei der Selbstverwaltung sind Deadlocks am häufigsten
Einem Prozess kann ein Betriebsmittel nicht entzogen werden.
Zirkuläres Warten (circular wait):
Es gibt eine Menge {P1, P2,..., Pn} von Prozessen, so dass P1 auf ein Betriebsmittel wartet das P2 belegt, P2 wartet auf ein Betriebsmittel das P3 belegt, ..., und Pn wartet auf ein Betriebsmittel das P1 belegt.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-70
5-71
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-72
5. Betriebssysteme
5. Betriebssysteme
Betriebsmittel-Zuweisungsgraph
Ein Betriebsmittel-Zuweisungsgraph ist ein gerichteter Graph, der zur Beschreibung von Verklemmungen verwendet wird:
Beispiel R1
Der Graph besteht aus einer Menge von Prozessen P={P1, P2,..., Pn}, einer Menge von Betriebsmitteln R={R1, R2,..., Rm} und gerichteten Kanten. Eine gerichtete Kante von einem Prozess Pi zu einem Betriebsmittel Rj beschreibt, dass der Prozess Pi ein Exemplar der Betriebsmittels Rj angefordert hat (request edge). Eine gerichtete Kante von einem Betriebsmittel Rj zu einem Prozess Pi beschreibt, dass ein Exemplar des Betriebsmittels Rj dem Prozess Pi zugewiesen ist (assignement edge).
R3
P1
R2
P2
P3
R4
Ein Zyklus im Graph bedeutet das Vorhandensein einer Verklemmung.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-73
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
Behandlung von Deadlocks
Enthält ein Betriebsmittel-Zuweisungsgraph keine Zyklen, dann existiert auch keine Verklemmung. Besitzt ein Betriebsmittel-Zuweisungsgraph einen Zyklus und existiert von jedem beteiligten Betriebsmittel nur genau ein Exemplar, dann existiert eine Verklemmung. Besitzt ein Betriebsmittel-Zuweisungsgraph einen Zyklus und von den beteiligten Betriebsmitteln existieren mehrere Exemplare, so ist eine Verklemmung möglich, aber nicht unbedingt auch eingetreten.
R1
P1
5-74
5. Betriebssysteme
Eigenschaften von Zuweisungsgraphen
P1 hat R1angefordert; R1 ist jedoch schon P2 zugeordnet. P2 wartet auf R3, die aber schon P3 zugewiesen ist. P3 wartet auf R2. R2 ist zweimal vorhanden, aber beide Instanzen sind bereits P1 bzw. P2 zugewiesen. Î Verklemmung
P2 P3 P4
R2
Der Zyklus P1, R1, P3, R2, P1 beschreibt keine Verklemmung, da Prozess P4 beendet werden kann, womit ein Exemplar von R2 wieder verfügbar wird.
Dem Deadlock-Problem kann mit einer von vier Strategien begegnet werden: 1.
Ignorieren: meist keine gute Idee ...
2.
Deadlock-Entdeckung und –Auflösung: lasse Deadlocks passieren und behandle sie dann
3.
Deadlock-Vermeidung durch vorsichtige dynamische RessourcenAllokation
4.
Strukturelle Deadlock-Verhinderung durch das Negieren einer der vier notwendigen Bedingungen
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-75
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-76
5. Betriebssysteme
5. Betriebssysteme
Verhinderung von Verklemmungen (1/4)
1.
Verhinderung von Verklemmungen (2/4)
Wird eine der vier notwendigen Bedingungen für das Entstehen von Verklemmungen negiert, so können keine Verklemmungen mehr entstehen. Verhinderung von wechselseitigem Ausschluss:
2.
Verhinderung der Wartebedingung:
Auf alle Betriebsmittel kann von mehreren Prozessen aus gleichzeitig zugegriffen werden. Beispiel: Drucker Anstatt einen Drucker Prozessen exklusiv zuzuordnen, werden Druckausgaben in Dateien abgelegt und in eine Warteschlange eingefügt. Ein spezieller Prozess (printer daemon) erhält exklusiven Zugriff auf den Drucker und arbeitet die Warteschlange ab. Dieser Prozess fordert selbst keine weiteren Betriebsmittel an. Problem: Nicht alle Betriebsmittel (z.B. Speicher, Einträge in der Prozesstabelle) können zwischen Prozessen geteilt werden. Im Beispiel kann der Plattenplatz zur Ablage von Druckausgaben selbst als Betriebsmittel betrachtet werden, das Auslöser für eine Verklemmung ist.
Jeder Prozess darf nur dann Betriebsmittel anfordern, wenn er selbst keine anderen Betriebsmittel belegt. Alternative 1:
Alternative 2:
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-77
Verhinderung von Verklemmungen (4/4)
Entzug von zugewiesenen Betriebsmitteln:
Beispielsweise können einem Prozess, der bereits auf ein Betriebsmittel wartet, seine bereits belegten Betriebsmittel entzogen werden, um Betriebsmittelanforderungen anderer Prozesse befriedigen zu können. Die entzogenen Betriebsmittel werden zu der Liste der Betriebsmittel hinzugefügt, auf die der Prozess wartet. Normalerweise besitzen die zugewiesenen Betriebsmittel einen Zustand, der beim Entzug gesichert und später wieder restauriert werden muss. Nicht jedes Betriebsmittel (z.B. Drucker) erlaubt es, den Zustand zu sichern und später wieder zu restaurieren.
Verwendung:
Verhinderung von zirkulärem Warten:
Probleme:
4.
Bereits belegte Betriebsmittel können einem Prozess entzogen werden. Beispiel:
5-78
5. Betriebssysteme
Verhinderung von Verklemmungen (3/4)
Ein Prozess muss alle Betriebsmittel abgeben, bevor er weitere anfordern kann. Problem: Es ist einem Prozess nicht immer möglich, alle Betriebsmittel freizugeben, bevor er weitere Betriebsmittel belegt (z.B. der Eintrag in der Prozesstabelle). Außerdem kann diese Methode dazu führen, dass die Bearbeitung eines Prozesses unendlich verzögert wird, da ein benötigtes Betriebsmittel immer von einem anderen Prozess belegt ist (starvatíon). Prozessverwaltung
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
3.
Jeder Prozess fordert sämtliche Betriebsmittel an, bevor seine Bearbeitung beginnt. Problem: Geringe Effizienz, da alle Betriebsmittel eines Prozesses während seiner Ausführung belegt sind. Die meisten Prozesse kennen ihre Betriebsmittelanforderungen nicht, bevor sie starten.
Es wird eine totale Ordnung auf den vorhandenen Betriebsmitteln definiert. Ein neues Betriebsmittel darf nur dann angefordert werden, wenn das Betriebsmittel bezüglich der Ordnung größer ist als alle bereits belegten Betriebsmittel eines Prozesses. Mehrere Exemplare eines Betriebsmittels müssen in einer Anfrage angefordert werden. Probleme:
Es ist schwierig, eine totale Ordnung für Betriebsmittel zu definieren, die allen Einsatzmöglichkeiten eines Betriebssystems gerecht wird. Benötigt ein Prozess ein Betriebsmittel mit geringerer Ordnung, so müssen zunächst sämtliche Betriebsmittel freigegeben werden.
Das Verfahren findet häufig Anwendung bei Betriebsmitteln, deren Zustand leicht gesichert werden kann, wie z.B. CPU-Registerinhalte oder Hauptspeicherbereiche. Prozessverwaltung
Universität Göttingen - Informatik II - SS 2005
5-79
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-80
5. Betriebssysteme
5. Betriebssysteme
Vermeidung von Verklemmungen
Ansatz:
Anhand von zusätzlichen Informationen werden nur die Betriebsmittelanforderungen gewährt, die nicht zu einer Verklemmung führen können. Im Vergleich zur Verhinderung werden Betriebsmittel effizienter genutzt und der Systemdurchsatz erhöht. Annahme: Die maximale Anforderung von Betriebsmitteln ist a-priori bekannt.
Erkennungsverfahren (detection algorithm):
Unsichere Zustände:
Es existiert die Möglichkeit einer Verklemmung.
Im Fall einer Verklemmung ergreift das Betriebssystem Maßnahmen, um die Verklemmung aufzulösen.
Notwendige Randbedingungen:
Ein System ist in einem sicheren Zustand, wenn es jedem Prozess seine maximale Betriebsmittelanforderung gewähren kann, ohne dass das System in eine Verklemmung geraten kann.
Das Betriebssystem überprüft periodisch, ob eine Verklemmung vorliegt.
Behebungsverfahren (recovery algorithm):
Sichere Zustände:
Deadlock-Entdeckung und Beseitigung
Die notwendigen Informationen über belegte und angeforderte Betriebsmittel muss einfach zugänglich sein. Der Aufwand zur Entdeckung von Verklemmungen muss vertretbar sein. (Man beachte, dass während der Ausführung des Erkennungsverfahrens keine Betriebsmittel angefordert oder freigegeben werden dürfen.) Die Kosten zur Behebung von Verklemmungen müssen vertretbar sein.
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-81
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Erkennung von Verklemmungen (1/2)
5-82
Erkennung von Verklemmungen (2/2)
Es existiert nicht mehr als ein Exemplar von jedem Betriebsmittel:
Aus dem Betriebsmittel-Zuweisungsgraphen wird ein Wartegraph (wait-for graph) konstruiert, wobei alle Knoten, die Betriebsmittel repräsentieren, entfernt werden.
Eine Kante vom Prozess Pi zum Prozess Pj existiert im Wartegraph genau dann, wenn der Betriebsmittel-Zuweisungsgraph zwei Kanten Pi Rq und Rq Pj besitzt.
Eine Verklemmung existiert genau dann, wenn ein Zyklus im Wartegraph existiert.
Es existieren mehrere Exemplare von jedem Betriebsmittel:
Verklemmungen lassen sich erkennen, indem man versucht, eine Abarbeitungsfolge der Prozesse P1,..., Pn zu finden, so dass alle bekannten Betriebsmittelanforderungen erfüllt werden können. Dafür kann z.B. der Bankers-Algorithmus verwendet werden.
P5 R1
R3
R4
P1
P2
P3
R2
P4
R5
P5
P1
P2
P3
P4 Prozessverwaltung
Universität Göttingen - Informatik II - SS 2005
5-83
Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-84
5. Betriebssysteme
5. Betriebssysteme
Beseitigung von Verklemmungen
Speicherverwaltung
Zwangsweise Beendigung von Prozessen (process termination):
Einfach zu implementieren und sehr effektiv.
Auswahl der zu beendenden Prozesse schwierig.
Zwangsweise Beendigung von Prozessen kann Inkonsistenzen erzeugen.
Bereits verbrauchte Rechenzeit ist normalerweise verloren.
Zwangsweiser Entzug von Betriebsmitteln (resource preemption):
Einführung Swapping Virtual Memory Seitenersetzungsstrategien Segmentierung
Betriebsmittel werden zwangsweise einem Prozess entzogen, um damit die Verklemmung aufzuheben.
Auswahl des Prozesses, dem Betriebsmittel entzogen werden, ist schwierig.
Nicht jedes Betriebsmittel (z.B. Prozesstabelleneintrag) kann entzogen werden.
Rücksetzen von Prozessen (rollback of processes):
In speziellen Fällen können Prozesse auf einen vorher gesicherten Zustand (checkpoint) zurückgesetzt werden.
Insbesondere Datenbank-Prozesse verwalten häufig ein Logbuch über durchgeführte Transaktionen, so dass ein Prozess ohne Datenverlust gerade soweit zurückgesetzt werden kann, wie zur Behebung der Verklemmung notwendig. Prozessverwaltung Universität Göttingen - Informatik II - SS 2005
5-85
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Einführung
Speicher und dessen Verwaltung
Verschiedene Arten von Speichern, hierarchisch organisiert:
Cache-Speicher Hauptspeicher Sekundärspeicher Archiv-Speicher
Betriebssystemteil verantwortlich für Speichermanagement: Memory Manager Aufgaben
Eigenschaften des Hauptspeichers:
5-86
Buchhaltung: welche Speicherbereiche werden benutzt, welche sind frei Speichervergabe und -rücknahme an/von Prozessen Datenverschiebung zwischen den Speicherhierarchien
Der Hauptspeicher besteht aus einer Menge von Wörtern oder Bytes, die jeweils über eine eigene Adresse verfügen. Sowohl die CPU als auch E/A-Geräte greifen auf den Hauptspeicher zu. Ausführbare Programme befinden sich zumindest teilweise im Hauptspeicher. Die CPU kann normalerweise nur auf Daten im Hauptspeicher direkt zugreifen
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-87
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-88
5. Betriebssysteme
5. Betriebssysteme
Grundlegende Speicherverwaltung
Speichermanagement: grundsätzlich zwei Klassen:
Abbildungen von Speicheradressen
Verschieben von Prozessen vom Hauptspeicher auf Festplatte und zurück (Swapping, Paging) Oder nicht (einfache Variante)
Ein Compiler/Assembler übersetzt symbolische Adressen (Namen von Variablen und Funktionen) in absolute oder relative Speicheradressen. Quelltext
Bei Verzicht auf Swapping und Paging:
Monoprogramming:
symbolische Namen
immer nur ein Prozess sowie das OS im Speicher Einsatzgebiet: frühe Batchsysteme, eingebettete Systeme
Multiprogramming mit festen Partitionen
Compiler
Speicher wird in feste Blöcke eingeteilt, Programme bekommen einen Speicherbereich zugewiesen Einsatz im OS/360 von IBM Oft wurde die Größe der Partitionen einmal am Tag festgesetzt
Objektmodul absolute/relative Adressen
Ein Linker bindet mehrere Objektmodule mit relativen Adressen und die benötigten Bibliotheken zu einem ausführbaren Programm (executable). Objektmodule
Linker
relative Adressen
Executable statisch/dynamisch gebunden
Bibliotheken statisch/dynamisch
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-89
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Präzisierung der Aufgaben
Moderne Speicherverwaltung
Bereitstellung und Zuweisung des Speicherplatzes an die Prozesse (allocation). Einrichtung und Koordination von Speicherbereichen, die von mehreren Prozessen gemeinsam benutzt werden können (shared memory). Schutz der Informationen im Hauptspeicher vor fehlerhaften oder unbefugten Zugriffen. Abbildung von logischen Adressen auf physikalische Adressen (address translation).
Heutige Computer haben andere Anforderungen an die Verwaltung des Speichers Insbesondere
Zwei wichtige Lösungen:
logische Adresse
346
Laufen meist viele Prozesse Haben die Prozesse oft mehr Speicherbedarf als physikalischer Speicher vorhanden ist Swapping: Verschieben von Prozessen zwischen Hauptspeicher und Platte Virtual Memory: Prozesse sind nur zum Teil im Hauptspeicher
Hauptspeicher
relocation register Prozessor
5-90
Speicheradresse
14000 MMU
14346
(memory management unit)
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-91
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-92
5. Betriebssysteme
5. Betriebssysteme
Speicherverwaltung
Prinzip des Swapping
Einführung Swapping Virtual Memory Seitenersetzungsstrategien Segmentierung
Der komplette Adressraum eines Prozesses wird beim Prozesswechsel auf den Hintergrundspeicher ausgelagert und ein anderer Adressraum eingelagert. Ist im Betriebssystem ohne weitere Hardware-Unterstützung zu realisieren. Extrem aufwändige Prozesswechsel, da die Zugriffszeiten auf den Hintergrundspeicher im allgemeinen um Größenordnungen langsamer sind als Zugriffe auf den Hauptspeicher. Betriebssystem Wurde von MS Windows 3.* benutzt, um Prozesse auszulagern. Wird bei UNIX-Systemen benutzt, swap out P1 um bei einer Überbelegung des BenutzerP2 swap in programmHauptspeichers einigen Prozessen bereich das Betriebsmittel Hauptspeicher Hintergrundspeicher zwangsweise zu entziehen. Hauptspeicher
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-93
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Speichersegmente und Fragmentierung
5-94
Kompaktifizierung
Der Hauptspeicher wird vom Betriebssystem in Segmente variabler Länge eingeteilt, die den Prozessen zugewiesen werden. Zur Verwaltung dienen Segmenttabellen. Segmente können verschiedene Zugriffsrechte besitzen, zwischen Prozessen geteilt werden, oder bei Bedarf wachsen. Durch das Entfernen und Einfügen von Segmenten entstehen langristig kleine unbenutzte Speicherbereiche (externe Fragmentierung). Beispiel:
Durch das Verschieben von Segmenten im Speicher können viele kleine Löcher zu einem großen Stück freien Speichers zusammengefügt werden (Kompaktifizierung, compaction). Kompaktifizierung setzt voraus, dass die Adressen dynamisch abgebildet werden. 0K 0K 0K 0K Die Suche BetriebsBetriebsBetriebsBetriebssystem system system system nach einer 300K 300K 300K 300K optimalen P1 P1 P1 P1 500K 500K 500K Kompaktifizie- 500K P2 P2 P2 P2 600K 600K 600K rungsstrategie 600K P3 400K 800K ist schwierig. P4 Kompaktif. 1000K 1000K 1000K P4 900K P3 P3 benötigt viel 1200K 1200K 1200K CPU-Zeit. 300K 1500K
1500K
P4
900K
P4
900K
1900K
1900K 200K
2100K
Ausgangssituation
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-95
2100K
600K verschoben
2100K
400K verschoben
2100K
P3
200K verschoben
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-96
5. Betriebssysteme
5. Betriebssysteme
Speicherbuchhaltung
Positionierungsstrategien
Wie merkt sich der Memory Manager, welche Speicherbereiche frei bzw. belegt sind? Zwei Lösungen: Bitmaps oder verkettete Listen Beispiel: Jedes Bit identifiziert einen kleinen Speicherbereich, daher feste Größe. Listen vereinfachen die dynamische Verwaltung. Wichtige Frage: Wie finde ich das passende Segment, wenn ein neuer Prozess Speicher anfordert?
best fit: Auswahl des kleinsten Loches, das das Segment aufnehmen kann. Diese Strategie lässt einerseits große Löcher lange bestehen, während sie andererseits eine Vielzahl kleiner und nutzloser Überreste erzeugt. worst fit: Auswahl des jeweils größten Loches. Dieses Verfahren tendiert dazu, alle Löcher auf etwa die gleiche Länge zu bringen, die dann aber eventuell zu klein zur Aufnahme eines bestimmten Segments sein kann. first fit: Auswahl des ersten hinreichend großen Loches. Dieses Verfahren liegt in seinem Verhalten zwischen den beiden anderen und ist sehr effizient. next fit: Dieses Verfahren ist eine Variation von first fit. Um zu verhindern, dass sich Löcher einer bestimmten Größe an einer Stelle des Speichers häufen, beginnt jede Suche am Ende der vorherigen Suche. Der Speicher wird also ringförmig durchsucht. buddy system: Die Löcher werden in k Listen so einsortiert, dass die i-te Liste jeweils Löcher der Länge größer gleich 2i für i=1,...,k enthält. Dabei können zwei benachbarte Löcher der i-ten Liste effizient zu einem Loch der i+1-ten Liste zusammengefügt werden. Umgekehrt kann ein Loch der i-ten Liste einfach in zwei Löcher der i-1-ten Liste aufgeteilt werden.
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-97
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Speicherverwaltung
5-98
Virtual Memory
Einführung Swapping Virtual Memory Seitenersetzungsstrategien Segmentierung
Idee (Fotheringham, 1961): ist ein Programm größer als der zur Verfügung stehende Hauptspeicher, dann halte immer nur die aktuell notwendigen Teile im Speicher; lade andere Teile bei Bedarf nach Wichtige Fragen:
Welche Teile sind notwendig? Welche Teile behalte ich tunlichst im Speicher? Æ Lade- und Ersetzungsstrategien
Zweistufiges Adressensystem: virtuelle Adressen, die die Programme benutzen, werden von der Memory Management Unit in physikalische Adressen umgewandelt und dann erst an den Speicher gegeben Wichtigste Technik: Paging
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-99
Universität Göttingen - Informatik II - SS 2005
5-100
5. Betriebssysteme
5. Betriebssysteme
Paging
Page Tables
Der physikalische Speicher wird in Kacheln (frames) fester Größe eingeteilt. Der logische Adressraum wird in Seiten (pages) gleicher Größe eingeteilt. Logische Adressen werden in eine Seitennummer (page number) und eine seitenrelative Adresse (page offset) aufgeteilt. Eine Umsetzungstabelle (page table) bildet die Seiten auf die verfügbaren Kacheln ab. Die Seiten eines Adressraums können beliebig auf die verfügbaren Kacheln verteilt sein.
In der Seitentabelle gibt der Index die Nummer der virtuellen Seite an; der Tabelleneintrag gibt dann die zugehörige physikalische Seite an. Beispiel: 16 mögliche virtuelle Seiten werden auf 8 vorhandene physikalische Kacheln abgebildet. Ein spezielles Bit gibt an, ob die virtuelle Seite vorhanden ist.
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-101
5. Betriebssysteme
Behandlung von Seitenfehlern
Keine externe Fragmentierung. Allerdings wird die letzte Seite eines logischen Adressraums normalerweise nicht vollständig genutzt (interne Fragmentierung). Gemeinsamer Speicher lässt sich mit Hilfe von gemeinsamen Seiten realisieren. Speicherschutz wird durch Schutzbits realisiert. Weitere Bits geben an, ob eine Kachel gültig ist (valid) oder ob eine Kachel modifiziert wurde (modified). Es muss nicht der gesamte Adressraum eines Prozesses im Speicher sein, um ihn auszuführen. Zugriffe auf gerade nicht geladene Seiten lösen einen Seitenfehler (page fault) aus. Das Betriebssystem behandelt Seitenfehler, indem es die benötigte Seite in eine freie Kachel einlagert und den Befehl, der den Seitenfehler auslöste, neu startet. Realisierungsprobleme:
Die Adressabbildung muss sehr schnell sein. (In manchen Fällen sind mehrere Umsetzungen für einen Maschinenbefehl notwendig.)
Die Umsetzungstabelle kann extrem groß werden. (32-Bit Adressen erfordern bei einer Seitengröße von 4096 Bytes eine Tabelle mit ca. 1 Million Einträgen.) Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-102
5. Betriebssysteme
Eigenschaften des Paging
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-103
1. Die Hardware erkennt den Seitenfehler und erzeugt eine Unterbrechung. 2. Das Betriebssystem sichert die Register des Prozesses. 3. Die Prozedur zur Behandlung von Seitenfehlern ermittelt die Adresse der fehlenden Seite. 4. Das Betriebssystem prüft, ob auf die Adresse überhaupt zugegriffen werden darf. 5. Das Betriebssystem wählt eine freie Kachel aus. Falls keine freie Kachel existiert, wird eine belegte Kachel ausgewählt. 6. Falls die ausgewählte Kachel belegt ist und modifiziert wurde, wird sie auf dem Hintergrundspeicher gesichert. Ein Prozesswechsel findet statt, sofern rechenbereite Prozesse existieren. 7. Sobald eine freie Kachel da ist, wird eine E/A-Operation gestartet, um die benötigte Kachel vom Hintergrundspeicher zu laden. Ein Prozesswechsel findet statt, sofern rechenbereite Prozesse existieren. 8. Sobald die Kachel geladen ist, wird die Umsetzungstabelle aktualisiert. 9. Der Befehlszähler wird auf den Befehl zurückgesetzt, der den Seitenfehler auslöste. 10. Der Prozess wird in den Zustand ready gesetzt und in die CPUWarteschlange eingereiht. Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-104
5. Betriebssysteme
5. Betriebssysteme
Speicherverwaltung
Ladestrategien Die Ladestrategie bestimmt, wann Seiten in den Hauptspeicher geladen werden:
Einführung Swapping Virtual Memory Seitenersetzungsstrategien Segmentierung
Swapping: Übertragung eines ganzen Adressraums mit einem einzigen Zugriff auf den Hintergrundspeicher. Demand-Paging: Die benötigten Seiten werden genau dann in den Speicher geladen, wenn auf sie zugegriffen wird. Pre-Paging: Es werden Seiten geladen, auf die in der Zukunft ein Zugriff erwartet wird. Erfordert Kenntnisse über typische Zugriffsmuster. Page-Clustering: Gemeinsame Übertragung von mehreren zusammengehörigen Seiten. Ermöglicht die Nutzung großer Seiten auf Hardware, die nur geringe Seitengrößen unterstützt.
In der Praxis dominiert Demand-Paging, obwohl dies bei Transportkosten, die nicht monoton mit der Anzahl der transportierten Seiten wachsen, nicht unbedingt optimal ist.
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-105
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Ersetzungsstrategien
Lokalitätsprinzip
Die Ersetzungsstrategie (replacement algorithm) bestimmt, welche der belegten Kacheln ausgelagert werden, damit wieder freie Kacheln zur Einlagerung von benötigten Seiten vorhanden sind. Lokale Strategien weisen jedem Prozess eine konstante Anzahl von Seiten zu. Seitenfehler wirken sich daher nur auf den verursachenden Prozess negativ aus. Bei globalen Strategien wird der gesamte Speicher dynamisch auf alle Prozesse verteilt, um eine effiziente Nutzung des Hauptspeichers zu erreichen.
Lokalität bezeichnet das Verhalten eines Programms, innerhalb einer bestimmten Zeit seine Speicherzugriffe auf einen kleinen Teil seines Adressraums zu beschränken. Das Lokalitätsprinzip gilt für Seitenzugriffsverhalten mit folgenden Eigenschaften:
Zu jeder Zeit verteilt ein Programm seine Speicherzugriffe in nicht gleichförmiger Weise über seine Seiten. Die Korrelation zwischen den Zugriffsmustern für unmittelbare Vergangenheit und unmittelbare Zukunft ist im Mittel hoch, und die Korrelation zwischen sich nicht überlappenden Referenzstrings geht mit wachsendem Abstand zwischen ihnen gegen 0. Die Referenzdichten der einzelnen Seiten, d.h. die Wahrscheinlichkeit mit der eine Seite zum Zeitpunkt t zum Referenzstring gehört, ändern sich nur langsam, d.h. sie sind quasi stationär.
Praktische Gründe für die Gültigkeit des Lokalitätsprinzips sind Schleifen und Modulbereiche von Programmen. Allerdings ist Lokalität bei manchen Programmen oder Algorithmen nicht unbedingt gegeben (z.B. Datenbanken oder einige Verfahren zur Manipulation sehr großer Matrizen).
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-106
5-107
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-108
5. Betriebssysteme
5. Betriebssysteme
Ersetzungsstrategien
Beladys Optimalalgorithmus (BO)
Es wird die Seite ersetzt, auf die in der Zukunft am längsten nicht zugegriffen wird (Realisierbarkeit??).
Intuitiv erwartet man, dass sich Seitenfehler reduzieren, wenn man den verfügbaren Hauptspeicher vergrößert.
ABER: folgendes Beispiel: Referenzstring w = 1 2 3 4 1 2 5 1 2 3 4 5 und FIFO Ersetzungsstrategie:
Least Recently Used (LRU)
Es wird die Seite ersetzt, auf die am längsten nicht mehr zugegriffen wurde.
Least Frequently Used (LFU)
First In First Out (FIFO)
Second Chance (SC)
;
Beladys Anomalie
Es wird die Seite ersetzt, auf die am wenigsten zugegriffen wurde. Es wird die Seite ersetzt, die bereits am längsten im Speicher steht. Es wird wie beim FIFO ersetzt. Allerdings werden Seiten übersprungen, auf die seit dem letzten Seitenfehler zugegriffen wurde, sofern es Seiten gibt, auf die nicht zugegriffen wurde.
Zusätzlich wird oftmals betrachtet, ob die Seite modifiziert wurde oder nicht, da eine unmodifizierte Seite nicht auf dem Hintergrundspeicher gesichert werden muss.
Jüngste Seite Älteste Seite
1 2 3 4 1 2 5 5 5 3 4 4 1 2 3 4 1 2 2 2 5 3 3 1 2 3 4 1 1 1 2 5 5 Speichergröße m=3 (9 Seitenfehler)
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-109
4 3 2 1
5 4 3 2
1 5 4 3
2 1 5 4
3 2 1 5
4 3 2 1
5 4 3 2
Speichergröße m=4 (10 Seitenfehler)
5-110
5. Betriebssysteme
Speicherverwaltung
4 3 2 1
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
1 2 3 4 1 2 3 1 2 1
Segmentierung
Einführung Swapping Virtual Memory Seitenersetzungsstrategien Segmentierung
Bisher: eindimensionaler Adressraum, in dem alle Tabellen, Programmtext etc. in ein- und demselben Adressraum abgelegt werden. Problem: was passiert, wenn die Tabellen nach dem Anlegen und der fortschreitenden Übersetzung eines Programms zu groß werden und in einen anderen Bereich „hineinwachsen? Alle „Lösungen“ mit einem Adressraum erfordern Modifikationen am Compiler, die man vermeiden möchte.
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-111
Universität Göttingen - Informatik II - SS 2005
5-112
5. Betriebssysteme
5. Betriebssysteme
Segmentierung
Vergleich Paging - Segmentierung
Andere Idee: stelle jedem Programm mehrere virtuelle Adressräume zur Verfügung, die es für die jeweiligen Daten verwenden kann Æ Segmentierung des virtuellen Adressraums
Eine Adresse besteht dann aus Segment-Nummer und Adresse. Vorteile der Segmentierung
Segmente können wachsen, Management durch das BS Linken wird wegen der jeweiligen Startadresse 0 stark vereinfacht Shared Libraries können leicht realisiert werden (Schutz!) Speicherverwaltung
Universität Göttingen - Informatik II - SS 2005
5-113
5. Betriebssysteme
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
Kombination von Segmentierung und Paging
Shared Libraries
Segmentierung und Paging kann gleichzeitig eingesetzt werden, um die Vorteile beider Ansätze zu kombinieren.
Zum Beispiel wird es sinnvoll sein, Segmente aufzuteilen, wenn sie nicht komplett in den Hauptspeicher passen.
Moderne Prozessorfamilien unterstützen meist beide Modelle, um für beliebige Betriebssysteme offen zu sein.
Ein Pentium besitzt insgesamt 16 K Segmente, wobei jedes bis zu 109 32-Bit-Worte speichern kann. Diese Segmentgröße ist relativ groß.
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-114
5-115
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-116
5. Betriebssysteme
5. Betriebssysteme
Speicherverwaltung in Windows
Ein- und Ausgabe
Windows besitzt ein sehr anspruchsvolles virtuelles Speichersystem. Jeder Benutzerprozess hat 4 GB virtuellen Speicher verfügbar (32Bit-Adressen). Seitengröße für Paging: 4 KB Shared files (shared libraries) können verwendet werden
Grundlagen von Ein-/Ausgabe-Hardware und –Software I/O-Software-Schichten
Speicherverwaltung Universität Göttingen - Informatik II - SS 2005
5-117
Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
I/O-Hardware – Grundlagen
Device Controller
Wir betrachten I/O-Hardware wie Hard Disks, Bildschirme, Drucker etc. hier eigentlich als Blackbox, die wir irgendwie programmieren müssen. Trotzdem: kurzer Überblick über den Aufbau solcher Geräte Hauptthema: wie bekomme ich Daten von und zu den Geräten
Device Controller Memory Mapped I/O Interrupts
I/O–Geräte haben zwei Komponenten:
mechanisch elektronisch
Die elektronische Komponente ist der Device Controller (Gerätesteuerung) Aufgaben
Konvertiere seriellen Bitstrom in Datenblöcke Führe Fehlerkorrektur durch wenn notwendig Mache die Daten dem Hauptspeicher verfügbar
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-118
5-119
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-120
5. Betriebssysteme
5. Betriebssysteme
Memory-Mapped I/O
Wie kommuniziert die CPU/das OS mit dem Device Controller?
Direct Memory Access (DMA)
Jeder Controller hat einige Steuerungsregister, in die die CPU Befehle schreiben kann Zusätzlich haben viele Geräte einen Datenpuffer, der vom OS geschrieben/gelesen werden kann (Beispiel: Videospeicher für Bildschirmpixel)
I/O kann mittels DMA deutlich beschleunigt werden, da die CPU weniger belastet ist Prinzip: vergib einen Auftrag an DMA-Controller, erledige bis zum Ende der Bearbeitung andere Dinge Ablauf eines DMA-Transfers:
Ansätze:
Spezieller Speicher, spezielle Instruktionen zum Zugriff (I/O-Ports) Memory-Mapped: ein Teil des Hauptspeichers wird für die Kommunikation mit dem Gerät reserviert
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-121
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Interrupts
I/O-Software – Grundlagen
Interrupts werden von Geräten verwendet, um das Ende eines Vorgangs anzuzeigen. Ablauf:
I/O-Software soll vor allem die Komplexität der Hardware vor dem OS bzw. dem Anwendungsprogrammierer verbergen. Wichtige Prinzipien daher:
5-122
Geräteunabhängigkeit: ein „write“ funktioniert auf Disk genauso wie auf das Netzwerk Einheitliche Namensverwendung (alle Geräte sind bspw. über Pfade im Dateisystem erreichbar) Fehlerbehandlung so nah wie möglich an der Quelle (Hardware)
Die CPU wird unterbrochen und beginnt etwas Neues – abhängig vom auslösenden Gerät wird ein bestimmter Interrupt-Handler aufgerufen und ausgeführt. Später macht die CPU an der „alten“ Stelle weiter. Ein- und Ausgabe
Universität Göttingen - Informatik II - SS 2005
5-123
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-124
5. Betriebssysteme
5. Betriebssysteme
Schichten der I/O-Software
Interrupt Handler
Typische Organisation: 4 Schichten
Interrupts sind kompliziert und sollten deshalb möglichst weit unten verborgen werden. Beste Variante: der Device Driver startet einen Auftrag und blockiert dann, bis er vom Interrupt Handler wieder „geweckt“ wird. Handling von Interrupts benötigt meist auch größere Beteiligung der CPU, vor allem wenn Virtual Memory eingesetzt wird (Modifikation von Seitentabellen)
Jede Schicht führt eine wohldefinierte Funktion aus und besitzt genauso ein wohldefiniertes Interface Ein- und Ausgabe
Universität Göttingen - Informatik II - SS 2005
5-125
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Device Driver
Geräteunabhängige I/O-Software
Aufgabe: Verbergen der Komplexität der Registerbelegungen des Controllers Jedes Gerät benötigt üblicherweise seinen eigenen Device Driver Driver sind praktisch immer Teil des Kernels API für die darüber liegende Schicht: read- und writeAnfragen
Wichtige Aufgaben:
Bereitstellen einheitlicher Schnittstellen für Gerätetreiber erleichtert den Einsatz neuer Geräte Puffern von verfügbaren Daten erhöht die Performance (kein Interrupt pro ankommendes Datum, sondern pro Block); Problem: zu langes Liegen von Daten im Puffer, zu viele Kopien zwischen Speicherbereichen (Kernel, User Space, Gerät) Æ schlechte Performance Geräteunabhängige Fehlerbehandlung Spezielle Behandlung dedizierter Geräte (CD-ROM) z.B. durch explizites „open“ Bereitstellung einer einheitlichen Blockgröße
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-126
5-127
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-128
5. Betriebssysteme
5. Betriebssysteme
Beispiel: einheitliche Schnittstellen
Buffering als Performance-Fresser
Muss für jedes neue Gerät wieder neu programmiert werden
Häufiges Kopieren kostet Zeit!
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-129
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
I/O-Software im User Space
Dateisysteme
Im wesentlichen Bibliotheken, die mit den Anwendungsprogrammen gelinkt werden Beispiele:
5-130
Einführung Verzeichnisse Unix-Dateisystem
write, read, open, close printf()
Zum Teil einfach nur Abbildung auf die entsprechenden Systemaufrufe, zum Teil aber auch Aufgaben wie Formatierung der Daten (printf)
Ein- und Ausgabe Universität Göttingen - Informatik II - SS 2005
5-131
Universität Göttingen - Informatik II - SS 2005
5-132
5. Betriebssysteme
5. Betriebssysteme
Einführung
Einführung: Dateiformate
Dateien sind Behälter für dauerhaft gespeicherte Informationen (Daten und Programme). Im einfachsten Fall enthalten Dateien eine nicht weiter strukturierte Folge von Bytes. Applikationen interpretieren in der Regel den Inhalt von unstrukturierten Dateien als ein bestimmtes Dateiformat (oftmals über Namenskonventionen identifiziert):
Unterschiedliche Dateiformen besitzen unterschiedliche Formate Beispiel:
Textdateien (.txt), Quelltexte (.c, .h, .cc, .java, ...), Objektdateien (.o, .obj, ...)
(a) Executable (b) Archiv
Dateisysteme Universität Göttingen - Informatik II - SS 2005
5-133
Dateisysteme Universität Göttingen - Informatik II - SS 2005
5. Betriebssysteme
5. Betriebssysteme
Dateiattribute
Operationen auf Dateien (POSIX)
Neben einem Namen und den Daten besitzt eine Datei zusätzlich Attribute. Attribute geben wichtige Informationen über die Datei:
Grundlegende Dateioperationen:
Öffnen einer Datei: int open(const char *filename, int flags, mode_t mode) int creat(const char *path, mode_t mode)
Schließen einer geöffneten Datei:
Lesen/Schreiben von Daten aus/in eine geöffnete Datei:
int close(int fd) ssize_t read(int fd, void *buffer, size_t len) ssize_t write(int fd, const void *buffer, size_t len)
Länge Erstellungsdatum Besitzer Schutz ...
Positionieren in einer göffneten Datei:
Verkürzen einer geöffneten Datei:
off_t lseek(int fd, off_t offset, int whence) int ftruncate(int fd, off_t size)
Dateideskriptoren (file descriptors) identifizieren innerhalb eines Benutzerprozesses eine geöffnete Datei.
Dateisysteme Universität Göttingen - Informatik II - SS 2005
5-134
5-135
Dateisysteme Universität Göttingen - Informatik II - SS 2005
5-136
5. Betriebssysteme
5. Betriebssysteme
Verzeichnisse
Beispiel: das Unix V7 Dateisystem
Hierarchische Strukturierung des externen Speichers
Verzeichnisse erzeugen einen hierarchischen Namensraum. Daten befinden sich in den Dateien an den „Blättern“ der Hierarchie. Namen von Dateien und Verzeichnissen auf einer Hierarchiestufe eindeutig. Absolute Namen durch Aneinanderreihung der Verzeichnisnamen und des Dateinamen.
Beispiel: UNIX Dateibaum
bin
ls
cp
etc
mv
dev
tty
fd hda1
home
lib
bin
usr
etc
Das System ist in Baumform angeordnet, mit einem rootVerzeichnis. Datei- und Verzeichnisnamen können jeden ASCII-Buchstaben enthalten außer „/“ und NUL. Ein Verzeichniseintrag enthält einen Eintrag für jede Datei in diesem Verzeichnis. Verwendet wird das iNode-Schema. Ein iNode enthält für jede Datei die Attribute sowie die Adressen der Datei auf der Platte.
var
lib
Dateisysteme Universität Göttingen - Informatik II - SS 2005
5-137
5. Betriebssysteme
5-138
5. Betriebssysteme
Ausblick
iNodes in UNIX V7
Dateisysteme Universität Göttingen - Informatik II - SS 2005
Compilerbau (Kapitel 7) Automaten und Sprachen (Kapitel 6)
Für kleine Dateien reicht ein iNode. Wenn die Dateien größer werden, müssen Indirektionen auf weitere iNodes verwendet werden
Maschinenorientierte Programmierung (Kapitel 4)
Single indirect block Double indirect block Triple indirect block
von-Neumann-Rechner (Kapitel 3)
Betriebssysteme (Kapitel 5)
Speicher Zahlen und Logik (Kapitel 2) Kommunikation (Kapitel 8) von-Neumann-Rechner Dateisysteme Universität Göttingen - Informatik II - SS 2005
5-139
Universität Göttingen - Informatik II - SS 2005
5-140
6. Automaten und Sprachen
Überblick Wiederholung von Informatik I Begriffe/Einordnung
Regulär (Typ 3)
Informatik II
Reguläre Sprachen und Ausdrücke Endlicher Automat
SS 2005
Kontextfrei (Typ 2) Kontextfreie Sprachen und Grammatiken Kellerautomat
Kapitel 6: Automaten und Sprachen
Dr. Michael Ebner Dipl.-Inf. René Soltwisch Lehrstuhl für Telematik Institut für Informatik Universität Göttingen - Informatik II - SS 2005
6. Automaten und Sprachen
6-2
6. Automaten und Sprachen
Wiederholung von Informatik I
Überblick
Bedeutung und Zusammenhang
Wiederholung von Informatik I
Wort und Alphabet Sprache Ausdruck Grammatik Automat
Begriffe/Einordnung
Regulär (Typ 3) Reguläre Sprachen und Ausdrücke Endlicher Automat
Kontextfrei (Typ 2)
Chomsky-Hierarchie Syntax Semantik Pragmatik Erweiterte Backus-Naur-Form (EBNF)
Kontextfreie Sprachen und Grammatiken Kellerautomat
Sie ist eine formale Metasyntax (Metasprache), die benutzt wird, um kontextfreie Grammatiken darzustellen. Die EBNF ist von der ISO standardisiert unter der Nummer ISO/IEC 14977:1996(E).
Universität Göttingen - Informatik II - SS 2005
6-3
Universität Göttingen - Informatik II - SS 2005
6-4
6. Automaten und Sprachen
6. Automaten und Sprachen
Reguläre Ausdrücke (1/2)
Reguläre Ausdrücke (2/2)
Werden mit folgenden Ausdrücken rekursiv ausgedrückt:
Zeichenfolgen
Ein Zeichen c aus dem Alphabet Σ, oder der leeren Zeichenfolge ε, oder der Verkettung zweier regulärer Ausdrücke, r1 . r2, oder der Alternative zweier regulärer Ausdrücke, r1 | r2, oder der Kleenesche Hülle * (ode einfach Hülle oder Stern), r1*.
r=‘c1c2c3...cn‘ = c1.c2.c3.....cn
Zeichenbereiche r=[c1-cn] = c1|c2|c3|...|cn Kleenesche Hülle + r+ = r.r*
Ein regulärer Ausdruck ist gedacht um Zeichenketten aus Zeichen aus einem Alphabet Σ zu erzeugen Die Menge aller durch einen regulären Ausdruck R erzeugte Zeichenketten wird die Sprache von R genannt und wird symbolisiert durch L(R)
Universität Göttingen - Informatik II - SS 2005
6-5
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6. Automaten und Sprachen
Abkürzungen von regulären Ausdrücken
Beispiele für Reguläre Ausdrücke (1/2)
Zeichenfolgen r=‘c1c2c3...cn‘ ist äquivalent zu r=c1.c2.c3.....cn
Reguläre Ausdrücke
Erzeugt…
‘if’|’then’|’else’
Die Zeichenketten if, then, or else.
a.(a|b|c)*.a
Alle Zeichenketten mit a’s, b’s und c’s, welche mit einem a beginnen und enden.
a.(a|b|c)*.(b|c).a
Alle Zeichenketten mit a’s, b’s, und c’s, welche mit einem a beginnen und einem einzelnen a enden.
(a|b|c)*.a.b.a.(a|b|c)*
Alle Zeichenketten mit a’s, b’s und c’s, welche die Teilzeichenkette aba enthalten.
(b|c)*.a.(b|c)*.a.(b|c)*.a.(b|c)*
Alle Zeichenketten mit a’s, b’s und c’s, welche exakt drei a’s beinhalten.
Zeichenbereiche r=[c1-cn] ist äquivalent zu r=c1|c2|c3|...|cn für die aufeinander folgende Reihe von n Zeichen beginnend mit c1 und endend mit cn z.B. r=[a-d] ist äquivalent zu r=a|b|c|d
Kleenesche Hülle + r+ ist ein oder mehrere Vorkommen des Wertes von r Formal definiert als r+ = r.r*
Das Symbol . steht für jeden Charakter außer „newline“ Runde Klammern können zum Gruppieren von regulären Ausdrücken verwendet werden, um Zweideutigkeiten bei Kombinationen auszuschließen z.B. bedeutet r1.r2|r3 nun (r1.r2)|r3 oder r1.(r2|r3)??? Universität Göttingen - Informatik II - SS 2005
6-6
6-7
Universität Göttingen - Informatik II - SS 2005
6-8
6. Automaten und Sprachen
6. Automaten und Sprachen
Beispiele für Reguläre Ausdrücke (2/2)
Textmuster mit regulären Ausdrücken erkennen
In UNIX sind u.a. folgende RAs gebräuchlich: . (Punkt) [0-9] [a-z] [A-Za-z] ? + (Road|Rd\.)
[0-9]+[A-Z]? [A-Z][a-z]*( [A-Z][a-z]*)* (Street|St\.|Road|Rd\.)
ein beliebiges Zeichen die Menge Ziffern die Menge der Kleinbuchstaben die Menge aller Klein- und Großbuchstaben "null oder ein Vorkommen von " "ein oder mehr Vorkommen von " findet "Road" oder "Rd.„
Universität Göttingen - Informatik II - SS 2005
findet amerikanische Adressen nach dem Muster "123Z Arlington Road"
Welcher reguläre Ausdruck findet internationale Telefonnummern (in der Form "+LK-(0)Ort-Nr") in einem Text? \+[1-9]([0-9][0-9]?)? -\(0\)[1-9][0-9][0-9]?[1-9]? -[1-9][0-9][0-9][0-9]?[0-9]?[0-9]?
6-9
6. Automaten und Sprachen
6-10
6. Automaten und Sprachen
Überblick
Definition: Endlicher Automat
Wiederholung von Informatik I
Formal, ein endlicher Automat M ist ein Quintupel M=(Q,Σ,q0,F,δ), wobei
Begriffe/Einordnung
Q ist eine endliche Menge von Symbolen genannt Zustände (states) Σ ist eine endliche Menge von Eingabesymbolen genannt Alphabet q0 ist der Startzustand F ist eine endliche Menge von finalen oder akzeptierenden Zuständen. F ist eine, möglicherweise leere, Teilmenge von Q. δ ist eine Übergangsfunktion
Regulär (Typ 3) Reguläre Sprachen und Ausdrücke Endlicher Automat
Kontextfrei (Typ 2) Kontextfreie Sprachen und Grammatiken Kellerautomat
Universität Göttingen - Informatik II - SS 2005
Universität Göttingen - Informatik II - SS 2005
Ein endlicher Automat ist geeignet um Zeichenketten aus Zeichen aus dem Alphabet Σ zu akzeptieren L(M), oder die Sprache von M, ist die Menge von endlichen Zeichenketten von Symbolen aus dem Alphabet Σ welche vom Automaten M akzeptiert werden
6-11
Universität Göttingen - Informatik II - SS 2005
6-12
6. Automaten und Sprachen
6. Automaten und Sprachen
Zwei Arten von endlichen Automaten: Deterministisch und Nichtdeterministisch
Beispiel: Deterministischer Endlicher Automate
Deterministische endliche Automaten (DEA/DFA) δ:Q x Σ -> Q
Ein Eingabesymbol und ein Zustand ergeben den einzigen nächsten Zustand Übergangsfunktionen können als eine Tabelle oder Zustandsübergangsdiagramm geschrieben werden
Nichtdeterministische endliche Automaten (NEA/NFA) Übergänge sind nichtdeterministisch und die Übergangsfunktion ist formal definiert als δ:Q x Σ -> φQ (Potenzmenge von Q)
6-13
6. Automaten und Sprachen
q2
a,b
a
q4
q1
Abgesehen von den Übergangsfunktionen sind DEAs und NEAs gleich
b q3 q2 q5 q5 q5
b a
Zustandsübergangsdiagramm
a q2 q4 q4 q5 q5
q1 q2 q3 q4 q5
{((q1,a),q2),((q1,b),q3), ((q2,a),q4),((q2,b),q2), ((q3,a),q4),((q3,b),q5), ((q4,a),q5),((q4,b),q5), ((q5,a),q5),((q5,b),q5)}
Ein Eingabesymbol und ein Zustand ergeben eine Menge von möglichen nächsten Zuständen. Die Menge kann auch leer sein. Das Alphabet ist erweitert um Übergänge der leeren Zeichenkette є zu erlauben
Universität Göttingen - Informatik II - SS 2005
Tabelle
Beispiel DFA Q={q1,q2,q3,q4,q5} Σ={a,b} q0=q1 F={q4} δ=
Übergänge sind deterministisch und die Übergangsfunktion ist formal definiert als
b
a,b
q5
a
q3
b Universität Göttingen - Informatik II - SS 2005
6-14
6. Automaten und Sprachen
Beispiel: Nichtdeterministischer Endlicher Automaten Beispiel NFA Q={q1,q2,q3,q4,q5} Σ={a,b,є} q0=q1 F={q4} δ=
Ein Beispiel eines deterministischen Automaten (DEA)
Tabelle
{ ((q1,є),{q2,q3}), ((q2,a),{q5}),((q2,b),{q2,q4}), ((q3,a),{q4}),((q3,b),{q5}), ((q4,a),{q5}),((q4,b),{q5}), ((q5,a),{q5}),((q5,b),{q5}) }
q1 q2 q3 q4 q5
є
q2
q4 q3
{((q1,a),q2),((q1,b),q3), ((q2,a),q4),((q2,b),q2), ((q3,a),q4),((q3,b),q5), ((q4,a),q5),((q4,b),q5), ((q5,a),q5),((q5,b),q5)}
b a
q2
q1
q4 b
Eingabe:
a,b
a
q3
a,b
q5
a b
abba a Nicht akzeptiert!
a,b
b
q1 є
b {q5} {q2,q4} {q5} {q5} {q5}
a
b
Zustandsübergangsdiagramm Universität Göttingen - Informatik II - SS 2005
a {q5} {q5} {q4} {q5} {q5}
є {q2,q3} {q5} {q5} {q5} {q5}
Q={q1,q2,q3,q4,q5} Σ={a,b} q=q1 F={q4} δ=
a,b
Welche Sprache akzeptiert M?
q5
(ab*a)|ba
a b
6-15
Universität Göttingen - Informatik II - SS 2005
6-16
6. Automaten und Sprachen
6. Automaten und Sprachen
Ein Beispiel eines nichtdeterministischen Automaten (NFA) Q={q1,q2,q3,q4,q5} Σ={a,b} q=q1 F={q4} δ= {((q1,a),{q2,q3}),((q1,b),{q3}), ((q2,a),{q4}),((q2,b),{q2}), ((q3,a),{q4}),((q3,b),{q5}), ((q4,a),{q5}),((q4,b),{q5}), ((q5,a),{q5}),((q5,b),{q5})}
Eine interessante Sache über endliche Automaten Auch wenn es so aussieht als ob Nichtdeterminismus einem endlichen Automaten mehr Ausdruckskraft verleiht, sind NFAs und DFAs formal äquivalent
b a
q2
q1 a,b
Eingabe:
a,b
a
q4 q3
a,b
Jeder NFA kann in einen DFA umgewandelt werden und ungekehrt
q5
Warum machen wir dann aber die Unterscheidung?
a
Es ist einfacher reguläre Ausdrücke in NFAs umzuwandeln Es ist einfacher DFAs zu simulieren (bzw. zu implementieren)
b
abba a Nicht akzeptiert!
Welche Sprache akzeptiert M? (ab*a)|ba Gleiche wie zuvor beim DFA… Universität Göttingen - Informatik II - SS 2005
6-17
6. Automaten und Sprachen
Eine Nebenbemerkung zu endlichen Automaten
Neu
Endliche Automaten sind auch für andere Dinge als lexikalische Analyse nützlich
Ausgabefunktion Ausgabealphabet
Die meisten Systeme, welche Transaktionen zwischen einer endlichen Anzahl von Zuständen vornehmen, können mit endlichen Automaten modelliert werden Beispiele
Moore-Automaten Die Ausgabefunktion ist formal definiert als φ:Q -> ΣA
Zu einem Zustand wird ein Zeichen ausgegeben
Beschreibung, Simulation, Überprüfung und Implementierung von Protokollen (Mealy-Automaten) Bauen von schnellen, zustandsbasierten Schaltungen (Moore-Automaten),siehe Kapitel 2
Mealy-Automaten Die Ausgabefunktion ist formal definiert als ΣA
Zu einem Ausgangszustand und einer Eingabe wird ein Zeichen ausgegeben Universität Göttingen - Informatik II - SS 2005
6-18
6. Automaten und Sprachen
Automaten mit Ausgabefunktionen
φ:Q x ΣE
Universität Göttingen - Informatik II - SS 2005
6-19
Universität Göttingen - Informatik II - SS 2005
MESI cache coherence protocol (Courtesy: John Morris, University of Western Australia)
Vending machine automata 25¢ 25 ¢
0¢
75¢
25 ¢ 50 ¢
25 ¢
50 ¢ 25 ¢
vend
25 ¢
50¢
50 ¢ 50 ¢
6-20
6. Automaten und Sprachen
6. Automaten und Sprachen
Reguläre Ausdrücke nach NFA
Beispiel: Reguläre Ausdrücke nach NFA
Regulärer Ausdruck
c
Charakter: c
є Alternative: r1|r2
є r1
Verkettung: r1.r2 є Kleenesche Hülle: r*
r1 r2 є
r1:
r1=a.b r2=c.d r3=r1|r2 r=r3*
є
Leere Zeichenkette: є
a
r=(‘ab’|’cd’)* Faktor:
NFA
є є
c r2:
r
є
r2
є
є є
Universität Göttingen - Informatik II - SS 2005
є
r:
6-21
є є
a
є
b
c
є
d
a
є
b
c
є
d
a
є
b
c
є
d
є є є
6. Automaten und Sprachen
NFAs nach DFAs (1/2)
NFAs nach DFAs (2/2)
є
є
Universität Göttingen - Informatik II - SS 2005
6. Automaten und Sprachen
6-22
Schritt 1: Der Startzustand
Definition: є-FZ(s) ist die Menge aller Zustände, welche in s beinhaltet sind, plus aller von den Zuständen in s erreichbaren Zustände unter ausschließlicher Verwendung des є Überganges
b
NFA
q2
є
Gegeben NFA M=(Q,Σ,q,F,δ) und DFA MD=(QD,Σ,qD,FD,δD) QD=P(Q), z.B., QD ist die Menge aller Untermengen von Q FD = {S:∀S ∈QD wobei S∩F ≠ {} } qD= є-FZ (q) δD({q1,q2,…,qk},a) = є-FZ(δ(q1,a)∪ δ(q2,a)∪… ∪(δ(qk,a))
a,b
b
q4 є
q3
qD= є-FZ({q1}) = {q1,q2,q3}
a
q1
a,b
Schritt 2: Zustand {q1,q2,q3} δD({q1,q2,q3},a) =
q5
є-FZ(δ(q1,a)∪δ(q2,a)∪δ(q3,a)) = є-FZ({q5}∪{q5}∪ {q4}) = {q4,q5}
a b a,b
DFA a
{q4,q5}
a,b
{q5}
a
{q1,q2,q3}
є-FZ(δ(q1,b)∪δ(q2,b)∪δ(q3,b)) = є-FZ({q2,q4}∪{q2,q4}∪ {q5}) = {q2,q4,q5}
… {q2,q4,q5}
6-23
δD({q1,q2,q3},b) =
Schritt 3: Zustand {q4,q5}
b
Universität Göttingen - Informatik II - SS 2005
d
r3:
є є
b
b
Universität Göttingen - Informatik II - SS 2005
Schritt 4: Zustand {q2,q4,q5} … 6-24
6. Automaten und Sprachen
6. Automaten und Sprachen
NFA nach DFA Zusammenfassung
Einige Bemerkungen zu DFAs
Regulärer Ausdruck Konvertiere NFA nach DFA є unter Verwendung der є q3 Konstruktion von є q1 q2 Untermengen є q7 Beschrifte jeden DFA Zustand als die vom vorherigen Zustand in einem Schritt erreichbare DFA Menge von Zuständen a Wenn irgendein NFA Zustand in der Menge der {q1,q2,q3, erreichbaren Zustände ein q7,q12} Endzustand ist, dann ist der c ganze DFA Zustand ein Endzustand
Universität Göttingen - Informatik II - SS 2005
Ein DFA M gebaut unter Verwendung der Konstruktion von Untermengen kann nicht minimal sein
NFA
r=(‘ab’|’cd’)*
a c
q4 q8
є є
q5 q9
b d
q6 q10
є q11
є
є
{q8,q9}
Minimale DFAs sind besser geeignet für Implementierungszwecke
Die meisten automatischen Werkzeuge zum Konvertieren von NFAs nach DFAs führen einen Optimierungsprozess aus um die Anzahl der DFA Zustände zu reduzieren
b {q2,q3,q6, q7,q11,q12} c
Das Finden eines minimalen DFAs ist ein sehr hartes Problem (auch NP-vollständig bezeichnet), weshalb Optimierer keinen minimalen DFA garantieren können Praktisch gesehen ist das Ok, obwohl weniger Zustände immer besser ist ☺
a d {q2,q3,q7, q10,q11,q12} c 6-25
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6-26
6. Automaten und Sprachen
Minimierung von DEAs
Pumping Lemma für reguläre Sprachen (1/2)
siehe Tafelanschrieb
Universität Göttingen - Informatik II - SS 2005
q12
Weniger Zustände benötigen weniger Speicher und führen generell zu schnelleren Simulationen
a {q4,q5}
Mit anderen Worten, es könnte einen Automaten M‘ geben wobei L(M)=L(M‘) und M‘ hat weniger Zustände als M
Das Pumping Lemma ist eine Methode, um heraus zu finden, ob eine Sprache nicht regulär.
6-27
Universität Göttingen - Informatik II - SS 2005
6-28
6. Automaten und Sprachen
6. Automaten und Sprachen
Pumping Lemma für reguläre Sprachen (2)
Beweis
Satz: Sei L eine reguläre Sprache. Dann gibt es eine Zahl (Konstante) n, derart dass alle Wörter (Zeichenreihen) w in L mit |w | ≥ n gilt, dass wir w in drei Wörter w = xyz zerlegen können, für die gilt:
Jede Zeichenreihe, deren Länge nicht kleiner ist als die Anzahl der Zustände, muss bewirken, dass ein Zustand zweimal durchlaufen wird (Schubfachschluss).
|y | ≥ 1 (oder y ≠ ε) |xy | ≤ n, Für alle k ≥ 0 gilt, dass die Zeichenreihe xy kz auch in L enthalten ist.
Anhand des Pumping Lemmas kann bewiesen werden, ob eine Sprache NICHT regulär ist. D.h., trifft das Pumping Lemma nicht zu, dann ist die Sprache auch nicht regulär. Der Umkehrschluss gilt aber nicht! Es gibt Sprachen die das Pumping Lemma zwar erfüllen, aber trotzdem nicht regulär sind.
Das Pumping-Lemma liefert lediglich eine notwendige Bedingung dafür, dass eine Sprache regulär ist. Universität Göttingen - Informatik II - SS 2005
6-29
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6-30
6. Automaten und Sprachen
Beispiele
Pumping Lemma für reguläre Sprachen Wenn ein genügend langes Wort einer regulären Sprache "gepumpt" wird, erhält man immer wieder ein Wort dieser Sprache. Zum "Pumpen" wird ein Teilwort y aus w durch yy ersetzt.
Sind diese Sprachen (nicht) regulär? w = anbn w= ab|c
Die Anwendung des Pumping Lemmas ist ein kreativer Vorgang, da es kein „mechanisches“ Vorgehen für den Einsatz gibt.
w w' w ''
= xyz = xyyz = xyyyz
Ursprungswort einmal "gepumpt" zweimal "gepumpt"
vergleiche Ableitungsregeln aus der Mathematik (Analysís)
Universität Göttingen - Informatik II - SS 2005
6-31
Universität Göttingen - Informatik II - SS 2005
6-32
6. Automaten und Sprachen
6. Automaten und Sprachen
Theoretische Ergebnisse (1/3)
Beispiel: Palindrome
Definitionen Eine Sprache L bestehe aus allen Palindromen über das Alphabet {a ,b } Wenn Palindrome ∈ L, dann muss w = anban ebenfalls ∈ L sein. w = anban = xyz mit y ≠ ε und |xy | ≤ n ⇒ xy bestehen nur aus a's ⇒ y besteht aus mindestens einem a "gepumpt": w = xy2z = amban mit m > n ⇒ amban ∉ L, da amban kein Palindrom ist!
Universität Göttingen - Informatik II - SS 2005
6-33
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6-34
6. Automaten und Sprachen
Theoretische Ergebnisse (2/3)
Theoretische Ergebnisse (3/3) Definitionen
LR ist eine Untermenge von LN Nichtdeterministische endliche Automaten akzeptieren alle von regulären Ausdrücken erzeugten Sprachen Warum? Wir haben gezeigt wie beliebige reguläre Ausdrücke zu einem NFA konvertiert werden können
Beschreiben LR und LN die gleichen Mengen? Es stellt sich heraus, dass die Antwort ja ist Beweis durch zeigen das LN eine Untermenge von LR ist oder das jeder nichtdeterministische endliche Automat in einen regulären Ausdruck umgewandelt werden kann Siehe jedes gute theoretische Informatik Buch für Details: Introduction to Automata Theory, Languages, and Computation by Hopcroft and Ullman Introduction to the Theory of Computation by Michael Sipser
Universität Göttingen - Informatik II - SS 2005
Endliche Automaten akzeptieren oder erkennen Sprachen Reguläre Ausdrücke erzeugen Sprachen L(M) ist die akzeptierte Sprache vom endlichen Automaten M L(R) ist die erzeugte Sprache vom regulären Ausdruck R L(R) and L(M) sind Mengen von endlichen Zeichenketten von Symbolen der Alphabete ΣR und ΣM LR ist die Menge { L(r):alle reguläre Ausdrücke r } LN ist die Menge { L(n):alle nichtdeterministische endliche Automaten n }
6-35
Erinnerung, LN ist die Menge { L(n):alle nichtdeterministische endliche Automaten n } LD ist die Menge { L(d): alle deterministischen endlichen Automaten d }
LN ist eine Untermenge von LD und LR ist eine Untermenge von LD Deterministische endliche Automaten akzeptieren alle Sprachen die auch von nichtdeterministischen endlichen Automaten akzeptiert werden Neben Transitivität, akzeptieren DFAs auch alle durch reguläre Ausdrücke generierte Sprachen Warum? Wir haben gezeigt wie jeder NFA zu einem DFA und jeder reguläre Ausdruck zu einem NFA konvertiert werden kann
Beschreiben LN und LD die gleichen Mengen? Es stellt sich heraus, dass die Antwort ja ist Beweis durch zeigen das LD eine Untermenge von LN ist oder das jeder DFA in einen NFA umgewandelt werden kann Noch mal, siehe jedes gute theoretische Informatik Buch für Details
Universität Göttingen - Informatik II - SS 2005
6-36
6. Automaten und Sprachen
6. Automaten und Sprachen
Reguläre Sprachen: Zusammenfassung
Rückblick
Eine Sprache L(X) ist Regulär wenn:
Reguläre Sprachen Reguläre Ausdrücke Deterministische und nichtdeterministische endliche Automaten
Es gibt einen regulären Ausdruck R so dass gilt L(R) = L(X), oder Es gibt einen DFA MD so dass gilt L(MD) = L(X), oder Es gibt einen NFA MN so dass gilt L(MN) = L(X)
Die Sprachen der regulären Ausdrücke, DFA Sprachen und NFA Sprachen sind alle regulär
Wichtige Algorithmen Konvertierung von regulären Ausdrücken zu nichtdeterministischen endlichen Automaten (NEA) (inklusive Beweise) Konvertierung von nichtdeterministischen endlichen Automaten zu deterministischen endlichen Automaten (DEA) Minimalisierung von endlichen Automaten (DEA)
Gegeben ist ein beliebiger regulärer Ausdruck R und ein NFA MN, mit L(R)=L(MN)
Wir können jeden regulären Ausdruck in einen NFA konvertieren und umgekehrt
Gegeben ist ein beliebiger NFA MN und DFA MD, mit L(MN) = L(MD) Wir können jeden NFA in einen DFA konvertieren und umgekehrt
Universität Göttingen - Informatik II - SS 2005
6-37
6. Automaten und Sprachen
Pumping Lemma für reguläre Sprachen
Universität Göttingen - Informatik II - SS 2005
6-38
6. Automaten und Sprachen
Überblick
Kontextfreie Grammatiken (1/5) Eine kontextfreie Grammatik (KFG/CFG) ist eine rekursive Definition einer Sprache mit:
Wiederholung von Informatik I Begriffe/Einordnung
Einem Alphabet Σ von Symbolen
Regulär (Typ 3) Eine Menge von Produktionen (oder Regeln) der Form
Reguläre Sprachen und Ausdrücke Endlicher Automat
symbol -> symbol symbol … symbol
Kontextfrei (Typ 2)
Ein Startsymbol
Kontextfreie Sprachen und Grammatiken Kellerautomat
Eine Menge von nicht-terminalen Symbolen aus dem Alphabet Σ, welche auf der linken oder rechten Seite einer Produktionsregel erscheinen darf (convention: written in all capital letters) Eine Menge von terminalen Symbolen aus dem Alphabet Σ, welche nur auf der rechten Seite einer Produktionsregel erscheinen darf. (convention: written in all lower case letters) Die Menge aller von einer CFG G erzeugten Strings wird die Sprache von G genannt und wird symbolisiert durch L(G)
Universität Göttingen - Informatik II - SS 2005
6-39
Universität Göttingen - Informatik II - SS 2005
6-40
6. Automaten und Sprachen
6. Automaten und Sprachen
Kontextfreie Grammatiken (2/5)
Kontextfreie Grammatiken (3/5)
Kurzschreibweisen:
Wenn eine KFG G zum Parsen von Programmiersprachen verwendet wird, dann gilt
Alternativen
s->a1..an|b1..bn|…|z1..zn = s->a1..an s->b1..bn … s->z1..zn
L(G) ist die Menge von gültigen Quellprogrammen, und die terminalen Symbole sind die Tokens, welche vom Scanner zurückgeliefert werden Klammergrammatik
Beispiel: expr -> LPAREN sum RPAREN expr -> INT sum -> expr PLUS expr
Kleenesche * Hülle
s->s1*= s->s1’ s1’->s1 s1’ s1’->є
Universität Göttingen - Informatik II - SS 2005
Terminale: {PLUS,LPAREN,RPAREN,INT} Nichtterminale: {sum,expr} Startsymbol: {expr} Σ = Terminale ∪ Nichtterminale 6-41
6. Automaten und Sprachen
6-42
6. Automaten und Sprachen
Kontextfreie Grammatiken (4/5)
Kontextfreie Grammatiken (5/5)
Eine KFG G erzeugt Zeichenketten durch:
Normalformen
Beginne mit dem Startsymbol s ⇒ s1 s2 … sn Ersetze ein nichtterminales Symbol sk auf der rechten Seite mit der rechten Seite dieses Nichtterminals Gegeben: sk ⇒ k1…km Dann: s ⇒ s1…sk…sn ⇒ s1…k1…km…sn Wiederhole obigen Schritt bis nur noch Terminale auf der linken Seite vorhanden sind Jeder Schritt in diesem Prozess wird Ableitung (derivation) genannt und jede Zeichenkette von Symbolen entlang dieses Weges wird Satzform genannt. Die abschließende Satzform, welche nur Terminalsymbole enthält, wird ein Satz (sentence) der Grammatik oder auch das Ergebnis (yield) des Ableitungsprozesses genannt Universität Göttingen - Informatik II - SS 2005
Universität Göttingen - Informatik II - SS 2005
6-43
Chomsky-Normalform Nur Regeln der Art: A ⇒ BC und A ⇒ a (A,B,C Variablen, a Terminal)
Greibach-Normalform Nur Regeln der Art: A ⇒ aα (A Variable, a Terminal, α Zeichenreihe)
Es gibt auch ein Pumping Lemma für kontextfreie Sprachen Anhand des Pumping Lemmas kann bewiesen werden, ob eine Sprache NICHT kontextfrei ist. D.h., trifft das Pumping Lemma nicht zu, dann ist die Sprache auch nicht kontextfrei. Der Umkehrschluss gilt aber nicht!
Das Pumping-Lemma liefert lediglich eine notwendige Bedingung dafür, dass eine Sprache kontextfrei ist.
Universität Göttingen - Informatik II - SS 2005
6-44
6. Automaten und Sprachen
6. Automaten und Sprachen
Pumping Lemma für kontextfreie Sprachen
Ableitungen (1/4)
Satz: Sei L eine kontextfreie Sprache. Dann gibt es eine Zahl (Konstante) n, für die gilt: Wenn z eine Zeichenreihe (Wort) aus L mit einer Länge |z| von mindestens n ist, dann können wir eine Zerlegung von z angeben mit z = uvwxy, für die folgende Bedingungen erfüllt sind: |vx| ≥ 1 (oder vx ≠ ε). Da v und x die Teile sind, die aufgepumpt werden, besagt diese Bedingung, dass wenigstens eine der zu wiederholenden Zeichenreihen nicht leer sein darf. |vwx| ≤ n, d.h. der mittlere Teil ist nicht zu lang. Für alle i ≥ 0 ist die Zeichenreihe uviwxiy in L enthalten. D.h., auch wenn die beiden Zeichenreihen v und x beliebig oft wiederholt werden, einschließlich nullmal, ist die sich ergebende Zeichenreihe ein Element von L.
Universität Göttingen - Informatik II - SS 2005
6-45
6. Automaten und Sprachen
Grammatik Nichtterminale: expr, sum; Terminale: INT expr -> ( sum ) expr -> INT sum -> expr + expr
Mögliche Ableitungen: expr ⇒ ( sum ) ⇒ ( expr + expr ) ⇒ ( INT + expr ) ⇒ (INT + ( sum ) ) ⇒ (INT + ( expr + expr ) ) ⇒ (INT + ( INT + expr ) ) ⇒ (INT + (INT + INT ) )
Universität Göttingen - Informatik II - SS 2005
6. Automaten und Sprachen
Ableitungen (2/4)
Ableitungen (3/4)
Rechtsseitige Ableitungen (rightmost derivations)
Eine Ableitung (oder Herleitung) ist eine Operationenfolge von Ersetzungen, welche zeigen wie eine Zeichenkette von Terminalen (Tokens), ausgehend vom Startsymbol einer Grammatik, abgeleitet werden kann
Ersetze jeweils das äußerste rechte Nichtterminalsymbol in jedem Ableitungsschritt Wird manchmal auch die kanonische Ableitung genannt
Unter der Annahme es gibt eine Produktion X ⇒ y, eine einzelne Ersatzoperation oder ein Ableitungsschritt, dann können diese beschrieben werden durch αXβ⇒αγβ, für beliebige Zeichenketten von Grammatiksymbolen α, β und γ
Linksseitige Ableitungen (leftmost derivations) Ersetze jeweils das äußerste linke Nichtterminalsymbol in jedem Ableitungsschritt Siehe vorherige Folie
Kurzschreibweisen:
Andere Ableitungsreihenfolgen sind möglich Die meisten Parser suchen entweder nach einer rechtsseitigen oder linksseitigen Ableitung
α ⇒* β bedeutet β kann abgeleitet werden von α in 0 oder mehr Schritten α ⇒+ β bedeutet β kann abgeleitet werden von α in 1 oder mehr Schritten α ⇒n β bedeutet β kann abgeleitet werden von α in genau n Schritten
L(G) = { w in Σ* | S
Universität Göttingen - Informatik II - SS 2005
6-46
6-47
G⇒
*
w },
Universität Göttingen - Informatik II - SS 2005
(w = Wort, Σ = Alphabet Terminale, S = Startsymbol)
6-48
6. Automaten und Sprachen
6. Automaten und Sprachen
Ableitungen (4/4)
Beispiel Ableitungen Grammatik:
Linksseitige Ableitungen (leftmost derivations):
expr -> ( sum ) | INT sum -> expr + expr
Für jeden Ableitungsschritt αXβ ⇒ αγβ, muss X das äußerte linke Nichtterminal im String von Symbolen αXβ sein Wird verwendet in LL(k) bzw. top-down parsen
Linksseitige Ableitung:
(INT + (INT + INT))
Rechtsseitige Ableitung:
expr ⇒ ( sum ) ⇒ ( expr + expr ) ⇒ ( INT + expr ) ⇒ (INT + ( sum ) ) ⇒ (INT + ( expr + expr ) ) ⇒ (INT + ( INT + expr ) ) ⇒ (INT + (INT + INT ) )
Rechtsseitige Ableitungen (rightmost derivations): Für jeden Ableitungsschritt αXβ ⇒ αγβ, muss X das äußerte rechte Nichtterminal im String von Symbolen αXβ sein Wird verwendet in LR(k) bzw. bottom-up parsen Wird manchmal auch die kanonische Ableitung genannt
Universität Göttingen - Informatik II - SS 2005
Eingabe:
6-49
expr ⇒ ( sum ) ⇒ ( expr + expr ) ⇒ ( expr + ( sum ) ) ⇒ (expr + ( expr + expr) ) ⇒ (expr + ( expr + INT ) ) ⇒ (expr + ( INT + INT ) ) ⇒ (INT + (INT + INT ) )
Universität Göttingen - Informatik II - SS 2005
6. Automaten und Sprachen
6-50
6. Automaten und Sprachen
Ableitungen und Ableitungsbäume (1/2)
Ableitungen und Ableitungsbäume (2/2)
Ein Ableitungsbaum (auch Parsebaum genannt) ist eine graphische Repräsentation des Ableitungsprozesses
expr
expr
⇒
( sum)
⇒
( expr + expr )
expr
Innere Knoten von Ableitungsbäumen entsprechen den Nichtterminalsymbolen der Grammatik (Produktionen auf der linken Seite)
⇒
( INT + expr )
INT
⇒
(INT + ( sum ) )
Die meisten Parser konstruieren einen Ableitungsbaum während des Ableitungsprozesses für eine spätere Analyse
⇒
(INT + ( expr + expr ) )
expr
⇒
(INT + ( INT + expr ) )
INT
⇒
(INT + (INT + INT ) )
Blätter eines Ableitungsbaumes entsprechen den Terminalsymbolen (Token) der Grammatik
Universität Göttingen - Informatik II - SS 2005
6-51
Universität Göttingen - Informatik II - SS 2005
(
sum
)
+
expr
(
sum
)
+
expr
INT
6-52
6. Automaten und Sprachen
6. Automaten und Sprachen
Mehrdeutigkeiten (1/2)
Mehrdeutigkeiten (2/2)
Eine Grammatik gilt als Mehrdeutig, wenn ein Satz mit (mind.) zwei verschiedenen Ableitungsbäumen abgeleitet werden kann Beispiel – linksseitige versus rechtsseitige Ableitung: Grammatik:
Berühmteres Beispiel – “dangling else” Programmfragment: if a then if b then s1 else s2 Kann interpretiert werden als: 1) if a then { if b then s1 else s2} 2) if a then { if b then s1 } else s2
expression -> identifier | number | - expression | ( expression ) | expression operator expression operator -> + | - | * | /
Mehrdeutigkeit kann manchmal durch die Auswahl eines akzeptierenden Ableitungsbaumes aus mehreren gehandhabt werden
Eingabe: slope * x + intercept
Zum Beispiel, obige Interpretation #1 wird von den meisten Parsern für Sprachen die die „dangling else“ Mehrdeutigkeit haben ausgewählt
Generell ist Mehrdeutigkeit jedoch ein Zeichen dafür, dass die Grammatik „schlecht“ spezifiziert wurde und umgeschrieben werden sollte um Mehrdeutigkeiten zu beseitigen
Universität Göttingen - Informatik II - SS 2005
6-53
6. Automaten und Sprachen
6-54
6. Automaten und Sprachen
Mehrdeutigkeiten: Anmerkungen
Überblick
Es gibt keinen allgemeingültigen Algorithmus zur Entdeckung von Mehrdeutigkeiten und deren Auflösung Es gibt Grammatiken die nur Mehrdeutig sind. Diese werden inhärent Mehrdeutig genannt. Vermeidung von Mehrdeutigkeiten Auswertereihenfolge festlegen (bei versch. Terminalen) Gruppierung festlegen (bei gleichartigen Terminalen)
Universität Göttingen - Informatik II - SS 2005
Wiederholung von Informatik I Begriffe/Einordnung
Regulär (Typ 3) Reguläre Sprachen und Ausdrücke Endlicher Automat
Prioritäten
Kontextfrei (Typ 2) Kontextfreie Sprachen und Grammatiken Kellerautomat
Eindeutige Grammatiken Eine eindeutige Grammatik kann nicht eindeutige Ableitungen haben, aber die Ableitung ist eindeutig, wenn nur links- oder rechtsseitige Ableitungen verwendet werden
Universität Göttingen - Informatik II - SS 2005
6-55
Universität Göttingen - Informatik II - SS 2005
6-56
6. Automaten und Sprachen
6. Automaten und Sprachen
Kellerautomat (1/4)
Kellerautomat (2/4) Kontextfreie Grammatiken können von Kellerautomaten (Push Down Automata, PDA) erkannt werden PDAs sind eine Erweiterung der endlichen Automaten um ein „einfaches“ Gedächtnis (Hilfsband) Eigenschaften eines Kellerautomaten: Das Eingabeband kann sich nur in eine Richtung bewegen. Es existiert ein "Hilfsband", welches sich in beide Richtungen bewegen kann. Der Automat liest im ersten Schritt die jeweils erste Zelle beider Bänder. Als Reaktion des Automaten kann entweder das Hilfsband vorwärts bewegt und ein Zeichen in die nächste Zelle geschrieben werden oder das Symbol gelöscht und das Hilfsband eine Zelle zurück bewegt werden.
Universität Göttingen - Informatik II - SS 2005
6-57
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6-58
6. Automaten und Sprachen
Kellerautomat (3/4)
Kellerautomat (4/4)
Das Hilfsband heißt auch Kellerstapel oder einfach Stapel (engl. stack ). Ein Element kann immer nur oben auf den Stapel gelegt (bzw. an das Ende des Bandes geschrieben) werden (= push ). Immer nur das oberste (letzte) Element kann wieder vom Stapel entfernt werden (= pop ).
Ein Kellerautomat (=pushdown automaton, PDA) ist ein Septupel P = {Q, Σ, Γ, δ, q0, Z0, F } mit: Q
Zustandsmenge, |Q | < ∞
Σ
Eingabealphabet, |Σ| < ∞
Die erste Zelle des Hilfsbandes enthält eine spezielle Kennzeichnung, um anzuzeigen, wann der Stapel leer ist. Ein Kellerautomat kann bei leerem Stapel nicht weiterarbeiten.
Γ
Stackalphabet, |Γ| < ∞
δ
Übergangsfunktion (ZustandsÜF)
Kellerautomaten arbeiten nichtdeterministisch
q0
Anfangszustand
Z0
Startsymbol (für Stack)
F
Endzustände, F ⊆ Q
ε-Bewegungen sind erlaubt Die Menge der deterministischen Kellerautomaten ist eine echte Untermenge der nichtdeterministischen Kellerautomaten.
Universität Göttingen - Informatik II - SS 2005
6-59
δ(q,a,X)
Universität Göttingen - Informatik II - SS 2005
mit q ∈ Q, a ∈ {Σ, ε}, X ∈ Γ
6-60
6. Automaten und Sprachen
6. Automaten und Sprachen
PDA-Übergangsfunktionen
Beispiel PDA: Palindrome
Die Ausgabe von δ besteht aus einer endlichen Menge von Paaren (p, γ), wobei p für den neuen Zustand und γ für die Zeichenreihe der Stacksymbole steht, die X auf dem oberen Ende des Stacks ersetzt. Wenn γ = ε, dann wird das oberste Stacksymbol wird gelöscht. (pop-Operation) Wenn γ = X, dann bleibt der Stack unverändert. Wenn γ = YZ, dann wird X durch Z ersetzt und Y zuoberst auf dem Stack abgelegt. (push-Operation)
Da PDAs nicht-deterministisch arbeiten, kann die Ausgabe von δ eine Menge an Paaren ergeben, z.B. δ(q, a, X) = { (p, YZ), (r, ε) } Die Paare müssen dabei als Einheit betrachtet und behandelt werden. Wenn sich der PDA im Zustand q befindet, X das oberste Stacksymbol ist und die Eingabe a gelesen wird, kann in den Zustand p gewechselt und X durch YZ ersetzt werden, oder in den Zustand r gewechselt und X vom Stack entfernt werden.
Universität Göttingen - Informatik II - SS 2005
6-61
6. Automaten und Sprachen
Formelle Beschreibung: P = ({q0,q1,q2},{0,1},{0,1,Z0}, δ, q0, Z0, {q2}) δ(q0, 0, Z0) = {(q0,0 Z0)} δ(q0, 1, Z0) = {(q0,1 Z0)} δ(q0, 0, 0) = {(q0,00)} δ(q0, 0, 1) = {(q0,01)} δ(q0, 1, 0) = {(q0,10)} δ(q0, 1, 1) = {(q0,11)} δ(q0, ε, Z0)= {(q1, Z0)} δ(q0, ε, 0) = {(q1, 0)} δ(q0, ε, 1) = {(q1, 1)} δ(q1, 0, 0) = {(q1, ε)} δ(q1, 1, 1) = {(q1, ε)} δ(q1, ε, Z0)= {(q2, Z0)}
lesen und push
Wechsel nach q1, ohne Stack zu verändern lesen, vergleichen, pop Z0 erreicht, akzeptiert
Universität Göttingen - Informatik II - SS 2005
6-62
6. Automaten und Sprachen
Schreibkonventionen für PDAs
Beschreibung der Konfiguration eines PDA (1/2)
a, b, ... ∈ Σ p, q, ... ∈ Q w, z, ... = Zeichenreihen aus Σ (Terminale) X, Y, ... = Γ α, β, γ, ... = Zeichenreihen aus Γ (Nichtterminale)
Im Gegensatz zum endlichen Automaten, bei denen lediglich der Zustand (neben dem Eingabesymbol) für einen Übergang von Bedeutung ist, umfasst die Konfiguration eines PDA sowohl den Zustand als auch den Inhalt des Stacks. Die Konfiguration wird daher durch das Tripel (q, w, γ) dargestellt, wobei q w γ
Universität Göttingen - Informatik II - SS 2005
lesen und push
6-63
für den Zustand, für die verbleibende Eingabe, für den Inhalt des Stacks steht. (Das obere Ende des Stacks steht am linken Ende von γ.)
Universität Göttingen - Informatik II - SS 2005
6-64
6. Automaten und Sprachen
6. Automaten und Sprachen
Beschreibung der Konfiguration eines PDA (2/2)
Akzeptanzzustände von PDAs
Sei P = {Q, Σ, Γ, δ, q0, Z0, F } ein PDA.
Es gibt zwei Ansätze, wann ein PDA eine Eingabe akzeptiert: Akzeptanz durch Endzustand Akzeptanz durch leeren Stack
Angenommen, δ(q, a, X) enthält (p, α). Dann gilt für alle Zeichenreihen w aus Σ* und β aus Γ*: (q, aw, X β) ⊢ (p, w, αβ)
Zwar unterscheiden sich die Sprachen, die die jeweiligen PDAs akzeptieren, aber sie sind jeweils ineinander überführbar. Akzeptanz durch Endzustand
D.h., der Automat kann vom Zustand q in den Zustand p übergehen, indem er das Symbol a (das ε sein kann) aus der Eingabe einliest und X auf dem Stack durch α ersetzt. (Die restliche Eingabe w und der restliche Inhalt des Stacks β beeinflussen die Aktion des PDA nicht!)
Sei P = {Q, Σ, Γ, δ, q0, Z0, F } ein PDA. Dann ist die Sprache L(P ), die von P durch Endzustand akzeptiert wird, * (q, ε, β) für einen Zustand q in F und eine {w | (q0, w, Z0) ⊢ p Stackzeichenreihe α.
Akzeptanz durch leeren Stack Sei P = {Q, Σ, Γ, δ, q0, Z0, F } ein PDA. Dann ist die Sprache N(P ), die von P durch Endzustand akzeptiert wird, * (q, ε, ε) für einen beliebigen Zustand q. {w | (q0, w, Z0) ⊢ N(P) ist die Menge der Eingabezeichenreihen w, die P einlesen kann und bei der er gleichzeitig den Stack leeren kann.
Universität Göttingen - Informatik II - SS 2005
6-65
6. Automaten und Sprachen
Universität Göttingen - Informatik II - SS 2005
6-66
6. Automaten und Sprachen
Theoretische Ergebnisse
Rückblick
Zu jeder kontextfreien Grammatik G (mit ε nicht in L(G)) gibt es zwei Grammatiken G‘ und G‘‘ mit L(G) = L(G‘) = L(G‘‘) in Chomsky Normalform (G‘) und in Greibach Normalform (G‘‘).
Kontextfreie Sprachen/Grammatiken Pumping Lemma für kontextfreie Sprachen Normalformen Ableitungen und Ableitungsbäume Mehrdeutigkeiten
Pumping Lemma für kontextfreie Grammatiken. Kellerautomaten Konfiguration Akzeptanz
Eine Sprache L ist kontextfrei genau dann, wenn L von einem nichtdeterministischen Kellerautomaten erkannt wird. Die Menge der deterministischen Kellerautomaten (DPDA) ist eine echte Untermenge der nichtdeterministischen Kellerautomaten.
Universität Göttingen - Informatik II - SS 2005
6-67
Universität Göttingen - Informatik II - SS 2005
6-68
6. Automaten und Sprachen
6. Automaten und Sprachen
Tabellarischer Überblick
Beschreibungsmittel
Beschreibungsmittel Determinismus und Nichtdeterminismus Abschlusseigenschaften unter bestimmten Operationen Entscheidbarkeit Wortproblem (Liegt Wort in Sprache?) Leerheitsproblem (Ist Sprache leer?) Äquivalenzproblem (Sind zwei Sprachen äquivalent?) Schnittproblem (Was ist der Schnitt zweier Sprachen?)
Typ 3 (Regulär)
Reguläre Grammatik DFA NFA Regulärer Ausdruck
Deterministisch Kontextfrei
LR(k)-Grammatik Deterministischer Kellerautomat (DPDA)
Typ 2 (Kontextfrei)
Kontextfreie Grammatik Kellerautomat (PDA)
Typ 1 (Kontextsensitiv)
Kontextsensitive Grammatik Linear beschränkter Automat (LBA)
Typ 0
Typ 0 – Grammatik Turingmaschine (TM)
Wortproblem (Komplexität)
Anmerkung: Durch diesen Überblick bekommen Sie einen Überblick bzw. ein Gefühl für die Mächtigkeit der einzelnen Sprachklassen. Machen Sie sich damit vertraut um später Probleme schnell und richtig einschätzen zu können. Universität Göttingen - Informatik II - SS 2005
6-69
6. Automaten und Sprachen
Abschlusseigenschaften
Nichtdeterministischer Automat
Deterministischer Automat
Äquivalent?
NFA
DFA
ja
LBA
TM
Universität Göttingen - Informatik II - SS 2005
6-70
6. Automaten und Sprachen
Determinismus und Nichtdeterminismus
PDA
Universität Göttingen - Informatik II - SS 2005
DPDA
DLBA
DTM
Schnitt
Vereinigung
Komplement
Produkt
Stern
Typ 3
Ja
Ja
Ja
Ja
Ja
Det. Kf.
Nein
Nein
Ja
Nein
Nein
Typ 2
Nein
Ja
Nein
Ja
Ja
Typ 1
Ja
Ja
Ja
Ja
Ja
Typ 0
Ja
Ja
Nein
Ja
Ja
nein
??? (Als LBA-Problem bekannt)
ja
6-71
Universität Göttingen - Informatik II - SS 2005
6-72
6. Automaten und Sprachen
6. Automaten und Sprachen
Entscheidbarkeit
Komplexitäten des Wortproblems
Wortproblem
Leerheitsproblem
Äquivalenzproblem Schnittproblem
Typ 3
Ja
Ja
Ja
Ja
Typ 3 (DFA gegeben)
Lineare Komplexität
Det. Kf.
Ja
Ja
Ja
Nein
Det. Kf.
Lineare Komplexität
Typ 2
Ja
Ja
Nein
Nein
Typ 2 (CNF gegeben)
O(n3)
Typ 1
Ja
Nein
nein
Nein
Typ 1
Exponentielle Komplexität (NP-hart)
Typ 0
Nein
Nein
Nein
Nein
Typ 0
Unlösbar
Universität Göttingen - Informatik II - SS 2005
6-73
6. Automaten und Sprachen
Ausblick Compilerbau (Kapitel 7) Automaten und Sprachen (Kapitel 6)
Betriebssysteme (Kapitel 5)
Maschinenorientierte Programmierung (Kapitel 4)
von-Neumann-Rechner (Kapitel 3) Speicher Zahlen und Logik (Kapitel 2) Kommunikation (Kapitel 8) von-Neumann-Rechner Universität Göttingen - Informatik II - SS 2005
6-75
Wortproblem
Universität Göttingen - Informatik II - SS 2005
6-74
7. Compilerbau
Inhalte
Informatik II
Organisation von Compilern für moderne Programmiersprachen (Teil 7.1)
SS 2005
Einführung Lexer Parser Zusammenführung (Bau eines ausführbaren Programms)
Kapitel 7: Compilerbau
Teil 1: Lexer und Parser
Grundlegende Konzepte von Programmiersprachen (Teil 7.2)
Dr. Michael Ebner Dipl.-Inf. René Soltwisch
Einführung Programmiersprachen Namen, Bindungen und Gültigkeitsbereiche Speichermanagement und Implementierung Kontrollfluss
Lehrstuhl für Telematik Institut für Informatik Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
7. Compilerbau
Hinweise
Literatur (1/2)
Als Grundlage
dient das Buch “Programming Language Pragmatics” von Michael L. Smith, sowie das vorherige Kapitel „Automaten und Sprachen“.
Bücher
Michael L. Scott : „Programming Language Pragmatics”, MKP 2000, ISBN 1-55860-578-9 http://www.cs.rochester.edu/u/scott/pragmatics/ Klassiker der Automatentheorie von Hopcroft/Ullman/Motwani
Vertiefung in weiterführender Vorlesung „Konzepte der Programmiersprachen und des Compilerbaus“ von Prof. Dr. Tiziana Margaria-Steffen
7.1-3
Hopcroft, Motwani, Ullman : „Introduction to Automata Theory, Languages, and Computation“, http://www-db.stanford.edu/~ullman/ialc.html Hopcroft, Motwani, Ullman: „Einführung in die Automatentheorie, Formale Sprachen und Komplexitätstheorie“, Pearson Studium, ISBN 3827370205
Drachenbuch
Universität Göttingen - Informatik II - SS 2005
7.1-2
Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: „Compilers - Principles, Techniques and Tools“. Addison-Wesley 1988, ISBN 0-201-10088-6 Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman: „Compilerbau.“ Oldenbourg Verlag 1999, Teil 1: ISBN 3-486-25294-1, Teil 2: ISBN 3-48625266-6
Universität Göttingen - Informatik II - SS 2005
7.1-4
7. Compilerbau
7. Compilerbau
Literatur (2/2)
Skripte
Informatik II - SS2003 Folien dienen als Grundlage und wurden übersetzt und ev. teilweise ergänzt. Es wird aber auch komplett neue Teile geben!!! http://user.informatik.uni-goettingen.de/~info2/SS2003/ Übersetzerbau I – Prof. Dr. Goos, Universität Karlsruhe http://www.info.uni-karlsruhe.de/lehre/2003WS/uebau1/
ACM Transactions on Programming Languages and Systems ACM SIGPLAN Conference on Programming Language Design and Implementation ACM SIGPLAN Conference on Programming Language Principles
Erfahrungsberichte von Studentenseite sind erwünscht 7.1-5
Universität Göttingen - Informatik II - SS 2005
Warum Programmiersprachen und Compiler studieren?
Einführung Lexer Parser Zusammenführung (Bau eines ausführbaren Programms)
Nach Aussage von Michael Scott (siehe Literaturangabe)
Verstehe schwer verständliche Spracheigenschaften Wähle zwischen alternativen Wegen um etwas auszudrücken Mache guten Gebrauch von Debuggern, Assemblern, Linkern und andere verwandte Werkzeuge Simuliere nützliche Eigenschaften (features) welche in einer Sprache fehlen
Nach Aussage von Kevin Scott (vorheriger Dozent)
Compiler sind große und komplexe Programme: studieren dieser Programme hilft dir „große Software“ besser zu verstehen Viele Programme enthalten „kleine Programmiersprachen“
Universität Göttingen - Informatik II - SS 2005
7.1-6
7. Compilerbau
Überblick
Konferenzen und Journale
7. Compilerbau
ANTLR, ANother Tool for Language Recognition: http:/www.antlr.org Populärste Compilergeneratoren: JavaCC, ANTLR, Eli, Byacc und Coco/R
http://en.wikipedia.org/wiki/Compilers:_Principles,_Techniques_and_Tools http://de.wikipedia.org/wiki/Compiler
Universität Göttingen - Informatik II - SS 2005
Katalog von Konstruktionswerkzeugen für Compiler http://wwwold.first.gmd.de/cogent/catalog/
WWW: Wikipedia
Compilerbau-Skript von Prof. Dr. Goltz, Universität Braunschweig http://www.cs.tu-bs.de/ips/ss04/cb/skript_cp.ps.gz Informatik-Skripte von Prof. Dr. Waack, Universität Göttingen http://www.num.math.uni-goettingen.de/waack/lehrmaterial/
Folien
Weitere Quellen
7.1-7
Unix shells, Microsoft Office Anwendungen, etc. Es ist nützlich etwas über Sprachdesign und –implementierung zu wissen, so dass Sie kleine Sprachen in die eigene Software einbauen können
Universität Göttingen - Informatik II - SS 2005
7.1-8
7. Compilerbau
7. Compilerbau
Weitere Fragen zum Nachdenken
Entwurf eines Compilers
Was macht eine Programmiersprache erfolgreicher als andere? Werden Programmiersprachen mit der Zeit besser? An welchen Eigenschaften (features) mangelt es deiner bevorzugten Sprache um Sie
mächtiger, zuverlässiger, einfacher in der Verwendung zu machen?
Universität Göttingen - Informatik II - SS 2005
7.1-9
Die Komplexität wird durch die Aufteilung der Compilerarbeiten in unabhängige Abschnitte oder Phasen bewältigt Typischerweise analysiert eine Phase eine Repräsentation von einem Programm und übersetzt diese Repräsentation in eine andere, welche für die nächste Phase besser geeignet ist Das Design dieser Zwischenrepräsentationen eines Programms sind kritisch für die erfolgreiche Implementierung eines Compilers
7.1-10
7. Compilerbau
Der Kompilationsprozess (-phasen)
Lexikalische Analyse
Scanner (lexikalische Analyse)
Lese Programm und konvertiere Zeichenstrom in Marken (tokens).
Parser (syntaktische Analyse)
Lese Tokenstrom und generiere Parserbaum (parse tree).
Traversiere Parserbaum, überprüfe nicht-syntaktische Regeln.
Zwischencodegenerierung
Traversiere Parserbaum noch mal, gebe Zwischencode aus.
Optimierung
Untersuche Zwischencode, versuche ihn zu verbessern.
Zielcodegenerierung
Übersetze Zwischencode in Assembler-/Maschinencode
Optimierung Maschinenebene
Untersuche Maschinencode, versuche ihn zu verbessern.
Universität Göttingen - Informatik II - SS 2005
Daher sollte man nicht davon ausgehen, dass Compiler immer fehlerfrei arbeiten!!!
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Semantische Analyse
Compiler sind gut untersuchte, aber auch sehr komplexe Programme
7.1-11
Eine Programmdatei ist nur eine Sequenz von Zeichen Falsche Detailebene für eine Syntaxanalyse Die lexikalische Analyse gruppiert Zeichensequenzen in Tokens Tokens sind die kleinste „Bedeutungseinheit“ (units of meaning) im Kompilationsprozess und sind die Grundlage (foundation) fürs Parsen (Syntaxanalyse) Die Compilerkomponente zum Ausführen der lexikalischen Analyse ist der Scanner, welcher oftmals ausgehend von höheren Spezifikationen automatisch generiert wird
Mehr über Scanner in der nächsten Vorlesung
Universität Göttingen - Informatik II - SS 2005
7.1-12
7. Compilerbau
7. Compilerbau
Beispiel für lexikalische Analyse
Syntaktische Analyse
Ein GGT Programm in C
Token int int int { i ) ( j = j j – } “%d\n” )
int gcd (int i, int j) { while (i != j) { if (i > j) i = i – j; else j = j – i; } printf(“%d\n”,i); }
gcd i j while != { i ) i ; = i printf , ;
( , ) ( j if > i – else j ; ( I }
7.1-14
7. Compilerbau
Beispiel Syntaxanalyse
Semantische Analyse conditional
Token i ) i ; = i
Mehr über kontextfreie Grammatiken und Parser später
Universität Göttingen - Informatik II - SS 2005
7.1-13
7. Compilerbau
( j = j j – }
conditional -> if ( expr ) block else block
Parserbäume repräsentieren die Phrasenstruktur eines Programmes und sind die Grundlage für die semantische Analyse und Codegenerierung Die Compilerkomponente zum Ausführen der syntaktischen Analyse ist der Parser, welcher oftmals ausgehend von höheren Spezifikationen automatisch generiert wird
Universität Göttingen - Informatik II - SS 2005
if > i – else j ;
Die lexikalische Analyse erzeugt einen Strom von Tokens Falsche Detailebene für die semantische Analyse und Codegenerierung Die Syntaxanalyse gruppiert eine Zeichenfolge von Tokens in Parserbäume, was durch die kontextfreie Grammatik gelenkt wird, die die Syntax der zu kompilierenden Sprache spezifiziert
(
expr
id
comp
id
i
>
j
if
Universität Göttingen - Informatik II - SS 2005
block
)
block
else
statement id
=
j
statement id
=
expr
i
id
op
id
i
-
j
Bestimmt die Bedeutung eines Programms basierend auf der Repräsentation des Parserbaumes Setzt Regeln durch, welche nicht durch die Syntax der Programmiersprache verwaltet werden
Konsistente Verwendung von Typen, z.B.
Jeder Bezeichner (identifier) muss vor der ersten Verwendung deklariert sein Unterprogrammaufrufe müssen die richtige Argumentanzahl und Argumenttyp haben etc.
expr
id
op
id
j
-
i
7.1-15
int a; char s[10]; s = s + a; illegal!
Bringt die Symboltabelle auf den aktuellen Stand, welche neben anderen Dingen den Typ von Variablen, deren Größe und den Gültigkeitsbereich in welchen die Variablen erklärt wurden notiert
Universität Göttingen - Informatik II - SS 2005
7.1-16
7. Compilerbau
7. Compilerbau
Zwischencodegenerierung
Parserbäume sind die falsche Detailebene für die Optimierung und Zwischencodegenerierung Zwischencodegenerierung verwandelt den Parsebaum in eine Sequenz von Anweisungen (statements) der Zwischensprache welche die Semantik des Quellprogramms verkörpert Die Zwischensprache ist genauso Mächtig, aber einfacher, wie die höhere Sprache
Zielcodegenerierung
Das Endziel eines Compilerprozesses ist die Generierung eines Programms welches der Computer ausführen kann
Schritt 1: durchlaufe (traverse) die Symboltabelle, weise Variablen einen Platz im Speicher zu Schritt 2: durchlaufe (traverse) den Parsebaum oder Programm in der Zwischensprache um arithmetische Operationen, Vergleiche, Sprünge und Unterprogrammaufrufe auszugeben, sowie Lasten und Vorräte von Variablenreferenzen
z.B. die Zwischensprache könnte nur einen Schleifentyp (goto) haben, wogegen die Quellsprache mehrere haben könnte (for, while, do, etc.)
Eine einfache Zwischensprache macht es einfacher nachfolgende Compilerphasen zu implementieren
Universität Göttingen - Informatik II - SS 2005
7.1-17
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Überblick
Zwischencode und Zielcode ist typischerweise nicht so effizient wie er sein könnte
7.1-18
7. Compilerbau
Optimierung
Dies ist die Aufgabe der Zielcodegenerierung
Einschränkungen erlauben es dem Codegenerator sich auf die Codeerzeugung zu konzentrieren und nicht auf die Optimierung
Ein Optimierer kann aufgerufen werden um die Qualität des Zwischencodes und/oder Zielcodes nach jeder dieser Phasen zu verbessern Die Compilerkomponente zur Verbesserung der Qualität des generierten Codes wird Optimierer (optimizer) genannt. Optimierer sind die kompliziertesten Teile eines Compilers Optimierungsalgorithmen sind oftmals sehr ausgefeilt, benötigen erheblich viel Speicher und Zeit für die Ausführung und erzeugen nur kleine Verbesserungen der Programmgröße und/oder Leistung der Laufzeit Zwei wichtige Optimierungen
Einführung Lexer Parser Zusammenführung (Bau eines ausführbaren Programms)
Registerzuteilung – entscheide welche Programmvariablen zu einem bestimmten Zeitpunkt der Programmausführung in Registern gehalten werden können
Unbenutzten Code eliminieren – entferne Funktionen, Blöcke, etc., welche niemals vom Programm ausgeführt würden
Universität Göttingen - Informatik II - SS 2005
7.1-19
Universität Göttingen - Informatik II - SS 2005
7.1-20
7. Compilerbau
7. Compilerbau
Der Kompilationsprozess (-phasen)
Lexikalische Analyse
Scanner (lexikalische Analyse)
Lese Programm und konvertiere Zeichenstrom in Marken (tokens).
Parser (syntaktische Analyse)
Lese Tokenstrom und generiere Parserbaum (parse tree).
Semantische Analyse
Traversiere Parserbaum, überprüfe nicht-syntaktische Regeln.
Zwischencodegenerierung
Traversiere Parserbaum noch mal, gebe Zwischencode aus.
Optimierung
Untersuche Zwischencode, versuche ihn zu verbessern.
Zielcodegenerierung
Übersetze Zwischencode in Assembler-/Maschinencode
Optimierung Maschinenebene
Untersuche Maschinencode, versuche ihn zu verbessern.
Universität Göttingen - Informatik II - SS 2005
7.1-21
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
2 Fragen
Ein GGT Programm in C
Universität Göttingen - Informatik II - SS 2005
7.1-22
7. Compilerbau
Beispiel für lexikalische Analyse
int gcd (int i, int j) { while (i != j) { if (i > j) i = i – j; else j = j – i; } printf(“%d\n”,i); }
Die lexikalische Analyse gruppiert Zeichensequenzen in Tokens (Marken) bzw. Symbole Tokens sind die kleinste „Bedeutungseinheit“ (units of meaning) im Kompilationsprozess und sind die Grundlage (foundation) fürs Parsen (Syntaxanalyse) Die Compilerkomponente zum Ausführen der lexikalischen Analyse ist der Scanner, welcher oftmals ausgehend von höheren Spezifikationen automatisch generiert wird
Token int int int { i ) ( j = j j – } “%d\n” )
gcd i j while != { i ) i ; = i printf , ;
( , ) ( j if > i – else j ; ( I }
Wie beschreiben wir die lexikalische Struktur einer Programmiersprache?
Wie implementieren wir den Scanner nachdem wir wissen was die Tokens sind?
7.1-23
Mit anderen Worten, was sind die Tokens (Symbole)
Universität Göttingen - Informatik II - SS 2005
7.1-24
7. Compilerbau
7. Compilerbau
Wie beschreiben wir die lexikalische Struktur? (1/2)
Wie beschreiben wir die lexikalische Struktur? (2/2)
1. Versuch: Liste aller Tokens
2. Versuch: Reguläre Ausdrücke
if else long int short char ; , : ( ) { } …
Aber was ist mit den Konstanten (Ganzzahlen, Fliesskommazahlen, Zeichenketten)?
Es können nicht alle aufgelistet werden, es gibt ~8 Milliarden 32-bit integer und floating-point Konstanten und eine unendliche Anzahl von Zeichenfolgenkonstanten Das gleiche Problem gilt für Bezeichner (Variablen, Funktionen und benutzerdefinierte Typnamen) Lösung: Wir brauchen einen Weg um kurz und prägnant Klassen von Tokens zu beschreiben, welche eine große Anzahl von verschiedenen Werten abdecken können
Muster (patterns) welche zum Auffinden von passendem Text verwendet werden können Werden mit folgenden Ausdrücken rekursiv ausgedrückt
Ein Zeichen Der leeren Zeichenfolge ε Der Verkettung zweier regulärer Ausdrücke
Der Alternative zweier regulärer Ausdrücke
Der Kleenesche Hülle * (ode einfach Hülle oder Stern)
7.1-25
z.B. bedeutet r1.r2|r3 nun (r1.r2)|r3 oder r1.(r2|r3)???
7.1-26
7. Compilerbau
Lexikalische Analyse: Reguläre Ausdrücke bei der Arbeit
int gcd (int i, int j) { while (i != j) { if (i > j) i = i – j; else j = j – i; } printf(“%d\n”,i); }
r* ist kein oder mehrere Vorkommen des Wertes von r1
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Ein GGT Programm in C
r1|r2 ist der Wert von r1 oder der Wert von r2
Runde Klammern können zum Gruppieren von regulären Ausdrücken verwendet werden, um Zweideutigkeiten bei Kombinationen auszuschließen
Universität Göttingen - Informatik II - SS 2005
r1.r2 ist der Wert von r1 gefolgt vom Wert von r2
Reguläre Ausdrücke
digit=[0-9] letter=[a-z]|[A-Z] punct=\|% INT=‘int’ WHILE=‘while’ IF=‘if’ ID=letter.(letter|digit)* LPAREN=( RPAREN=) COMMA=, SEMI=; LBRACE={ RBRACE=} EQ== MINUS=GT=> SC=“.(letter|digit|punct)*.”
Universität Göttingen - Informatik II - SS 2005
Ein genauerer Blick auf die lexikalische Analyse
Tokens INT INT INT LBRACE ID:i RPAREN LPAREN ID:j EQ ID:j ID:j MINUS RBRACE SC:“%d\n” RPAREN
ID:gcd ID:i ID:j WHILE NEQ LBRACE ID:i RPAREN ID:i SEMI EQ ID:i ID:printf COMMA SEMI
LPAREN COMMA RPAREN LPAREN ID:j IF GT ID:i MINUS ELSE ID:j SEMI LPAREN ID:i RBRACE
7.1-27
Wie behandelt der lexikalische Analysator Leerzeichen, Kommentare und Konflikte zwischen regulären Ausdrücken?
Leerzeichen
Kommentare einer Programmiersprache
Konflikte zwischen regulären Ausdrücken Gegeben:
int
gcd
(int
i, int
j) {
/* gcd */ int gcd (int i, int j) {
WHILE=‘while’ ID=letter.(letter|digit)*
Beide reguläre Ausdrücke decken die Zeichenfolge „while“ ab. Welcher Ausdruck soll aber nun gewählt werden?
Universität Göttingen - Informatik II - SS 2005
7.1-28
7. Compilerbau
7. Compilerbau
Handhabung von Leerzeichen
Leerzeichen können als Token durch folgende Regel erkannt werden
\n ist ein „escape“ Zeichen für „newline“ (neue Zeile) \r ist ein „escape“ Zeichen für „carriage return“ (Wagenrücklauf) \t ist ein „escape“ Zeichen für „tab“ (Tabulator) \s ist ein „escape“ Zeichen für „space“ (Leerzeichen)
Das Leerzeichentoken WS ist normalerweise unwichtig für die Syntax einer Programmiersprache, weshalb es einfach vom Tokenstrom gelöscht werden kann
Universität Göttingen - Informatik II - SS 2005
7.1-29
Universität Göttingen - Informatik II - SS 2005
In Abhängigkeit von der Komplexität von Kommentaren ist eine Beschreibung via regulärer Ausdrücke vielleicht möglich
Gegeben sind zwei reguläre Ausdrücke r1 und r2, welche eine Teileingabe p=‘c1..ck‘ finden. Welche soll nun ausgewählt werden?
SLC=‘//’.*.$
Findet Texte wie
Alternative 1: Längster Fund
Zeilenkommentare (single line comments) können mit regulären Ausdrücken gefunden werden
$ ist ein spezielles Symbol, welches das Ende einer Zeile bedeutet
Willkürlich verschachtelte Kommentare
/* level 1 /* level 2 */ back to level 1 */
Wird Normalerweise vom Präprozessor behandelt
7.1-31
r1=‘while’ r2=letter.(letter|digit)* Eingabe int while48; … Wenn p=‘while’, beide, r1 und r2 passen Wenn p=‘while48;’ weder r1 noch r2 passen Wenn p=‘while48’ nur r2 passt, wähle r2 aus
Alternative 2: Regelpriorität
Universität Göttingen - Informatik II - SS 2005
Nehme solange Eingabezeichen hinzu bis weder r1 noch r2 passen. Entferne ein Zeichen und entweder r1 oder r2 muss passen. Die Teileingabe p ist der längste Fund und wenn nur einer von r1 oder r2 passt, dann wähle ihn. Beispiel:
// Dies ist ein Kommentar
Einige Kommentare sind zu kompliziert um durch reguläre Ausdrücke gefunden zu werden
7.1-30
Handhabung von Konflikten
Alternative 2: Kommentartoken
z.B. #include und #define
7. Compilerbau
Handhabung von Kommentaren (2/2)
Spezielles Programm welches eine Datei einliest, Kommentare entfernt, andere Operationen wie Makro-Expansion ausführt und eine Ausgabedatei schreibt, welche vom lexikalischen Analysator gelesen wird. Quellprogramme können auch Steueranweisungen enthalten, die nicht zur Sprache gehören, z.B. Makro-Anweisungen. Der lexikalische Analysator behandelt die Steueranweisungen und entfernt sie aus dem Tokenstrom. Präprozessor-Anweisungen in C und C++
7. Compilerbau
Alternative 1: Präprozessoren
WS=(\n|\r|\t|\s)*
Handhabung von Kommentaren (1/2)
Wenn der längste Fund immer noch in einem Konflikt endet, dann wähle den erste regulären Ausdruck aus der lexikalischen Definition der Sprache
Universität Göttingen - Informatik II - SS 2005
7.1-32
7. Compilerbau
7. Compilerbau
Weitere spezielle Probleme
Implementierung eines lexikalischen Analysators
Reservierte Schlüsselwörter
Wie übertragen wir reguläre Ausdrücke in einen lexikalischen Analysator?
Schlüsselwörter dürfen nicht in Bezeichnern (Namen) verwendet werden
Groß-/Kleinschreibung
Textende
Konvertiere reguläre Ausdrücke zu einem deterministischen endlichen (finite) Automaten (DFA)
intern nur eine Repräsentation verwenden, weshalb eine Anpassung notwendig ist
Das Textende muss dem Syntaxanalysator mitgeteilt werden, weshalb ein eind-of-text Symbol (eot) eingefügt werden muss
Die Verletzung der Syntax (z.B. falscher Wertebereich) wird gemeldet und trotzdem an den Syntaxanalysator weitergegeben
Universität Göttingen - Informatik II - SS 2005
7.1-33
High-level language compiler
Lexical analyzer
7.1-34
Bau des lexikalischen Analysators: Letzter Schritt a
DFAs können effizient simuliert werden indem ein tabellenbasierter Algorithmus verwendet wird
Universität Göttingen - Informatik II - SS 2005
Die Konvertierung von regulären Ausdrücken zu DFAs und das Schreiben eines Programms zum Simulieren des DFA kann entweder von Hand vorgenommen werden oder von einem anderen Programm, welches lexikalischer Analysegenerator genannt wird.
Lexical analyzer source code
7. Compilerbau
Bau des lexikalischen Analysators: DFA zu Code
void dfa (char *in) { s = in; state = start_state; while(1) { c = *s++; state = table[state][c]; if (final[state)]) { printf(“Accepted %s\n”,in); break; } } }
z.B. überprüfe, ob der Wert einer Ganzzahlkonstante in eine 32-bit integer passt
Lexical Analyzer Generator
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Der DFA erkennt die Tokens im Eingabetext und wird der lexikalische Analysator Wenn ein Token erkannt wurde, dann kann eine benutzerdefinierte Aktion ausgeführt werden
gelesene aber nicht verwendete Zeichen müssen für nächsten Test berücksichtigt werden
Lexikalische Fehler
Warum??? DFAs sind einfacher zu simulieren als reguläre Ausdrücke
Schreibe ein Programm zum Simulieren eines DFAs
Vorgriff (lookahead) um mehrere Zeichen
Regular Expressions + Actions
b
q2
a
q3 c
q1
DFA Simulatorcode wird der Kern des lexikalischen Analysators Wenn der DFA in einem Endzustand ist
a
c
d
q4
q5 c
Tabelle a
b
c
d
q1
q2
q6
q4
q6
q2
q6
q3
q6
q6
q3
q2
q6
q4
q6
q4
q6
q6
q6
q5
q5
q2
q6
q4
q6
q6
q6
q6
q6
q6
7.1-35
Führe mit dem letzten, passenden regulären Ausdruck, entsprechend dem längsten Fund und/oder der Regelpriorität, die verbundene, benutzerdefinierte Aktion aus Merke aktuelle Stelle im Eingabestrom und gebe Token an Tokenkonsument (parser) weiter
Universität Göttingen - Informatik II - SS 2005
7.1-36
7. Compilerbau
7. Compilerbau
Eine reale JLex lexikalische Spezifikation für einen Kalkulatorsprache
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
import java.io.IOException; %% %public %class Scanner %type void %eofval{ return; %eofval} %{ public static void main (String args []) { Scanner scanner = new Scanner(System.in); try { scanner.yylex(); } catch (IOException e) { System.err.println(e); } } %} comment space digit integer real IF THEN ELSE
= = = = = = = =
("#".*) [\ \t\b\015]+ [0-9] {digit}+ ({digit}+"."{digit}*|{digit}*"."{digit}+) ("if") "then" else
%% {space} break; } {comment} break; } {integer} break;
{ System.out.println("space");
{ System.out.println("comment");
{ System.out.println("Integer CONSTANT\t" + yytext());
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
break; } {real}
{ System.out.println("REAL
CONSTANT\t" + yytext());
{ System.out.println("IF
Token\t" + yytext());
{ System.out.println("THEN
Token\t" + yytext());
{ System.out.println("ELSE
Token\t" + yytext());
} {IF} break; } {THEN}
break; } \n
{ System.out.println("NL"); break; }
"+"
{ System.out.println("ADD"); break; }
"-"
{ System.out.println("SUB"); }
"*"
{ System.out.println("MUL"); break; }
"/"
{ System.out.println("DIV"); break; }
"%"
{ System.out.println("MOD"); break; }
"("
{ System.out.println("LPAR"); break;
Konvertierung von regulären Ausdrücken zu nichtdeterministischen endlichen Automaten (NFA) (inklusive Beweise) Konvertierung von nichtdeterministischen endlichen Automaten zu deterministischen endlichen Automaten (DFA) Tabellenbasierte Simulation von DFAs
Lexikalische Analyse und Scanner
break;
Verwenden reguläre Ausdrücke zur Definition der lexikalischen Struktur (Symbole/Token) einer Sprache Verwenden die Theorie der regulären Sprachen zur Erzeugung eines Scanners ausgehend von der Beschreibung der lexikalischen Struktur einer Programmiersprache anhand von regulären Ausdrücken
} ")"
{ System.out.println("RPAR"); break; }
.
{ System.out.println("error" + "+" + yytext() + "+"); break; }
7.1-37
Zu reguläre Sprachen, reguläre Ausdrücke, und (deterministische und nichtdeterministische) endliche Automaten siehe vorheriges Kapitel Universität Göttingen - Informatik II - SS 2005
Der Kompilationsprozess (-phasen)
Einführung Lexer Parser Zusammenführung (Bau eines ausführbaren Programms)
Scanner (lexikalische Analyse)
Lese Programm und konvertiere Zeichenstrom in Marken (tokens).
Parser (syntaktische Analyse)
Lese Tokenstrom und generiere Ableitungsbaum (parse tree).
Semantische Analyse
Universität Göttingen - Informatik II - SS 2005
7.1-38
7. Compilerbau
Überblick
break; } {ELSE}
7. Compilerbau
Wichtige Algorithmen
break;
Universität Göttingen - Informatik II - SS 2005
Rückblick
7.1-39
Traversiere Parserbaum, überprüfe nicht-syntaktische Regeln.
Zwischencodegenerierung
Traversiere Parserbaum noch mal, gebe Zwischencode aus.
Optimierung
Untersuche Zwischencode, versuche ihn zu verbessern.
Zielcodegenerierung
Übersetze Zwischencode in Assembler-/Maschinencode
Optimierung Maschinenebene
Untersuche Maschinencode, versuche ihn zu verbessern.
Universität Göttingen - Informatik II - SS 2005
7.1-40
7. Compilerbau
7. Compilerbau
Syntaktische Analyse
Die lexikalische Analyse erzeugt einen Strom von Symbolen (Tokens) Falsche Detailebene für die semantische Analyse und Codegenerierung Die Syntaxanalyse gruppiert eine Zeichenfolge von Tokens in Ableitungsbäume (Struktur-/Parser-/Syntaxbäume), was durch die kontextfreie Grammatik gelenkt wird, die die Syntax der zu kompilierenden Sprache spezifiziert
Beispiel Syntaxanalyse
conditional -> if ( expr ) block else block
Ableitungsbäume repräsentieren die Phrasenstruktur eines Programms und sind die Grundlage für die semantische Analyse und Codegenerierung Die Compilerkomponente zum Ausführen der syntaktischen Analyse ist der Parser, welcher oftmals ausgehend von höheren Spezifikationen automatisch generiert wird
Universität Göttingen - Informatik II - SS 2005
7.1-41
if > i – else j ;
Warum können wir nicht reguläre Ausdrücke zum Beschreiben der Syntax einer Programmiersprache verwenden? Betrachte die folgenden Beschreibungen:
digit=[0-9] letter=[a-z] id=letter.(letter|digit)*
Kann Identitäten von id durch Substitution entfernen: id=[0-9].([a-z]|[0-9])* id ist ein regulärer Ausdruck
Universität Göttingen - Informatik II - SS 2005
expr
id
comp
id
i
>
j
block
)
block
else
statement
statement
id
=
j
id
op
id
j
-
i
id
=
expr
i
id
op
id
i
-
j
expr
7.1-42
Kontextfreie Grammatiken erzeugen durch den Ableitungsprozess Strings (oder Sätze) Die kontextfreien Sprachen sind definiert durch
Identitäten:
(
if
Grammatiken und Parser
i ) i ; = i
7. Compilerbau
Syntaxbeschreibung
( j = j j – }
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
conditional
Token
Identitäten:
digits=[0-9]+ sum=expr.’+’.expr expr=(‘(‘.sum.’)’) | digits
Kann nicht Identitäten von expr durch Substitution entfernen:
expr ist durch Rekursion definiert expr ist kein regulärer Ausdruck
7.1-43
LCF={L(G): Alle kontextfreien Grammatiken G} Mit anderen Worten: Die Menge aller Sprachen von allen kontextfreien Grammatiken
Ein Parser für eine kontextfreie Grammatik erkennt Strings in der Grammatiksprache Parser können automatisch aus einer kontextfreien Grammatik generiert werden Parser zum Erkennen von allgemeinen kontextfreien Sprachen können langsam sein Parser, die nur eine Untermenge von kontextfreien Sprachen erkennen können, können so gestaltet werden, dass sie schneller sind (deterministische Kellerautomaten)
Universität Göttingen - Informatik II - SS 2005
7.1-44
7. Compilerbau
7. Compilerbau
Klassen von Grammatiken und Parsern
Top-down versus Bottom-up Syntaxanalyse (1/2)
LL(k) Parser Eingabe wird von links-nach-rechts (1. L) abgearbeitet
linksseitige Ableitung (2. L)
“top down” oder “prädiktive” (voraussagende) Parser genannt
Top-down oder LL-Syntaxanalyse
LR(k) parsers Eingabe wird von links-nach-rechts (1. L) abgearbeitet
rechtsseitige Ableitung (2. R)
“bottom up” oder “schiebe-reduziere“ (shift-reduce) Parser genannt
“k” steht für die Anzahl von Symbolen (token) für die in der Eingabe vorausgeschaut werden muss um eine Entscheidung treffen zu können
Bottom-up oder LR-Syntaxanalyse
LL(k) – welche nächste Produktion auf der rechten Seite ist bei einer linksseitigen Ableitung zu wählen
LR(k) – ob zu schieben oder reduzieren
Universität Göttingen - Informatik II - SS 2005
7.1-45
Syntaxanalyse durch rekursiven Abstieg (1/4)
Grammatik:
Rekursiver Abstieg ist ein Weg um LL (top-down) Parser zu implementieren
Es ist einfach von Hand zu schreiben
Beispiel Strings: A; A, B, C;
7.1-47
Es wird kein Parsergenerator benötigt
Jedes nichtterminale Symbol in der Grammatik hat einen Prozeduraufruf
Es muss im Stande sein die nächste, anzuwendende, linksseitige Ableitung zu bestimmen (predict), indem nur die nächsten k Symbole angeschaut werden
Universität Göttingen - Informatik II - SS 2005
7.1-46
7. Compilerbau
id_list -> id id_list_tail id_list_tail -> , id id_list_tail id_list_tail -> ;
Baue den Ableitungsbaum von den Blättern aus bis hinauf zu der Wurzel auf Ermittle in jedem Schritt, ob eine Kollektion von Ableitungsbaumknoten zu einem einzelnen Vorgängerknoten zusammengefasst werden kann oder nicht
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Top-down versus Bottom-up Syntaxanalyse (2/2)
Baue den Ableitungsbaum von der Wurzel aus bis hinunter zu den Blättern auf Berechne in jedem Schritt voraus welche Produktion zu verwenden ist um den aktuellen nichtterminalen Knoten des Ableitungsbaumes aufzuweiten (expand), indem die nächsten k Eingabesymbole betrachtet werden
k ist üblicherweise 1
Universität Göttingen - Informatik II - SS 2005
7.1-48
7. Compilerbau
7. Compilerbau
Syntaxanalyse durch rekursiven Abstieg (2/4)
Rekursiver Abstieg ist ein Weg um LL(1)-Parser zu implementieren:
Syntaxanalyse durch rekursiven Abstieg (3/4)
Erinnerung: LL(1)-Parser machen linksseitige Ableitungen, unter Verwendung von höchstens 1 Symbol in der Vorausschau, um zu entscheiden welche rechte Seite einer Produktion verwendet wird, um ein linksseitiges Nichtterminal in einer Satzform zu ersetzen.
Grammatik für eine Kalkulatorsprache
LL(1)-Parser Beispiel:
Grammatikfragment:
Wenn die Satzform “n1 … nk factor sm … sn” lautet, dann sollte die nächste Satzform folgende sein:
factor -> ( expr ) | [ sexpr ]
Beispieleingabe: read A read B sum := A + B write sum write sum / 2
“n1 … nk ( expr ) sm … sn” oder “n1 … nk [ sexpr ] sm … sn”
Universität Göttingen - Informatik II - SS 2005
7.1-49
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
7.1-50
7. Compilerbau
Syntaxanalyse durch rekursiven Abstieg (4/4)
LL-Syntaxanalyse
Ableitungsbaum für Beispieleingabe:
Finde zu einer Eingabe von Terminalsymbolen (tokens) passende Produktionen in einer Grammatik durch Herstellung von linksseitigen Ableitungen
read A read B sum := A + B write sum write sum / 2
Für eine gegebene Menge von Produktionen für ein Nichtterminal, X->y1|…|γn, und einen gegebenen, linksseitigen Ableitungsschritt αXβ ⇒ αγiβ, müssen wir im Stande sein zu bestimmen welches γi zu wählen ist indem nur die nächsten k Eingabesymbole angeschaut werden
Anmerkung:
Universität Göttingen - Informatik II - SS 2005
7.1-51
Für eine gegebene Menge von linksseitigen Ableitungsschritten, ausgehend vom Startsymbol S ⇒ αXβ, wird der String von Symbolen α nur aus Terminalen bestehen und repräsentiert den passenden Eingabeabschnitt zu den bisherigen Grammatikproduktionen
Universität Göttingen - Informatik II - SS 2005
7.1-52
7. Compilerbau
7. Compilerbau
Probleme mit der LL-Syntaxanalyse (1/4)
Probleme mit der LL-Syntaxanalyse (2/4)
Linksrekursion
Produktionen von der Form:
Linksrekursion: Nicht formale Rechtfertigung
A -> Aα A -> β
LL Parser würden in eine Endlosschleife eintreten, wenn versucht wird eine linksseitige Ableitung in solch einer Grammatik vorzunehmen
A -> βA’ A’ -> αA’ | є
7.1-53
A -> bα A -> bβ
LL(1) Parser kann nicht entscheiden welche Regel auszuwählen ist, wenn A in einem linksseitigen Ableitungsschritt zu ersetzen ist, weil beide rechten Seiten mit dem gleichen Terminalsymbol anfangen
7.1-54
stmt -> id stmt_list_tail stmt_list_tail -> expr | ( argument_list )
Der Ausschluss von Linksrekursion und gemeinsame Präfixe garantiert nicht das eine Grammatik LL wird Wenn wir keinen LL Parser für eine Grammatik finden können, dann müssen wir einen mächtigere Technik verwenden
7.1-55
stmt -> id := expr stmt -> id ( argument_list )
Gemeinsame Präfixe können durch das Umschreiben der Grammatik ausgeschlossen werden
A -> bA’ A’ -> α | β
Universität Göttingen - Informatik II - SS 2005
id_list -> id id_list_tail id_list_tail -> , id id_list_tail | ;
Beispiel:
Kann durch Faktorisierung ausgeschlossen werden:
id_list -> id_list_prefix ; id_list_prefix -> id_list_prefix , id | id
Gemeinsame Präfixe
Produktionen der Form:
Tritt auf wenn zwei verschiedene Produktionen mit der gleichen linken Seite mit den gleichen Symbolen anfangen
A ⇒ βA’ ⇒ βαA’ ⇒ βααA’ ⇒* βααα…
Probleme mit der LL-Syntaxanalyse (4/4)
Gemeinsame Präfixe
Ableitungen:
7. Compilerbau
Probleme mit der LL-Syntaxanalyse (3/4)
A -> βA’ A’ -> αA’ | є
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Linksrekursion kann durch das Umschreiben der Grammatik ausgeschlossen werden
Universität Göttingen - Informatik II - SS 2005
Grammatik:
Linksrekursion kann durch das Umschreiben der Grammatik ausgeschlossen werden
Ableitungen:
Umgeschriebene Grammatik:
Linksrekursion: Beispiel
A -> Aα A -> β
A ⇒ Aα ⇒ Aαα ⇒ Aααα ⇒* βααα…
Wenn eine Grammatik linksrekursive Produktionen enthält, dann kann es dafür keinen LL Parser geben
Originalgrammatik:
z.B. LALR(1) – Grammatiken
Universität Göttingen - Informatik II - SS 2005
7.1-56
7. Compilerbau
7. Compilerbau
Bau eines Top-Down Parsers mit rekursivem Abstieg (1/2)
Für jedes Nichtterminal in einer Grammatik wird ein Unterprogramm erzeugt, welches einem einzelnen linksseitigen Ableitungsschritt entspricht, wenn es aufgerufen wird
Beispiel:
factor -> ( expr ) factor -> [ sexpr ]
Bau eines Top-Down Parsers mit rekursivem Abstieg (2/2)
PREDICT-Mengen (Vorhersagemengen)
void factor (void) { switch(next_token()) { case ‘(‘:
PREDICT Mengen teilen uns mit, welche rechte Seite einer Produktion bei einer linken Ableitung auszuwählen ist, wenn mehrere zur Auswahl stehen PREDICT-Mengen dienen somit als Grundlage für Ableitungstabellen (Parse-Tabellen) bzw. sind eine andere Teildarstellungsform für die Tabellen Wird in Form von FIRST-, FOLLOW- und NULLABLE-Mengen definiert :
expr(); match(‘)’); break;
case ‘[‘:
Sei A ein Nichtterminal und α beliebig, dann gilt PREDICT(A->α) = FIRST(α) ∪ FOLLOW(A) wenn NULLABLE(α) PREDICT(A->α) = FIRST(α) wenn nicht NULLABLE(α)
sexpr(); match(‘]’); break; }
Schwieriger Teil:
}
Herausbekommen welches Token den ‚case‘ Arm vom switch Befehl benennt
Universität Göttingen - Informatik II - SS 2005
Sei X ein Nichtterminal NULLABLE(X) ist wahr wenn gilt X ⇒* є (X kann den leeren String ableiten)
Universität Göttingen - Informatik II - SS 2005
7.1-57
7. Compilerbau
7.1-58
7. Compilerbau
FIRST-Mengen
Berechnung von FIRST-Mengen (1/2)
Sei α eine beliebige Folge von Grammatiksymbolen (Terminale und Nichtterminale)
NULLABLE-Mengen
Für alle Grammatiksymbole X wird FIRST(X) berechnet, indem die folgenden Regeln solange angewandt werden, bis zu keiner FIRSTMenge mehr ein neues Terminal oder є hinzukommt:
FIRST(α) ist die Menge aller Terminalsymbolen a mit denen ein aus α abgeleiteter String beginnen kann:
1.
Wenn X ein Terminal ist, dann ist FIRST(X)={X}
FIRST(α) ist { a: α ⇒* aβ}
2.
Wenn X → ε eine Produktion ist, dann füge ε zu FIRST(X) hinzu
Gilt α ⇒* є, dann ist auch є in FIRST(α)
3.
Wenn X Nichtterminal und X → Y1Y2Y3 KYk nehme a zu FIRST(X) hinzu, falls
eine Produktion ist, dann
(a) a für irgendein i in FIRST(Yi) und (b) ein ε in allen FIRST(Y1), ..., FIRST(Yi-1) enthalten ist (Y1...Yi-1 sind alle NULLABLE)
Universität Göttingen - Informatik II - SS 2005
7.1-59
Universität Göttingen - Informatik II - SS 2005
7.1-60
7. Compilerbau
7. Compilerbau
Berechnung von FIRST-Mengen (2/2)
FOLLOW-Mengen
Folglich gilt:
Elemente aus FIRST(Y1) gehören immer auch zu FIRST(X)
Ist є nicht aus Y1 ableitbar (NICHT NULLABLE), dann brauch nichts mehr hinzugefügt werden
Ist є aus Y1 ableitbar (NULLABLE), dann muss auch FIRST(Y2) zu FIRST(X) hinzugefügt werden
Ist є aus Y2 ableitbar (NULLABLE), dann muss auch FIRST(Y3) zu FIRST(X) hinzugefügt werden usw.
Sei A ein Nichtterminal
FOLLOW(A) ist die Menge aller Terminalsymbole a, die in einer Satzform direkt rechts neben A stehen können ( sei S Startregel; α, β beliebig):
FOLLOW(A) ist { a:S ⇒* αAaβ }
Achtung: Zwischen A und a können während der Ableitung Symbole gestanden haben, die aber verschwunden sind, weil aus Ihnen є abgeleitet wurde!
Gibt es eine Satzform, in der A das am weitesten rechts stehende Symbol ist, dann gehört auch $ (die Endemarkierung) zu FOLLOW(A)
є wird nur zu FIRST(X) hinzugefügt, wenn es in allen Mengen FIRST(Y1), ... ,FIRST(Yk) enthalten ist
Universität Göttingen - Informatik II - SS 2005
7.1-61
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
7. Compilerbau
Berechnung von FOLLOW-Mengen
7.1-62
Beispiel für NULLABLE-, FIRST- und FOLLOW-Mengen
Follow(A) wird für alle Nichtterminale A berechnet, indem die folgenden Regeln solange angewandt werden, bis keine FollowMenge mehr vergrößert werden kann:
S -> s$
B -> є
A -> B
S -> A B S
B -> b
A -> a
Schritt 1: i=0 1.
2.
3.
Sei S das Startsymbol und $ die Endemarkierung, dann nehme $ in FOLLOW(S) auf Wenn es eine Produktion A → αBβ gibt, dann wird jedes Element von FIRST(β ) mit Ausnahme von ε auch in FOLLOW(B) aufgenommen.
NULLABLE
FIRST
FOLLOW
A
False
{a}
{}
B
True
{b, є}
{}
S
False
{s}
{$}
NULLABLE
FIRST
FOLLOW
A
True
{a,b,є}
{b}
B
True
{b, є}
{s}
S
False
{s,a}
{$}
Schritt 3: i=2
Wenn es Produktionen A → αB oder A → αBβ gibt und FIRST(β ) enthält (d.h. β ⇒*ε ), dann gehört jedes Element von FOLLOW(A) auch zu FOLLOW(B)
Universität Göttingen - Informatik II - SS 2005
Schritt 2: i=1
ε
7.1-63
Schritt 4: i=3
NULLABLE
FIRST
FOLLOW
NULLABLE
FIRST
FOLLOW
A
True
{a,b,є}
{b,s}
A
True
{a,b,є}
{b,s,a}
B
True
{b, є}
{s,a}
B
True
{b, є}
{s,a,b}
S
False
{s,a,b}
{$}
S
False
{s,a,b}
{$}
Universität Göttingen - Informatik II - SS 2005
7.1-64
7. Compilerbau
7. Compilerbau
Beispiel für PREDICT-Mengen
LL(k) Eigenschaften NULLABLE
FIRST
FOLLOW
B -> є
A -> B
A
True
{a,b,є}
{b,s,a}
S -> A B S B -> b
A -> a
B
True
{b, є}
{s,a,b}
S
False
{s,a,b}
{$}
S -> s$
Satz: Jede kontextfreie Grammatik G ist genau dann LL(1), wenn für alle Alternativen A ⇒ α1| α2 | ... | αn gilt 1. 2.
PREDICT A->B
{a,b,є,s}
A->a
{a}
B->є
{a,b,s}
B->b
{b, є}
S->s$
{s}
S->ABS
{a,b,s}
PREDICT-Mengen zeigen uns welche Menge von look-ahead Symbolen die rechte Seite einer Produktion selektiert Diese Grammatik ist NICHT LL(1), da es duplizierte Symbole in den PREDICT-Mengen für alle drei Nichtterminale gibt
Siehe Hervorhebungen (dick, rot)
Universität Göttingen - Informatik II - SS 2005
7.1-65
Satz: Sei G kontextfreie Grammatik, k ≥ 0. G ist genau dann LL(k), wenn gilt: Sind A ⇒ β, A ⇒ ζ verschiedene Produktionen, dann Firstk(βα) ∩ FIRSTk(ζα) = Ø für alle α, σ mit S ⇒* σ A α 7.1-66
7. Compilerbau
Ableitungsbäume und Parser mit rekursivem Abstieg (1/2) Die Beispielparser auf die wir bisher geschaut haben sind nur Erkenner
Aus α1, α2 , ... und αn sind jeweils keine Strings ableitbar, wo zwei mit dem gleichen Nichtterminal anfangen Der leere String є kann nicht sowohl aus αi und αj für i ≠ j abgeleitet werden Falls αi ⇒* є gilt, dann beginnt kein aus αi ableitbarer String mit einem Terminal aus FOLLOW(A)
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
FIRST(α1), ..., First(αn) paarweise disjunkt, falls αi ⇒* є gilt, dann FIRST1(αj) ∩ FOLLOW1(A) = Ø für 1 ≤ j ≤ n, j ≠ i In Worten:
Ableitungsbäume und Parser mit rekursivem Abstieg (2/2)
Beispiel: Jedes nichtterminale Unterprogramm konstruiert einen Ableitungsbaumknoten node *factor (void) {
Sie bestimmen, ob eine Eingabe syntaktisch korrekt ist, aber bauen keinen Ableitungsbaum
factor -> ( expr ) factor -> [ sexpr ]
switch(next_token()) { case ‘(‘: node = factor_node(expr());
Wie konstruieren wir dann einen Ableitungsbaum?
match(‘)’); break;
In Parser mit rekursivem Abstieg machen wir für jede nichtterminale Funktion:
case ‘[‘:
Konstruktion eines korrekten Ableitungsbaumknoten für sich selbst und Verbindungen zu seinen Kindern Geben den konstruierten Ableitungsbaumknoten an den Aufrufer zurück
node = factor_node(sexpr());
Nicht alle Symbole werden zu einem Ableitungsbaumknoten
Universität Göttingen - Informatik II - SS 2005
7.1-67
Beispiele: ‘(‘, ‘)’, ‘[‘, ‘]’
Diese Art von Ableitungsbaum } wird „Abstrakter Syntaxbaum“ (abstract syntax tree, AST) genannt
Universität Göttingen - Informatik II - SS 2005
match(‘]’); break; } return node;
7.1-68
7. Compilerbau
7. Compilerbau
Parsergeneratoren und Syntaxanalyse
Parsergeneratoren erzeugen ausgehend von der kontextfreien Grammatik einen Parser An Produktionen dürfen semantische Aktionen angehängt sein
ANTLR als Beispiel eines Parsergenerators
ANTLR Grammatikspezifikation (parser.g)
Wenn ein Parser eine Produktion erkannt hat, dann wird die semantische Aktion aufgerufen Wird hauptsächlich dazu verwendet einen Ableitungsbaum explizit zu konstruieren
Die Ausgabe eines Parsergenerators ist ein Programm in einer Hochsprache (z.B. C, C++, oder Java) welches einen Symbolstrom (token stream) von einem Lexer (für die lexikalische Analyse) entgegen nimmt und welches einen Ableitungsbaum für die nachfolgenden Compilerphasen produziert
ANTLR
lexikalischer Analysator (scanner.class)
Eingabe 10+(27-5); (44-2)-(1-10);
java parser.class
(java antlr.Tool parser.g)
symbols.java
parser.java
Ausgabe =32 =51
javac parser.java
Universität Göttingen - Informatik II - SS 2005
7.1-69
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
7. Compilerbau
Rückblick
Auflösung von Linksrekursion und gemeinsame Präfixe
Syntaktische Analyse und Parser
Überblick
Wichtige Algorithmen:
7.1-70
Die Syntax einer Programmiersprache wird mit KFGs spezifiziert Konstruktion eines Parsers mit rekursivem Abstieg anhand von KFGs Automatische Generierung von Parsern anhand von KFGs Parser erzeugen Ableitungsbäume für die Analyse und weitere Verarbeitung in den nachfolgenden Compilerphasen
Einführung Lexer Parser Zusammenführung (Bau eines ausführbaren Programms)
Unwichtig für Klausur, da nur für Satz über LL(k) notwendig
FIRST, FOLLOW, NULLABLE und PREDICT Mengen für kontextfreie Grammatiken
Zu kontextfreie Grammatiken (KFG), Sprachen (KFS) und Kellerautomat siehe vorheriges Kapitel Universität Göttingen - Informatik II - SS 2005
7.1-71
Universität Göttingen - Informatik II - SS 2005
7.1-72
7. Compilerbau
7. Compilerbau
Der Kompilationsprozess (-phasen)
Die Organisation eines typischen Compilers
Scanner (lexikalische Analyse)
Lese Programm und konvertiere Zeichenstrom in Marken (tokens). Theorie: Reguläre Ausdrücke, endlicher Automat
Parser (syntaktische Analyse)
Lese Tokenstrom und generiere Ableitungsbaum (parse tree). Theorie: Kontextfreie Grammatiken, Kellerautomat Traversiere Parserbaum, überprüfe nicht-syntaktische Regeln.
Semantische Analyse Zwischencodegenerierung
Traversiere Parserbaum noch mal, gebe Zwischencode aus.
Optimierung
Untersuche Zwischencode, versuche ihn zu verbessern.
Zielcodegenerierung
Übersetze Zwischencode in Assembler-/Maschinencode
Optimierung Maschinenebene
Untersuche Maschinencode, versuche ihn zu verbessern.
Universität Göttingen - Informatik II - SS 2005
7.1-73
7. Compilerbau
Ein kleines Programm, geschrieben in Pascal, welches den größten gemeinsamen Teiler (ggT) von zwei Ganzzahlen berechnet
Führt Operationen aus welche von der zu kompilierenden Sprache abhängen und nicht von der Zielmaschine
Backend
Führt Operationen aus welche etwas Wissen über die Zielmaschine haben müssen
Universität Göttingen - Informatik II - SS 2005
7.1-74
7. Compilerbau
Schreiben des Programms
Frontend
Vom Text des Quellcodes zu den Tokens
program gcd (input, output); var i, j : integer; begin read(i,j); while i j do if i > j then i := i – j else j :- j – i; writeln(i) end.
Programmquelltext program gcd (input, output); var i, j : integer; begin read(i,j); while i j do if i > j then i := i – j else j :- j – i; writeln(i) end.
Tokens program
gcd
(
input
,
output
)
;
var
i
,
j
:
integer
;
begin
read
(
i
,
j
)
;
while
i
j
do
if
i
…
Universität Göttingen - Informatik II - SS 2005
7.1-75
Universität Göttingen - Informatik II - SS 2005
7.1-76
7. Compilerbau
7. Compilerbau
Von den Tokens zum Ableitungsbaum
Zwischencode
Programmquelltext
Ableitungsbaum und Symboltabelle
program gcd (input, output); var i, j : integer; begin read(i,j); while i j do if i > j then i := i – j else j :- j – i; writeln(i) end.
Universität Göttingen - Informatik II - SS 2005
7.1-77
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Zielcode
Der Kontrollflussgraph wird zum Zielcode der Zielmaschine konvertiert Der Zielcode ist eine andere pseudo-Assemblersprache Der Kontrollfluss wird ausführlich gemacht durch:
7.1-78
7. Compilerbau
Nicht optimierende Compiler
Der Ableitungsbaum wird zu einem Kontrollflussgraphen konvertiert Die Knoten des Kontrollflussgraphen sind grundlegende Blöcke und enthalten eine pseudoAssemblersprache Die Kontrolle kann einen grundlegenden Block nur vom Anfang betreten und kann in nur am Ende wieder verlassen
Der Zielcode ist beinahe Assemblercode
Bezeichnen der Anfänge der grundlegenden Blöcke Konvertieren der Kontrollflusskanten zu Sprung- (branch), Aufruf(call) und Rückkehrinstruktionen
Der Kontrollfluss ist ausführlich Der Code referenziert nur reale Registernamen Anweisungen zum Speicherreservieren sind vorhanden
Zielcode ist einfach zu Assemblercode zu übersetzen
Virtuelle Register werden durch reale Register ersetzt
Universität Göttingen - Informatik II - SS 2005
7.1-79
Universität Göttingen - Informatik II - SS 2005
7.1-80
7. Compilerbau
7. Compilerbau
Vom Zielcode zum Assemblercode
Normalerweise einfach:
Binden (linking)
r10 := r8 + r9 -> add $10, $8, $9 r10 := r8 + 0x12 -> addi $10, $8, 0x12
Manchmal auch zu einer Folge von Instruktionen erweitert:
r14 := 0x12345abc ->
lui $14, 0x1234 ori $14, 0x5abc
Universität Göttingen - Informatik II - SS 2005
7.1-81
Beim Binden werden mehrere durch den Assembler erzeugte Objektdateien zu einer einzelnen, ausführbaren Datei kombiniert, welche durch ein Betriebssystem lauffähig ist
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
7. Compilerbau
Optimierende Compiler
Peephole-Optimierung
Optimierung ist ein komplexer Prozess Verbessert die Qualität des generierten Codes auf Kosten von zusätzlicher Compilezeit Optimierer sind schwierig zu schreiben und einige Optimierungen verbessern das fertige Programm vielleicht nicht
Sehe dir den Zielcode an, wenige Instruktionen gleichzeitig, und versuche einfache Verbesserungen zu machen Versucht kurze, sub-optimale Folgen von Instruktionen zu finden und ersetzt diese Sequenzen mit einer „besseren“ Sequenz Sub-Optimale Sequenzen werden durch Muster (patterns) spezifiziert
Praxistip: Die jeweilige Einstellung der Optimierungstiefe eines Compilers genau auf korrekte Funktion kontrollieren, da diese öfters fehleranfällig sind (lieber erstmal auf Optimierung verzichten und erst am Ende austesten!) Universität Göttingen - Informatik II - SS 2005
7.1-82
7.1-83
Meistens heuristische Methoden — Es gibt keinen Weg um zu überprüfen ob das Ersetzen eines sub-optimalen Musters tatsächlich das endgültige Programm verbessern wird
Einfach und ziemlich wirksam
Universität Göttingen - Informatik II - SS 2005
7.1-84
7. Compilerbau
7. Compilerbau
Peephole-Optimierungstypen (1/3)
Peephole-Optimierungstypen (2/3)
Redundante load/store Instruktionen beseitigen
r2 i r3 r4
:= := := :=
r1 + 5 r2 i r3 x 3
wird zu
r2 := 4 r3 := r1 + r2 r2 := …
r2 := r1 + 5 i := r2 r4 := r2 x 3
wird zu
r2 := 3 x 2
r2 := 6
Entfernung gemeinsamer Teilausdrücke (common subexpression elimination)
r2 := r1 x r5 r2 := r2 + r3 r3 := r1 x r5
wird zu
7.1-85
Algebraische Vereinfachung (strength reduction)
und
r3 := *(r1+4)
r2 := r1
wird zu r3 := r1 + r1 r2 := 5
und
r3 := r1 + r1 r2 := 5 7.1-86
Es ist für den Optimierer erforderlich den Datenfluss zwischen Registern und Speicher zu „verstehen“
wird zu
r1 := r2 + r2 r1 := r2 >> 1
Beseitigung von unnötigen Instruktionen
wird zu
Universität Göttingen - Informatik II - SS 2005
Wird durch Datenflussanalyse (data flow analysis) bestimmt
oder r1 := r2 30.0) { schalte_ventilator_ein(); }
Abstraktion
Abstraktum
Digitale Logik Computerarchitektur Assemblersprache Betriebssystem Computerkommunikation
Transistoren Digitale Logik Maschinensprache Allokation von Ressourcen (Zeit, Speicher, etc.) (Physikalische) Netzwerke, Protokolle
Universität Göttingen - Informatik II - SS 2005
7.2-2
Beinhaltet eine komplexe aber konkrete Sequenz von Aktionen:
7.2-3
lese Thermostat; konvertiere den Ablesewert zu einer IEEE Fliesskomazahl nach der Celsiusskala; Vergleiche den Wert mit 30.0; wenn größer dann sende ein Signal an eine PCI Karte, welche ein Signal an ein Relais sendet, welches den Ventilator einschaltet
Die Bedeutung dieses Ausdrucks ist festgelegt durch die formale Semantik der Programmiersprache und der Implementierung der Funktionen temperatur() und schalte_ventilator_ein(). Universität Göttingen - Informatik II - SS 2005
7.2-4
7. Compilerbau
7. Compilerbau
Wie abstrahieren Programmiersprachen Berechnungen? (1/4) Biete eine Notation für den Ausdruck von Algorithmen welche
2.
Befehlsnamen der Assemblersprache, Registernamen, Argumentordnung, etc. Abbildung von Sprachelementen auf die Assemblersprache Arithmetische Ausdrücke, Bedingungen, Konventionen für Prozeduraufrufe, etc.
wie der Algorithmus in einer Maschinensprache implementiert wird, wie Hilfsalgorithmen, z.B. Hash-Tabellen, Listen, implementiert werden,
es dem Programmierer erlaubt seine eigene Abstraktion (Unterprogramme, Module, Bibliotheken, Klassen, etc.) zu bauen um die Weiterführung des Konzepts „Komplexitätsmanagement durch Schichtenbildung“ zu ermöglichen.
Universität Göttingen - Informatik II - SS 2005
7.2-5
7. Compilerbau
Biete Grundbefehle (primitives), Unterprogramme und Laufzeitunterstützung für übliche (lästige) Programmierpflichten
RC SPA
.L1: .L2:
%l1,10,%l2 %l0,%l2 .L1; nop do_1; nop .L2; nop do_2; nop
L1: L2:
addi bge call b call …
$t2,$t1,10 $t0,$t2,L1 do_1 L2 do_2
MI PS
Universität Göttingen - Informatik II - SS 2005
7.2-6
Wie abstrahieren Programmiersprachen Berechnungen? (4/4) Biete Merkmale welche eine besondere Art von Algorithmus oder Softwareentwicklung unterstützen (encourage) oder durchsetzen (enforce)
Lesen und schreiben von Dateien Handhabung von Zeichenfolgen (Vergleiche, Erkennung von Teilzeichenfolge, etc.) Dynamische Allokation von Speicher (new, malloc, etc.) Rückgewinnung von unbenutztem Speicher (garbage collection) Sortieren etc.
Universität Göttingen - Informatik II - SS 2005
if (a < b + 10) { do_1(); } else { do_2(); }
add cmp bge call ba call …
7. Compilerbau
Wie abstrahieren Programmiersprachen Berechnungen? (3/4) 3.
Verberge unterliegende (systemnahe) Details der Zielarchitektur
SPARC
(meistens) unabhängig von der Maschine ist auf welcher der Algorithmus ausgeführt wird, Fähigkeiten (features) auf höchster Ebene bietet und die Aufmerksamkeit des Programmierers mehr auf den Algorithmus fokussiert und weniger auf
MIPS
1.
Wie abstrahieren Programmiersprachen Berechnungen? (2/4)
Strukturiertes Programmieren Unterprogramme Verschachtelte (Nested) Variablenbereiche (scopes) Schleifen Beschränkte Formen des „goto“ Befehls (statement??)
7.2-7
Universität Göttingen - Informatik II - SS 2005
Objekt-Orientierte Programmierung Klassen Vererbung Polymorphismus
7.2-8
7. Compilerbau
7. Compilerbau
Kategorien von Programmiersprachen
Imperative Sprachen (1/2)
Alle Sprachen fallen in eine der beiden folgenden Kategorien:
Die von Neumann Sprachen
Imperative Sprachen erfordern die schrittweise Beschreibung durch Programmierer wie ein Algorithmus seine Aufgabe erledigen soll. Analogie aus der realen Welt: „Ein Rezept ist eine Art von imperativem Programm, welches einem Koch sagt wie ein Gericht zuzubereiten ist.“
schließen Fortran, Pascal, Basic und C ein stellen eine Reflektion der von Neumann Computerarchitektur dar, auf welcher die Programme laufen Führen Befehle aus welche den Zustand des Programms (Variablen/Speicher) ändern Manchmal auch Berechnung durch Seiteneffekte genannt
Beispiel: Aufsummieren der ersten n Ganzzahlen in C
Deklarative Sprachen erlauben die Beschreibung durch Programmierer was ein Algorithmus erledigen soll ohne exakt zu beschreiben wie es getan werden soll.
for(sum=0,i=1;i 0) { c = foo(n-1); } c = c * (a + b); }
Daher können wir für eine einzelne, mögliche Aktivierung für jedes Unterprogramm eines Programms den Speicher statisch reservieren
Universität Göttingen - Informatik II - SS 2005
Wir können n Aktivierungen von foo() haben und jede benötigt Speicherplatz um die eigenen Kopien von a, b, c, Übergabeargument n und jeden temporären, vom Compiler generierten Wert zu speichern
7.2-53
7. Compilerbau
Universität Göttingen - Informatik II - SS 2005
7.2-54
7. Compilerbau
Allokation über einen Stack (2/2)
Allokation über einen Heap Wir wissen wie Code für Globales, Lokales, Konstanten, Temporäres, etc. allokiert wird Was bleibt übrig:
Die Lösung für das Rekursionsproblem ist die Allokation über einen Stack (stack allocation)
Dynamisch allokierte Objekte Warum können diese nicht statisch allokiert werden? Weil sie dynamisch erzeugt werden
„Push“ Stack um Platz für Lokales (locals) für Unterprogrammaufrufe zu reservieren
Warum können diese nicht auf einem Stack allokiert werden? Ein Objekt, welches dynamisch von einem Unterprogramm erzeugt wurde, könnte die Aktivierung des Unterprogramms überleben Beispiel: Objekt wird einem Globalen zugewiesen oder von dem Unterprogramm zurückgegeben
„Pop“ Stack um Platz für Lokales (locals) bei der Rückkehr von einem Unterprogramm wieder freizugeben
Heaps lösen dieses Problem Ein Heap ist eine Speicherregion in welcher Speicherblöcke jederzeit willkürlich allokiert und wieder freigegeben werden können
Wie sind Heaps implementiert? Wie handhaben wir Anfragen zur Allokation und Freigabe?
Universität Göttingen - Informatik II - SS 2005
7.2-55
Universität Göttingen - Informatik II - SS 2005
7.2-56
7. Compilerbau
7. Compilerbau
Heap-Management (1/4)
Heap-Management (2/4)
Heap
Heap
Allokationsanforderung
Allokationsanforderung
Wir bekommen eine Allokationsanforderung für n Bytes vom Speicher Der Heap hat verwendete (dunkle) und freie (helle) Bereiche Wie wählen wir einen freien Bereich um eine Allokationsanforderung zu befriedigen? Einfache Antwort: Finde den ersten freien Bereich welcher groß genug ist der Allokation zu entsprechen (wird first fit genannt) Problem: interne Fragmentierung Wenn wir n Bytes anfordern und der erste, verfügbare freie bereich hat n+k Bytes, dann verschwenden wir k Bytes durch die Allokation im ersten Bereich Universität Göttingen - Informatik II - SS 2005
7.2-57
7. Compilerbau
Eine bessere Antwort (vielleicht): Finde den ersten Bereich, welcher von der Größe am nächsten zur Allokationsanforderung ist (wird best fit genannt) Problem: Zeitaufwendiger Muss alle freie Blöcke finden um den Besten zu finden Es kann immer noch interne Fragmentierung geben, aber hoffentlich weniger als bei first fit
Universität Göttingen - Informatik II - SS 2005
7. Compilerbau
Heap-Management (3/4)
Heap-Management (4/4)
Heap
Heap
Allokationsanforderung
Allokationsanforderung
Ein anderes Problem: externe Fragmentierung Wir bekommen eine Allokationsanforderung für n Bytes und der Heap hat mehr als n Bytes frei, aber
Wie handhaben wir die Freigabe? Explizit: Der Programmierer muss dem Heap-Manager mitteilen dass ein Bereich nicht länger vom Programm verwendet wird
kein einzelner freier Bereich ist n Bytes groß oder größer
Wir haben genügend freien Speicher, aber wir können die Allokationsanforderung nicht befriedigen
Beispiel: verwende in C free(p) um den Bereich freizugeben auf den p zeigt
Automatisch:
Mögliche Lösungen: Vereinigung von Bereichen: wenn zwei benachbarte Bereiche mit j und k Bytes frei sind, dann vereinige diese zu einem einzelnen, freien Bereich mit j+k Bytes Ist eine Verbesserung, aber kann nicht alle externen Fragmentierungen eliminieren Universität Göttingen - Informatik II - SS 2005
7.2-58
7.2-59
Das Laufzeitsystem bestimmt welche Objekte auf dem Heap lebendig (sprich immer noch an Namen gebunden sind) oder tot (sprich nicht länger zu irgendeinem Namen gebunden sind) sind und gibt die toten Objekte automatisch frei Wird Garbage Collection (Speicherbereinigung) genannt Universität Göttingen - Informatik II - SS 2005
7.2-60
7. Compilerbau
7. Compilerbau
Speicherbereinigung (Garbage Collection) (1/2)
Speicherbereinigung (Garbage Collection) (2/2)
Warum verwenden wir Speicherbereinigung?
Warum Speicherbereinigung nicht verwenden?
Verhindert: Speicherlöcher (memory leak): Programmierer können die Freigabe von dynamisch allokiertem Speicher vergessen Dangling pointers: Programmierer können ein Objekt freigeben bevor alle Referenzen darauf zerstört sind
Reduzieren den Programmieraufwand und resultiert in zuverlässigeren Programmen
Teuer: Festzustellen welche Objekte lebendig und welche tot sind kostet Zeit Schlecht für Echtzeitsysteme: Können normalerweise nicht garantieren wann die Speicherbereinigung laufen wird und wie lange es dauern wird Schwierig zu implementieren: Das Schreiben einer Speicherbereinigung ist schwierig und macht den Compiler und die Laufzeit einer Sprache komplizierter Sprachdesign: Einige Sprachen wurden nicht mit dem Gedanken an eine Speicherbereinigung entworfen, was es schwierig machte eine Speicherbereinigung zuzufügen
Universität Göttingen - Informatik II - SS 2005
7.2-61
7. Compilerbau
Universität Göttingen - Informatik II - SS 2005
7.2-62
7. Compilerbau
Weiterführende Spracheigenschaften und Bindungen
Implementierung von statischen Gültigkeitsbereichen (1/2)
Wie implementieren wir statische Gültigkeitsbereiche in Sprachen die verschachtelte Unterprogramme erlauben? Wie implementieren wir Referenzen auf Unterprogramme?
Problem: Von c(), wie referenzieren wir nichtlokale Variablen in a() und b()?
void a (void) { int foo1; void b (void) { int foo2; void c (void) { int foo3 = foo1 + foo2; } void d (void) { } } void e (void) { } }
Universität Göttingen - Informatik II - SS 2005
7.2-63
Universität Göttingen - Informatik II - SS 2005
7.2-64
7. Compilerbau
7. Compilerbau
Implementierung von statischen Gültigkeitsbereichen (2/2) Lösung: statische Links
Große Frage:
Jede Aktivierung eines Unterprogramms speichert einen Zeiger zum nächsten, umgebenden Gültigkeitsbereich in seinem Stackrahmen c() bekommt seine eigenen Lokalen von seinem eigenen Stackrahmen c() bekommt die Nichtlokalen in b() durch die einmalige Dereferenzierung seines statischen Links c() bekommt die Nichtlokalen in a() durch die Dereferenzierung seines statischen Links zu b() und dann b()‘s statischen Link zu a() Universität Göttingen - Informatik II - SS 2005
Wie wenden wir Gültigkeitsbereichsregeln in Sprachen an wo Unterprogramme als Wert übergeben werden können?
Zwei Antworten: Flache Bindung (shallow binding): Referenzierende Umgebung wird sofort festgestellt bevor das referenzierte Unterprogramm aufgerufen wird Ist normalerweise der Standard in Sprachen mit dynamischen Gültigkeitsbereichen
Tiefe Bindung (deep binding): Referenzierende Umgebung wird festgestellt wenn die Referenz auf das Unterprogramm erzeugt wird
7.2-65
7. Compilerbau
Universität Göttingen - Informatik II - SS 2005
7.2-66
7. Compilerbau
Tiefe vs. flache Bindung
Implementierung von Referenzen auf Unterprogramme - 2
Flache Bindung (shallow)
Zum Abschluss
Nötig für die line_length Zuweisung in print_selected_records um das print_person Unterprogramm zu erreichen
Ein Zeiger auf den Code des Unterprogramms und ein Zeiger auf die referenzierende Umgebung des Unterprogramms
Warum benötigen wir einen Zeiger auf die referenzierende Umgebung? Wir müssen einen Weg für das Unterprogramm haben mit welcher es Zugriff auf seine nichtlokalen, nichtglobalen Variablen hat
Tiefe Bindung (deep) Nötig für die threshold Zuweisung im Hauptprogramm um das older_than Unterpogramm zu erreichen
Universität Göttingen - Informatik II - SS 2005
Implementierung von Referenzen auf Unterprogramme - 1
Für Sprachen mit dynamischen Gültigkeitsbereichen schließt dies Variablen in den umschließenden, dynamisch verschachtelten Unterprogrammen ein (Unterprogramme die andere aufrufen) Für Sprachen mit statischen Gültigkeitsbereichen schließt dies Variablen in den umschließenden, statisch verschachtelten Unterprogrammen ein
7.2-67
Universität Göttingen - Informatik II - SS 2005
7.2-68
7. Compilerbau
7. Compilerbau
Zusammenfassung
Überblick
Lebensdauer von Objekten
Einführung Programmiersprachen Namen, Bindungen und Gültigkeitsbereiche Speichermanagement und Implementierung Kontrollfluss
Die Zeitperiode während der ein Name an ein Objekt (Variable, Unterprogramm, etc.) gebunden ist
Speichermanagement Statische Allokation, Stacks und Heaps
Weiterführende Spracheigenschaften und Bindungen Implementierung von statischen Gültigkeitsbereichen für verschachtelte Unterprogramme Links auf Stackrahmen ablegen
Implementierung von Unterprogrammreferenzen Ein Zeiger auf den Code des Unterprogramms und ein Zeiger auf die referenzierende Umgebung des Unterprogramms (flache und tiefe Bindung)
Universität Göttingen - Informatik II - SS 2005
7.2-69
7. Compilerbau
7.2-70
7. Compilerbau
Was fehlt uns noch?
Kontrollfluss (control flow)
Kontrollfluss
Das Offensichtliche: Programme machen ihre Arbeit durch ausführen von Berechnungen
Spezifikation der Reihenfolge in welcher Elemente einer höheren Programmiersprache ausgeführt werden
Kontrollfluss (control flow) spezifiziert die Reihenfolge in welcher Berechnungen ausgeführt werden
Kontrollflussmechanismen Anweisungen (statements), Schleifen, Unterprogrammaufrufe, Rekursion, etc. Übersetzung zu ausführbarem Code
Universität Göttingen - Informatik II - SS 2005
Universität Göttingen - Informatik II - SS 2005
Sprachen stellen eine große Vielfalt von Kontrollflussmechanismen (control flow mechanism) bereit welche es dem Programmierer erlauben den Kontrollfluss zu spezifizieren
7.2-71
Universität Göttingen - Informatik II - SS 2005
7.2-72
7. Compilerbau
7. Compilerbau
Kontrollfluss und Kontrollflussmechanismen
Wichtige Fragen
Iterationen (Wiederholungen) Führt eine Gruppe von Berechnungen mehrmals aus (repeatedly) Eine von sieben Kategorien von Kontrollflussmechanismen
Wie implementieren Sprachen Iterationen? Schleifen: C, C++, Java
for(i=0;i=
Assoziativität von links nach rechts
von rechts nach links
Multiplikatiom, Division Modulo Addition, Subtraktion
von links nach rechts von links nach rechts
bitweises Schieben Vergleich gößer/kleiner gleich/ungleich bitweises und bitweises exklusiv-oder
von links nach rechts von links nach rechts von links nach rechts von links nach rechts von links nach rechts
bitweises oder logisches und logisches oder bedingte Auswertung Wertzuweisung kombinierte Zuweisung
von links nach rechts von links nach rechts von links nach rechts von rechts nach links von rechts nach links
Kommaoperator
von links nach rechts
7. Compilerbau
Mehr zur Evaluierungsordnung von Ausdrücken (1/2)
Mehr zur Evaluierungsordnung von Ausdrücken (2/2)
Prioritäten und Assoziativität können nicht immer eine Evaluierungsreihenfolge festlegen
Boolesche Ausdrücke
Beispiel: a – f(b) – c * d Mit Prioritäten ergibt sich a – f(b) – (c * d) und weiter mit Assoziativität (a – f(b)) - (c * d) Aber welches wird zuerst ausgeführt: a-f(b) oder (c*d)? Warum kümmert uns das?
Seiteneffekte
Ausdrücke die eine logische Operation ausführen und entweder zu wahr (true) oder falsch (false) evaluieren Beispiele: a