Frage

Wie ähnlich ist verteiltes Rechnen und threading? Ich habe kommende zwei Papiere gefunden ganz gegensätzliche Schlussfolgerungen:

"Multi-Threading ist einfacher als Networking. Wie Threading ist einfach und ähnlicher Code zu vernetzen"

http://software.intel.com/file/14723

(das gibt mir den Eindruck, dass sie so ähnlich sind, dass nach der Einkapselung dieser beiden Ansätze mit dem gleichen Code getan werden könnten - aber vielleicht bin ich falsch)

"Ein Hinweis auf verteiltes Rechnen"

http://research.sun.com/techrep/1994/abstract -29.html

(und dies setzt eine starke Unterscheidung)

Ich bin sicher, dass die Wahrheit irgendwo dazwischen. Was bedeutet das goldene? Gibt es Technologien, die diese beiden Paradigmen vereinen? Oder haben solche Versuche aufgrund der fundamentalen Unterschiede zwischen Vernetzung und Gleichzeitigkeit gescheitert?

War es hilfreich?

Lösung

Ich habe nie sie sehr ähnlich zu sein. Lassen Sie mich für die Zwecke dieser Beitrag ein „Knoten“ definieren ein Hardware-Thread auf einer Maschine ausgeführt werden. So eine Quad-Core-Maschine vier Knoten, als ein Cluster von vier Single-Prozessor-Box ist.

Jeder Knoten wird in der Regel eine Verarbeitung ausgeführt werden, und es muss irgendeine Art von Cross-Knoten-Kommunikation sein. In der Regel die erste Instanz dieser Mitteilung sagt den Knoten, was zu tun ist. Für diese Kommunikation kann ich Shared Memory, Semaphore, gemeinsam genutzte Dateien, Named Pipes, Steckdosen, Remote Procedure Calls, verteilen COM, usw. verwenden, aber die einfachsten diejenigen zu verwenden, Shared Memory und Semaphore, ist nicht in der Regel über ein Netzwerk zur Verfügung. Gemeinsam genutzte Dateien verfügbar sein, aber die Leistung ist in der Regel schlecht. Sockets ist in der Regel die häufigste und flexibelste Wahl über ein Netzwerk zu sein, anstatt die anspruchsvolleren Mechanismen. An diesem Punkt müssen Sie sich mit den Details der Netzwerkarchitektur befassen, einschließlich Latenz, Bandbreite, Paketverlust, Netzwerktopologie und vieles mehr.

Wenn Sie mit einer Warteschlange von der Arbeit beginnen, Knoten auf der gleichen Maschine können einfach Shared Memory verwenden, um Dinge zu bekommen zu tun. Sie können es sogar aufzuschreiben lockless und es wird nahtlos arbeiten. Mit Knoten über ein Netzwerk, wo setzen Sie die Warteschlange? Wenn Sie es zu zentralisieren, kann diese Maschine leidet sehr hohe Kosten für die Bandbreite. Versuchen Sie, zu verteilen und die Dinge sehr kompliziert sehr schnell.

Was ich gefunden habe, in der Regel sind die Menschen diese Art der parallelen Architektur Bekämpfung neigen embarrassingly parallel Probleme zu wählen, zu lösen. Raytracing in den Sinn kommt. Es gibt nicht viel Quer Knoten Kommunikation erforderlich ist, abgesehen von Jobverteilung. Es gibt viele Probleme wie diese, um sicher zu sein, aber ich finde es ein bisschen unaufrichtig zu behaupten, dass verteiltes Rechnen im Wesentlichen die gleiche wie Einfädeln ist.

Nun, wenn du gehst Schreib Einfädeln zu gehen, die identisch zu einem verteilten System verhält, reinen Message Passing verwenden und keinen Faden unter der Annahme zu sein, der „main“ ein und so, dann ja, sie gehen sehr sein ähnlich. Aber was du getan hast ist vorgab Sie eine verteilte Architektur aufweisen und implementiert sie in Threads. Die Sache ist die, dass threading ein viel einfacherer Fall der Parallelität ist als echtes verteiltes Computing. Sie kann abstrakt die beide in ein einziges Problem, sondern durch die härtere Version der Auswahl und streng klebt es. Und die Ergebnisse nicht so gut sein, wie sie sein könnten, wenn alle Knoten auf einer Maschine lokal sind. Sie sind nicht die Vorteile des Sonderfalls nehmen.

Andere Tipps

Das Verteilen Computing über mehrere verschiedene unabhängige Maschinen durchgeführt, in der Regel mit manchmal spezialisierten OS. Es ist schwieriger, weil die Vernetzung der Maschinen ist viel niedriger, und daher Probleme, die eine Menge von schnellen, direkten Zugriff auf den gesamten Datensatz sind sehr schwierig, erfordern zu lösen.

Im Allgemeinen benötigen Sie Spezialbibliotheken verteilten Computerprobleme zu tun, die herausfinden, wie Knoten zu Problemen zuweisen und Wagen um die Daten.

