2010-04-02 9 views
13

Ich habe viel darüber gelesen, wie Scala und Erlang leichte Fäden und ihr Nebenläufigkeitsmodell (Schauspieler) machen.Verwenden Scala und Erlang grüne Fäden?

Allerdings habe ich meine Zweifel.

Do Scala und Erlang einen Ansatz verwenden ähnlich dem alten Modell Thread von Java (grüne Fäden) verwendet?

Nehmen wir zum Beispiel an, dass es eine Maschine mit 2 Kernen gibt, also wird die Scala/Erlang-Umgebung einen Thread pro Prozessor abzweigen? Die anderen Threads werden von der Benutzer-Space-Umgebung (Scala VM/Erlang VM) geplant. Ist das richtig?

Unter der Haube, wie funktioniert das wirklich?

+0

Java hat seit zehn Jahren keine grünen Threads mehr verwendet – vemv

Antwort

23

Erlang nutzt User-Space-Multitasking, Aufgaben laufen, bis sie blockieren oder bis sie ihren Anteil an "Reduktionen" aufgebraucht haben. Eine Reduktion wird vage als eine Berechnungseinheit definiert.

Bis zum SMP-Scheduler, gab es nur einen Kernel-Thread unter runnable Aufgaben. Mit SMP-Scheduling haben Sie mehrere Kernel-Threads, die Aufgaben übernehmen und somit Code parallel auf Multicore-Maschinen ausführen. Die Anzahl der Scheduler-Threads sollte der Anzahl der Kerne entsprechen. Siehe den -smp [enable|auto|disable] Schalter in the erl manpage.

Es gibt auch einen Pool von Kernel-Threads für ladbare Treiber, um blockierende Systemaufrufe auszuführen. Dies wird der asynchrone Thread-Pool genannt. Siehe +A size in the erl manpage.

Literatur

+0

@ thanks Christian fragen.Der Benutzer-Space-Multitasking-Scheduler wird also ein "Thread-Objekt" auswählen, das vom OS-Thread ausgeführt wird. Recht ? – CHAPa

+0

Ich kann es nicht viel besser beschreiben als das PDF von EUC'08, mit dem ich verlinkt bin. Ich glaube, dass die aktuelle OTP-Version nun mehrere Run-Queues hat, wie in Abschnitt 5.2 beschrieben, wir leben in der Zukunft. – Christian

+0

Nein, ein Betriebssystemthread führt einen Erlang-Scheduler aus, der explizit Prozesse und deren Planung behandelt. Aus diesem Grund haben Sie selten mehr als einen Thread pro Kern, zumindest nicht für den Erlang-Code. OS-Threads sind in der Regel viel zu schwer für Erlang-Prozesse. – rvirding

1

Scala nutzt die zugrunde liegenden Java-Thread-Implementierung, die uses native threads.

Ich kann nicht über Erlang sagen.

+0

hi dave, Ich weiß, dass die neueste JVM nur native Threads verwendet, aber es gibt ein Problem, skalierbar zu sein, indem nur native Threads verwendet werden. Einige Artikel, die ich gelesen habe, sagten, dass ein Pool von Threads (Workern) für die "Concurrency-Umgebung" von Scala verwendet wird, und die Idea ist die Verwendung der weniger möglichen Java-Threads (native Threads). – CHAPa

+0

Früheres Akka (Akteur-Bibliothek basierend auf Scala) verwendete HawtDispatch (http://hawtdispatch.fusesource.org/). Aber sie haben sich inzwischen in etwas anderes verwandelt. Ich weiß nicht, was es ist. Wenn Sie Interesse haben, können Sie sie auf dem Akka Forum (akka.io) – OlliP

4

Für aktuelle Informationen über Erlang Implementierungsdetails prüfen fresh talk (slides).

+0

cool, nettes Gespräch. Vielen Dank – CHAPa

13

Scala 2.8 verwendet Java-Thread-Pools. Die leichten Darsteller (Reactor) und die schwereren Darsteller im Lightweight-Modus (react {...}) nehmen keinen eigenen Thread; Wenn sie eine Nachricht haben, nehmen sie einen Thread, bis sie die Nachricht verarbeitet haben. Dann geben sie den Thread zurück und laufen überhaupt erst weiter, wenn die nächste Nachricht eintrifft.

This article gibt eine anständige Beschreibung der Akteure in 2.7; 2.8 ist das nicht anders.

+0

@Rex, aber, um skalierbar zu sein, Scala kann nicht nur Java-Thread (native OS-Thread) verwenden, muss es in der Lage sein, eine Umgebung zu schaffen, wo eine neue Art von Thread zur Verfügung stehen, wie ein grüner Thread. Stellen Sie sich vor, 100 Schauspieler und jeder Akteur, der einen Java-Thread verwendet, ist kein Lightweight-Thread, weil der Kontext des Switch-Threads nicht zu hell ist. Recht ? – CHAPa

+0

Das ist irgendwie richtig. Die Schalter sind nicht so leicht wie Erlang. Sie können fast immer vermeiden, 100 Actors auf 100 Threads zu haben (indem Sie auf Nachrichten reagieren, anstatt ständig zu laufen), also haben Sie immer noch die nicht-leichten Java-Threads, die die ganze Angelegenheit untermauern, aber leichteren Nachrichtenkonsum (seit Nachrichten für mehrere Darsteller können von einem Thread bearbeitet werden). Aufgrund dieser Architektur können Sie auf sehr viele reaktionsfähige Darsteller skalieren, ohne dass OS-Threads auslaufen, aber es ist nicht so erstaunlich skalierbar wie Erlang. (Suche nach "thread ring benchmark shootout" ...) –

+0

@CHAPa Akka Schauspieler basieren auf Callbacks, also sind mehrere Threads nicht nötig. Dieses Modell ist der Entwicklungsperspektive weit unterlegen, erlaubt aber die Verwendung auf einer Plattform, die nur Thread-Pooling bietet. – rightfold