Next: Koroutinen
Up: No Title
Previous: Zusammenfassung
Parallelität im Bereich von Programmiersprachen
ist unter zwei Gesichtspunkten interessant,
die ziemlich voneinander abweichen:
- Parallelität als Mittel zur Beschleunigung eines
Programms auf Rechnern mit mehr als einem Prozessor.
Hier liegt häufig der Algorithmus zuerst in sequentieller
Form vor und kann teilweise nur mit erheblichem Aufwand
parallelisiert werden.
Aus diesem Grund wurden parallelisierende Übersetzer
entwickelt, die es erlauben, die Programme in der
lesbareren sequentiellen Form zu belassen.
Einige neuere Programmiersprachen wie Fortran-90
und High Performance Fortran erlauben eine Reihe
zusätzlicher Angaben, die entsprechende Optimierer
und Parallelisierer unterstützen.
- Parallelität als Mittel zur Modellierung.
Die reale Welt besteht aus einer Vielzahl parallel
agierender Objekte.
Ein Abbild davon in Form von Programm-Elementen sollte
nicht auf unnatürliche Weise sequentialisiert werden.
Ein globaler Kontrollfluß macht dies jedoch fast unmöglich.
Vom Standpunkt der Modellierung ist es dabei zunächst
nicht relevant, ob nur ein Prozessor oder eine
Multiprozessormaschine vorliegt.
Einige objekt-orientierte Programmiersprachen,
wie z.B. Simula, Actor und ABCL/1,
haben aus diesem Grund Parallelität in die Sprache integriert.
Es gibt eine Reihe unterschiedlicher Ansätze,
um Parallelität zu erreichen.
Sofern nicht Parallelität im Sinne von gleichzeitiger
Verarbeitung auf mehreren Prozessoren erreicht wird,
wird auch häufig von Quasi-Parallelität gesprochen.
Allerdings muß sich der Unterschied nicht notwendigerweise
auf die Gestaltung des Programms auswirken.
- Koroutinen erlauben es auf sehr einfache und
kostengünstige Weise,
mehrere Kontrollflüsse in einem Programm zu unterhalten.
Zu jeder Koroutine gehört ein Stack, eine
aktuelle Position im Programm und ein Satz Register.
Es ist immer nur eine Koroutine aktiv, und der Wechsel
der Koroutine erfolgt typischerweise explizit.
Viele Programmiersprachen offerieren Koroutinen
oder bieten Sprachmittel auf deren Basis an,
wie z.B. Modula-2.
Der besondere Vorteil von Koroutinen ist,
daß keine Unterstützung von Seiten des Betriebssystems
erforderlich ist.
- Verschiedene Betriebssysteme (insbesondere die neueren
UNIX-Varianten wie Mach, Solaris 2 und Digital UNIX)
erlauben die Ausführung mehrerer
``leichtgewichtiger'' Prozesse (threads)
im gleichen Adreßraum mit den gleichen Rechten.
Auf Multiprozessormaschinen ist eine echte Parallelität
möglich, während auf Einprozessor-Maschinen nur
auf Basis von Zeitscheiben eine Quasi-Parallelität
hergestellt wird.
Der gemeinsame Adreßraum erleichtert die gemeinsame
Datenhaltung - Objekte müssen nicht auf aufwendige
Weise über Interprozeßkommunikation ausgetauscht werden.
Andererseits wird die Sicherstellung der Korrektheit
deutlich erschwert, worauf z.B. Hoare in
Communicating Sequential Processes hinweist:
``In its full generality, multithreading is an incredibly complex
and error-prone technique, not to be recommended in any
but the smallest programs.''
- Mehrbenutzersysteme wie UNIX
erlauben die Ausführung mehrerer Prozesse,
die jeweils einen individuellen Adreßraum besitzen.
Analog zu den leichtgewichtigen Prozessen kann entweder
echte Parallelität oder nur eine auf Basis von Zeitscheiben
vorliegen.
Die Kommunikation zwischen mehreren Prozessen kann
auf Basis von konventionellen Dateien, Kommunikationskanälen
(wie z.B. Pipelines unter UNIX)
oder gemeinsam zugänglichen Speicherbereichen (shared memory)
erfolgen.
- Verteilte Systeme erlauben die Parallelisierung auf
Basis von Rechnern, die über Netze miteinander verbunden sind.
Hier entstehen zusätzliche Probleme durch die Vielfalt
existierender Netze und Rechner.
Koroutinen sind das einzige Mittel zur Parallelisierung,
das sich auf allen Rechnern und bei allen Umgebungen
auf portable Weise realisieren läßt.
Da jedoch eine aktive Koroutine auf ``freiwillige'' Weise
auch andere Koroutinen zur Ausführung kommen lassen sollte,
ergeben sich besondere Anforderungen an Fairneß und
Kooperationsmechanismen.
Unabhängig von der Art der Parallelisierung sind Sprachmittel
zur Synchronisierung zu sehen - mit etwas Glück und durch
den Einsatz geeigneter Abstraktionen können auch beide
orthogonal (also voneinander völlig unabhängig) gelöst werden.
Die größte Flexibilität wird natürlich gewonnen, wenn
beides - soweit wie möglich - innerhalb einer Bibliothek gelöst
wird, wenngleich dies nicht immer sehr einfach zu portieren ist
und auch Effizienzeinbußen mit sich bringen kann.
Next: Koroutinen
Up: No Title
Previous: Zusammenfassung
Andreas Borchert
2/2/1998