Bücher online kostenlos Kostenlos Online Lesen
Einstieg in Google Go

Einstieg in Google Go

Titel: Einstieg in Google Go
Autoren: Dr. Mario Deilmann , Christian Himpel
Vom Netzwerk:
Teil dieses Shortcuts werden wir die verschiedenen Konzepte zur parallelen Programmierung näher betrachten. Um die Unterschiede zu traditionellen Konzepten deutlich zu machen, vergleichen wir Go mit dem traditionellen OpenMP-Ansatz und der freien C++-Template-Bibliothek der Intel Threading Building Blocks (TBB). Ausführliche Beschreibungen von OpenMP und der TBB-Bibliothek finden sich zum Beispiel in Artikeln des Entwickler Magazins [1], [2] oder im Web. OpenMP und TBB verwenden Threads zur Parallelisierung, die sich das Code- und Datensegment mit dem zugehörigen Prozess teilen. Jeder Thread besitzt einen eigenen Befehlszähler und Stack. Da Threads darüber hinaus demselben Prozess zugeordnet sind, kommunizieren diese über den gemeinsamen Adressraum – und zwar ausgesprochen schnell, denn der einzige limitierende Faktor ist die Cache-Latenz oder die Speicherzugriffszeit. Die Intel TBBs benutzen ein laufzeitbasiertes Programmiermodell. Sie stellen generische Algorithmen und Container auf Basis einer Template-Bibliothek ähnlich der C++ Standard Template Library (STL) zur Verfügung sowie verschiedene parallele Funktions-Templates, zum Beispiel parallel_for , als parallele Algorithmen. Daneben bieten die TBB auch skalierbare Implementierungen von generischen parallelen Containern, um den parallelen Zugriff auf gemeinsame Daten zu realisieren. Bei OpenMP findet die Parallelisierung auf Algorithmenebene statt. Der Zugriff auf gemeinsam genutzte Daten muss geeignet synchronisiert werden (z. B. Mutex). Dazu definiert der OpenMP-Standard, der seit 1997 gemeinschaftlich von verschiedenen Compiler- und Hardwareherstellern weiterentwickelt wird ( http://www.openmp.org ), spezielle Compiler-Direktiven. Letztere verteilen die zu parallelisierenden Programmteile auf ein Team von Threads. Bei allen in diesem Textabschnitt vorgestellten Methoden zur Parallelisierung muss sich der Programmierer um die Handhabung der einzelnen Threads – wie Erzeugen, Synchronisieren und Beenden – keine Gedanken mehr machen. Die Frage, die sich aufdrängt, ist also: Worin unterscheidet sich Go dann von den „klassischen“ Ansätzen?
    GoRoutinen – Koroutinen in neuem Gewand?
    In der Informatik versteht man unter einer Koroutine (engl. „coroutine“), bei Go GoRoutinen genannt, eine Verallgemeinerung des Funktionskonzepts, die inzwischen recht alt ist: Man findet sie bereits in Sprachen wie Simula (1967), Modula-2 (1986) und Ada (1983). Prinzipiell unterscheiden sich Koroutinen und Funktionen darin, dass Erstere angehalten und später an der gleichen Stelle fortgesetzt werden können. Go realisiert die Kommunikation der Koroutinen auf Basis des von Tony Hoares entwickelten CSP-Modells (engl. Communicating Sequential Processes). Während man bei den Modellen, die über den gemeinsamen Adressraum kommunizieren (z. B. TBB), den Zugriff der verschiedenen Threads auf gleiche Speicherstellen selbst synchronisieren muss, verzichtet das CSP-Prinzip auf die Nutzung des gemeinsamen Speichers zur Kommunikation. TBB umgeht dieses Problem durch parallele Container oder atomare Datenelemente. In Go besteht zwar prinzipiell die Möglichkeit, gemeinsamen Speicher (engl. Shared Memory) zu nutzen, aber in idiomatischem Go kommunizieren GoRoutinen nur über Nachrichtenkanäle (engl. Channels). Unter Go-Entwickler hat sich dazu ein Slogan etabliert: „Kommuniziere nicht über gemeinsamen Speicher, sondern nutze gemeinsamen Speicher durch Kommunikation“ (engl. „Do not communicate by sharing memory; instead, share memory by communicating.“). Wichtig ist, dass der lesende oder schreibende Zugriff auf die Kanäle serialisiert wird. Damit werden Kollisionen von Daten auf den Nachrichtenkanälen ausgeschlossen. Die Nachrichtenkanäle sind in Go Objekte erster Klasse, d. h. sie können Variablen zugewiesen oder an Funktionen übergeben werden. Go besitzt, wie Ada, eine select -Anweisung, die es ermöglicht, die Datenströme aus den verschiedenen Kanälen über eine case -Anweisung zu trennen. Die Koroutinen speichern bei jeder Unterbrechung ihren Zustand und können deshalb jederzeit fortgesetzt werden. In Go werden GoRoutinen parallel zueinander und zum aufrufenden Prozess ausgeführt. Unterschiedliche GoRoutinen müssen nicht notwendigerweise in separaten Threads ausgeführt werden. Die Go-Laufzeitumgebung verteilt alle erzeugten GoRoutinen effizient und automatisch auf die vorhandenen Threads des Thread Pools. Dabei entscheidet der Wert der
Vom Netzwerk:

Weitere Kostenlose Bücher