Ich frage mich wirklich, wenn sie zu unterschiedlichen Ergebnissen kommen, weil sie die falschen Probleme auf jeder Plattform zu lösen versuchen. Einige Probleme haften sehr gut zu stark vernetzten Maschinen und von wirklich Macht Super profitieren können. Andere Probleme können mit auf einfach verteilt Modelle behandelt werden. Im Allgemeinen können Supercomputer ein breiteres Spektrum von Problemen lösen, sind aber viel, viel mehr spezialisiert und teuer.

Der Unterschied scheint zurück zu Themen zu kommen Zustand teilen, Prozesse Nachrichten übergeben.

Sie müssen entscheiden, wie Sie Zustand in Ihrer Anwendung vor der Auswahl eines pflegen wollen.

Teilen Zustand ist einfach, mit zu beginnen, werden alle Daten und Variablen sind einfach da. Aber sobald Deadlocks / Rennbedingungen geben, sein schwer zu ändern / Maßstab.

Nachrichten vorbei (zB Erlang) erfordern einen anderen Ansatz zu entwerfen, Sie über die Möglichkeiten für die Parallelität von Anfang an denken, aber Zustand jeden verteilten Prozesses isoliert ist, so dass Verriegelungs- / Rennen Probleme leichter zu behandeln.

Ich denke, es ist viel nützlicher ist mit verteilten Rechenansätze Prozesse zu vergleichen, als es Threads zu vergleichen ist. Themen bestehen in einem einzigen Prozess und teilen die gleichen Daten und den gleichen Speicher. Dies ist nicht möglich, über mehrere Maschinen. Prozesse auf der anderen Seite hat einen eigenen Speicher, obwohl sie genau die gleichen Daten wie ein anderen Prozess in einigen Fällen enthalten (nach einem fork (), zum Beispiel). Dies könnte über ein Netzwerk erreicht werden.

Etwas, das auf diese Analogie zusätzliches Gewicht hinzufügt, ist die Tatsache, dass viele Tools für die Kommunikation zwischen Prozessen verwendet werden, ist Netzwerk transparent. Ein gutes Beispiel wäre Unix-Sockets sein, die die gleiche Schnittstelle wie Netzwerk-Sockets verwendet (mit Ausnahme des Verbindungscode).

Ja zum Zeitpunkt der Entwicklung des Ansatz ist sehr ähnlich, aber die Verwendung von jedem ist sehr unterschiedlich. Ich habe nicht Ihre Idee sehr klar, lassen Sie mich wissen, wenn ich falsch liege: Wenn man über Distributed Computing sprechen wir mehr als einen Computer oder Server-Verarbeitungscode in derselben Anwendung gehen davon aus, aber wenn wir reden über Multi-Threading wir verschiedene Gewinde der Anwendung zur gleichen Zeit in demselben Computer spricht über die Verarbeitung. Sie können als Beispiel für verteiltes Rechnen denken, in einer Anwendung einen Web-Service im Internet befindet erreichbar. Es gibt zwei verschiedene Computer in derselben App arbeiten.

Wenn Sie ein Beispiel für Multi-Threading wollen, man denke nur an eine Anwendung versucht, eine große Primzahl zu finden. Wenn Sie daran Multi-Threading dont verwenden, werden Sie nicht in der Lage sein zu sehen, oder es ist die Berechnung der nächsten Primzahl (kann ein Leben lang oder mehr) zu der Zeit alles andere in der Anwendung zu tun, weil die Anwendung nicht reagiert während bei der Berechnung arbeiten.

Sie können sie mischen: Als komplexeres Beispiel, können Sie immer Multi-Threading verwenden, um verschiedenen Web-Service zur gleichen Zeit durch die gleiche Anwendung zugreifen, ist dies, um Ihre Anwendung ansprechbar zu machen, auch wenn nicht verbinden wenn einer des Servers.

Ich denke, diese beiden Dokumente nicht ohne weiteres verglichen werden. Intel Dokument ist eine Art Einführung in Threading, und sie versuchen, es zu erklären, durch Analogien Network Computing zu finden, die ein wenig seltsam und irreführend für mich ist. Ich bin mir nicht sicher, warum sie gewählt haben, eine solche Art und Weise Einfädeln zu präsentieren, vielleicht richtet sie auf die Menschen mit Vernetzung, die wahrscheinlich mehr bekannt ist oder zumindest erkannt als Threading.

Sun Dokument, auf der anderen Seite, ist ein ernster Gegenstand, die Darstellung, alle Schwierigkeiten zu verteilten Programmierung im Zusammenhang. Alles, was ich tun kann, ist einfach zu bestätigen, was sie sagen darin.

Meiner Meinung nach ist eine Abstraktion, die die Tatsache eines Objekts zu verbergen versucht, sein Fern schädlich ist, wie es in der Regel zu einer sehr schlechten Leistung führt. Der Programmierer muss der Abgeschiedenheit eines Objekts bewusst sein, um es auf eine effiziente Art und Weise zu berufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top