Vogt Nebenläufige Programmierung
1. Auflage 2012
ISBN: 978-3-446-43201-7
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)
Ein Arbeitsbuch mit UNIX/Linux und Java
E-Book, Deutsch, 266 Seiten
ISBN: 978-3-446-43201-7
Verlag: Hanser, Carl
Format: PDF
Kopierschutz: Adobe DRM (»Systemvoraussetzungen)
Das Buch beschränkt sich bewusst auf die Programmierung nebenläufiger Software mit den Mitteln, die weit verbreitete Sprachen wie C unter UNIX/Linux oder Java bereitstellen. Hardware-Nebenläufigkeit wird daher nur sehr knapp behandelt. In vier Hauptkapiteln werden Begriffe, Techniken, Probleme und Lösungen bei der Erstellung nebenläufiger Programme behandelt. Die Themen werden zunächst unabhängig von einer bestimmten Programmiersprache diskutiert und dann am Beispiel der C-Schnittstelle von UNIX/Linux sowie von Java in die Programmierpraxis umgesetzt. Jedem der Hauptkapitel ist eine umfangreiche Sammlung von Aufgaben zugeordnet, von denen ein Teil unter http://www.fh-koeln.de/nebenlaeufigkeit zu finden ist.
Autoren/Hrsg.
Weitere Infos & Material
1;Vorwort;6
2;Inhalt;8
3;1 Einführung;14
4;2 Basistechniken;20
4.1;2.1 Formen der Nebenläufigkeit;21
4.1.1;2.1.1 Hard- und Software – eine Kurzeinführung;21
4.1.1.1;2.1.1.1 Computer-Hardware;21
4.1.1.2;2.1.1.2 Computer-Software;22
4.1.2;2.1.2 Nebenläufigkeit in Hardware;23
4.1.3;2.1.3 Nebenläufigkeit in Software;25
4.2;2.2 Die Rolle des Betriebssystems;26
4.2.1;2.2.1 Systemarchitekturen;26
4.2.1.1;2.2.1.1 Aufgaben und Schnittstellen;26
4.2.1.2;2.2.1.2 Virtualisierung;29
4.2.1.3;2.2.1.3 Netzdienste und verteilte Systeme;31
4.2.2;2.2.2 Betriebsarten;33
4.2.3;2.2.3 Prozesse und Threads;35
4.2.3.1;2.2.3.1 Prozesse;35
4.2.3.2;2.2.3.2 Threads;37
4.2.3.3;2.2.3.3 Der Lebenszyklus;38
4.2.4;2.2.4 Implementierungsaspekte;40
4.2.4.1;2.2.4.1 Buchführung;40
4.2.4.2;2.2.4.3 Scheduling;41
4.3;2.3 Prozesse und Threads in UNIX/Linux;43
4.3.1;2.3.1 Kommandos der Benutzerschnittstelle;43
4.3.2;2.3.2 Grundlegende API-Funktionen für Prozesse;46
4.3.2.1;2.3.2.1 Die Funktion fork();47
4.3.2.2;2.3.2.2 Weitere Funktionen;49
4.3.2.3;2.3.2.3 Programmbeispiele;51
4.3.3;2.3.3 Grundlegende API-Funktionen für Threads;56
4.3.3.1;2.3.3.1 Pthreads: pthread_create(), pthread_exit();56
4.3.3.2;2.3.3.2 Pthreads: pthread_join(), pthread_cancel();59
4.3.3.3;2.3.3.3 vfork() und clone();60
4.4;2.4 Threads in Java;61
4.4.1;2.4.1 Die Klasse Thread;61
4.4.1.1;2.4.1.1 run() und start();62
4.4.1.2;2.4.1.2 join();64
4.4.1.3;2.4.1.3 Weitere Methoden;65
4.4.2;2.4.2 Grundlegende Programmiertechniken;65
4.4.2.1;2.4.2.1 Zugriff auf gemeinsame Variablen;65
4.4.2.2;2.4.2.2 Beenden von Threads;66
4.5;2.5 Zusammenfassung und Ausblick;68
5;2A Basistechniken: Aufgaben;70
5.1;2A.1 Wissens- und Verständnisfragen;70
5.2;2A.2 Sprachunabhängige Anwendungsaufgaben;72
5.3;2A.3 Programmierung unter UNIX/Linux;74
5.4;2A.4 Programmierung in Java;76
6;3 Synchronisation;80
6.1;3.1 Synchronisationsbedingungen;80
6.1.1;3.1.1 Elementare Bedingungen;80
6.1.1.1;3.1.1.1 Wechselseitiger Ausschluss;81
6.1.1.2;3.1.1.2 Reihenfolgebedingung;82
6.1.2;3.1.2 Komplexere Probleme;83
6.1.2.1;3.1.2.1 Erzeuger-Verbraucher-Problem;84
6.1.2.2;3.1.2.2 Leser-Schreiber-Problem;84
6.1.2.3;3.1.2.3 Philosophenproblem;85
6.2;3.2 Einfache Synchronisationsmechanismen;85
6.2.1;3.2.1 Grundlegende Eigenschaften;86
6.2.2;3.2.2 Interruptsperren;86
6.2.3;3.2.3 Spinlocks;87
6.2.4;3.2.4 Signale und Events;91
6.3;3.3 Synchronisation durch Semaphore;92
6.3.1;3.3.1 Arbeitsprinzip von Semaphoren;92
6.3.1.1;3.3.1.1 Datenstrukturen und Operationen;92
6.3.1.2;3.3.1.2 Semaphoroperationen in Bild und Notation;94
6.3.1.3;3.3.1.3 Varianten und Erweiterungen;96
6.3.2;3.3.2 Einsatz bei Standardproblemen;97
6.3.2.1;3.3.2.1 Wechselseitiger Ausschluss;97
6.3.2.2;3.3.2.2 Reihenfolgebedingung;98
6.3.2.3;3.3.2.3 Erzeuger-Verbraucher-Problem;99
6.3.2.4;3.3.2.4 Leser-Schreiber-Problem;100
6.3.2.5;3.3.2.5 Philosophenproblem;102
6.3.3;3.3.3 Systematische Lösung von Problemen;103
6.3.4;3.3.4 Fehlerquellen;106
6.3.4.1;3.3.4.1 Deadlocks: Problematik;107
6.3.4.2;3.3.4.2 Deadlocks: Lösungen;108
6.3.4.3;3.3.4.3 Missachtung der Atomarität;109
6.3.4.4;3.3.4.4 Einsatz von sleep();110
6.3.4.5;3.3.4.5 Mangelnde Fairness;110
6.4;3.4 Synchronisation durch Monitore;111
6.4.1;3.4.1 Grundprinzip von Monitoren;111
6.4.1.1;3.4.1.1 Definition des Monitorbegriffs;111
6.4.1.2;3.4.1.2 Beispiel: Einfacher Ringpuffer mit Überschreiben;112
6.4.2;3.4.2 Bedingungsvariablen;113
6.4.2.1;3.4.2.1 Zweck und Einsatz;113
6.4.2.1.1;3.4.2.2 Beispiel: Ringpuffer für Erzeuger/Verbraucher;115
6.4.2.2;3.4.2.2 Beispiel: Ringpuffer für Erzeuger/Verbraucher;115
6.4.3;3.4.3 Lösung weiterer Standardprobleme;116
6.4.3.1;3.4.3.1 Reihenfolgebedingung;116
6.4.3.2;3.4.3.2 Leser-Schreiber-Problem;117
6.4.3.3;3.4.3.3 Philosophenproblem;118
6.5;3.5 Mechanismen in UNIX/Linux;119
6.5.1;3.5.1 Signale;119
6.5.2;3.5.2 Lock-Dateien;121
6.5.3;3.5.3 Semaphore;122
6.5.3.1;3.5.3.1 Erzeugen von Semaphorgruppen;122
6.5.3.2;3.5.3.2 Initialisieren und Löschen;124
6.5.3.3;3.5.3.3 P- und V-Operationen;126
6.5.3.4;3.5.3.4 Programmstrukturen und -beispiele;128
6.5.4;3.5.4 Mutexe mit Bedingungsvariablen;133
6.5.4.1;3.5.4.1 Mutexe;133
6.5.4.2;3.5.4.2 Bedingungsvariablen;133
6.5.4.3;3.5.4.3 Beispiel: Erzeuger-Verbraucher mit Ringpuffer;134
6.6;3.6 Mechanismen in Java;136
6.6.1;3.6.1 Atomare Operationen;136
6.6.1.1;3.6.1.1 Basistypen;136
6.6.1.2;3.6.1.2 Collections;137
6.6.2;3.6.2 Semaphore;137
6.6.2.1;3.6.2.1 Die Klasse Semaphore;137
6.6.2.2;3.6.2.2 Beispiel: Reihenfolgebeziehung;138
6.6.3;3.6.3 Monitore;139
6.6.3.1;3.6.3.1 synchronized;139
6.6.3.2;3.6.3.2 wait() und notify();141
6.6.3.3;3.6.3.3 Die Interfaces Lock und Condition;143
6.6.4;3.6.4 Weitere Mechanismen;144
6.7;3.7 Zusammenfassung und Ausblick;145
7;3A Synchronisation: Aufgaben;148
7.1;3A.1 Wissens- und Verständnisfragen;148
7.2;3A.2 Sprachunabhängige Anwendungsaufgaben;151
7.3;3A.3 Programmierung unter UNIX/Linux;156
7.4;3A.4 Programmierung in Java;159
8;4 Kommunikation;162
8.1;4.1 Grundlegende Begriffe;162
8.1.1;4.1.1 Arten der Kommunikation;162
8.1.2;4.1.2 Sender-Empfänger-Beziehungen;164
8.1.2.1;4.1.2.1 Ein oder mehrere Sender und Empfänger;164
8.1.2.2;4.1.2.2 Direkte vs. indirekte Kommunikation;165
8.1.2.3;4.1.2.3 Enge vs. lose zeitliche Kopplung;166
8.1.3;4.1.3 Kommunikation in Rechnernetzen;167
8.1.3.1;4.1.3.1 Schnittstellen: Sockets;167
8.1.3.2;4.1.3.2 Protokolle und Protokollstacks;168
8.1.3.3;4.1.3.3 Der Protokollstack des Internets;170
8.2;4.2 Techniken in UNIX/Linux;171
8.2.1;4.2.1 Shared Memory;172
8.2.1.1;4.2.1.1 API-Funktionen;172
8.2.1.2;4.2.1.2 Programmbeispiel: Erzeuger-Verbraucher-System;174
8.2.2;4.2.2 Pipes;175
8.2.2.1;4.2.2.1 Benannte Pipes;176
8.2.2.2;4.2.2.2 Unbenannte Pipes;177
8.2.3;4.2.3 Message Queues;178
8.2.3.1;4.2.3.1 API-Funktionen: Erzeugen und Löschen;178
8.2.3.2;4.2.3.2 API-Funktionen: Senden und Empfangen;179
8.2.3.3;4.2.3.3 Programmbeispiel: Erzeuger-Verbraucher-System;182
8.2.4;4.2.4 Sockets;183
8.2.4.1;4.2.4.1 Domains und Typen;183
8.2.4.2;4.2.4.2 API-Funktionen: Übersicht;184
8.2.4.3;4.2.4.3 API-Funktionen: Erzeugen und Schließen;186
8.2.4.4;4.2.4.4 API-Funktionen: Verbinden und Kommunizieren;188
8.2.4.5;4.2.4.5 Programmbeispiel: Stream-Sockets;189
8.2.4.6;4.2.4.6 Programmbeispiel: Datagram-Sockets;192
8.3;4.3 Techniken in Java;194
8.3.1;4.3.1 Übersicht;194
8.3.2;4.3.2 Piped Streams;195
8.3.3;4.3.3 Sockets;197
8.3.3.1;4.3.3.1 Stream-Sockets;198
8.3.3.2;4.3.3.2 Datagram-Sockets;201
8.4;4.4 Zusammenfassung und Ausblick;203
9;4A Kommunikation: Aufgaben;206
9.1;4A.1 Wissens- und Verständnisfragen;206
9.2;4A.2 Sprachunabhängige Anwendungsaufgaben;209
9.3;4A.3 Programmierung unter UNIX/Linux;210
9.4;4A.4 Programmierung in Java;214
10;5 Kooperation;218
10.1;5.1 Modelle und Techniken;218
10.1.1;5.1.1 Das Client-Server-Modell;218
10.1.1.1;5.1.1.1 Grundlegende Struktur;219
10.1.1.2;5.1.1.2 Zeitliche Abläufe;219
10.1.1.3;5.1.1.3 Implementierungsaspekte;221
10.1.2;5.1.2 Das Peer-to-Peer-Modell;222
10.1.3;5.1.3 Programmiertechniken;223
10.1.3.1;5.1.3.1 Prozedurorientierte Kooperation;223
10.1.3.2;5.1.3.2 Objektorientierte Kooperation;225
10.1.3.3;5.1.3.3 Webbasierte Kooperation;226
10.2;5.2 Techniken in UNIX/Linux;227
10.2.1;5.2.1 Kooperation über Sockets;227
10.2.2;5.2.2 Remote Procedure Call (RPC);229
10.2.2.1;5.2.2.1 Komponenten und ihr Zusammenspiel;229
10.2.2.2;5.2.2.2 Schritte der Programmierung;231
10.3;5.3 Techniken in Java;235
10.3.1;5.3.1 Remote Method Invocation (RMI);235
10.3.1.1;5.3.1.1 Komponenten und ihr Zusammenspiel;235
10.3.1.2;5.3.1.2 Schritte der Programmierung;236
10.3.2;5.3.2 Dynamische Webseiten;239
10.3.2.1;5.3.2.1 Applets;239
10.3.2.2;5.3.2.2 Servlets und Java Server Pages;241
10.3.3;5.3.3 Web Services;242
10.4;5.4 Zusammenfassung;244
11;5A Kooperation: Aufgaben;246
11.1;5A.1 Wissens- und Verständnisfragen;246
11.2;5A.2 Sprachunabhängige Anwendungsaufgaben;248
11.3;5A.3 Programmierung unter UNIX/Linux;250
11.4;5A.4 Programmierung in Java;251
12;Literatur und Internet;254
12.1;Internet-Quellen;255
13;Index;256
Basistechniken - Grundlegende Techniken der NebenläufigkeitSynchronisation - gegenseitige Abstimmung von Prozessen und ThreadsKommunikation - Übertragung von Daten zwischen Prozessen und ThreadsKooperation - Zusammenarbeit von Prozessen