Frage

Erlang ist dafür bekannt, viele leichte Prozesse zu unterstützen. Dies kann dies tun, weil dies keine Prozesse im traditionellen Sinne sind oder sogar Themen wie in P-Threads, sondern vollständig im Benutzerbereich.

Das ist gut und gut (eigentlich fantastisch). Aber wie werden dann Erlang -Threads in einer Multicore-/Multiprozessor -Umgebung parallel ausgeführt? Sicher müssen sie irgendwie auf Kernelfäden abgebildet werden, um auf getrennten Kernen ausgeführt zu werden?

Angenommen, dies ist der Fall, wie wird das getan? Sind viele leichte Prozesse, die einem einzelnen Kernelfaden zugeordnet sind?

Oder gibt es einen anderen Weg mit diesem Problem?

War es hilfreich?

Lösung

Die Antwort hängt von der verwendeten VM ab:

1) Nicht-Smp: Es gibt Ein Zeitplaner (OS -Thread), das alle Erlang -Prozesse ausführt, die aus dem entnommen wurden Pool von Runnable -Prozessen (dh diejenigen, die nicht von zB blockiert sind receive)

2) SMP: Es gibt K Scheduler (OS -Threads, k ist normalerweise eine Reihe von CPU -Kernen), die Erlang -Prozesse aus dem ausführen gemeinsame Prozesswarteschlange. Es handelt sich um eine einfache FIFO -Warteschlange (mit Schlössern, um einen gleichzeitigen Zugriff von mehreren Betriebssystemen zu ermöglichen).

3) SMP in R13B und neuer: Es wird____geben K Scheduler (wie zuvor), was Erlang -Prozesse aus durchführt Mehrere Prozesswarteschlangen. Jeder Scheduler hat seine eigene Warteschlange, also verarbeiten Sie also Migrationslogik Von einem Scheduler zum anderen wird hinzugefügt. Diese Lösung verbessert die Leistung, indem übermäßige Verriegelung in der gemeinsamen Prozesswarteschlange vermieden wird.

Weitere Informationen finden Sie unter dieses Dokument Vorbereitet von Kenneth Lundin, Ericsson AB, für die Erlang -User Conference, Stockholm, 13. November 2008.

Andere Tipps

Ich möchte frühere Antworten Ammend.

Erlang oder besser gesagt, das Erlang Runtime System (ERTS), setzt die Anzahl der Scheduler (OS -Threads) und die Anzahl der Runqueueis zur Anzahl der Verarbeitungselemente auf Ihrer Plattform standardmäßig aus. Das sind Prozessorenkerne oder Hardware -Threads. Sie können diese Einstellungen in der Laufzeit ändern:

erlang:system_flag(schedulers_online, NP) -> PrevNP

Die Erlang -Prozesse haben noch keine Affinität zu Schedulern. Die Logik, die die Prozesse zwischen den Schedulern ausgleichen, folgt zwei Regeln. 1) Ein hungernder Scheduler wird von einem anderen Scheduler die Arbeit stehlen. 2) Migrationspfade werden so eingerichtet, dass Prozesse von Schedulern mit vielen Prozessen an Scheduler mit weniger Arbeit weitergeleitet werden. Dies geschieht, um Fairness in der Anzahl der Reduktion (Ausführungszeit) für jeden Prozess zu gewährleisten.

Scheduler können jedoch auf bestimmte Verarbeitungselemente gesperrt werden. Dies ist standardmäßig nicht getan. Um ERTS die Scheduler-> Core-Affinity-Verwendung durchführen zu lassen:

erlang:system_flag(scheduler_bind_type, default_bind) -> PrevBind

In der Dokumentation finden Sie mehrere andere Bindungsarten. Die Verwendung von Affinität kann die Leistung in schweren Lastsituationen erheblich verbessern! Vor allem in Situationen mit hoher Verriegelung. Außerdem kann der Linux -Kernel nicht mit Hyperthreads umgehen, um es gelinde auszudrücken. Wenn Sie über Hyperthreads auf Ihrer Plattform verfügen, sollten Sie diese Funktion in Erlang wirklich verwenden.

Ich rate hier rein, aber ich würde mir vorstellen, dass es eine kleine Anzahl von Threads gibt, die Prozesse aus einem gemeinsamen Prozesspool für die Ausführung auswählen. Sobald ein Prozess einen Blockierungsvorgang trifft, legt der Thread ihn beiseite und wählt einen anderen aus. Wenn ein Verfahren ausgeführt wird, wird ein weiterer Prozess entsperren, dieser neu nicht blockierte Prozess wird in den Pool platziert. Ich nehme an, ein Thread könnte auch die Ausführung eines Prozesses stoppen, auch wenn er an bestimmten Stellen nicht blockiert ist, um anderen Prozessen zu dienen.

Ich möchte einige Eingaben zu dem hinzufügen, was in der akzeptierten Antwort beschrieben wurde.

Erlang Scheduler ist der wesentliche Bestandteil des Erlang -Laufzeitsystems und bietet eine eigene Abstraktion und Implementierung der Konzeption von leichten Prozessen auf den OS -Threads.

Jeder Scheduler wird innerhalb eines einzelnen Betriebssystems ausgeführt. Normalerweise gibt es so viele Scheduler wie CPU (Kerne) auf der Hardware (sie ist jedoch konfigurierbar und bringt natürlich nicht viel Wert, wenn die Anzahl der Scheduler die von Hardware -Kernen überschreitet). Das System könnte auch konfiguriert sein, dass Scheduler nicht zwischen Betriebssystem -Threads springt.

Wenn der Erlang -Prozess erstellt wird, liegt es völlig in der Verantwortung der ERTS und des Schedulers, den Lebenszyklus und den Ressourcenverbrauch sowie der Speicherpflichtiger usw. zu verwalten.

Eine der Kerndetails der Implementierung ist, dass jeder Prozess ein Zeitbudget von 2000 Reduzierungen aufweist, wenn der Scheduler diesen Prozess aus der Run -Warteschlange aufnimmt. Jeder Fortschritt im System (sogar I/O) hat garantiert ein Reduzierbudget. Das macht ERTs tatsächlich zu einem System mit präventivem Multitasking.

Ich würde einen großartigen Blog -Beitrag zu diesem Thema von Jesper Louis Andersen empfehlen http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html

Wie die kurze Antwort: Erlang -Prozesse sind keine OS -Threads und müssen ihnen nicht direkt zugeordnet werden. Erlang Scheduler sind das, was unter den OS -Threads ausgeführt wird, und bieten eine intelligente Implementierung von feinkörneren Erlang -Prozessen, die diese Details hinter dem Programm von Programmierern verstecken.

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