Erlangs Eigenschaften
Aus der Erlang-Programmierung (2009):
Die Erlang-Parallelität ist schnell und skalierbar. Die Prozesse sind insofern leichtgewichtig, als die virtuelle Erlang-Maschine nicht für jeden erstellten Prozess einen Betriebssystem-Thread erstellt. Sie werden in der VM unabhängig vom zugrunde liegenden Betriebssystem erstellt, geplant und verarbeitet. Infolgedessen liegt die Prozesserstellungszeit in der Größenordnung von Mikrosekunden und unabhängig von der Anzahl der gleichzeitig vorhandenen Prozesse. Vergleichen Sie dies mit Java und C #, wo für jeden Prozess ein zugrunde liegender Betriebssystem-Thread erstellt wird: Sie erhalten einige sehr wettbewerbsfähige Vergleiche, wobei Erlang beide Sprachen deutlich übertrifft.
Aus der Parallelitätsorientierten Programmierung in Erlang (pdf) (Folien) (2003):
Wir stellen fest, dass die für die Erstellung eines Erlang-Prozesses benötigte Zeit konstant 1µs bis zu 2.500 Prozessen beträgt. danach steigt sie für bis zu 30.000 Prozesse auf etwa 3 us an. Die Leistung von Java und C # ist oben in der Abbildung dargestellt. Für eine kleine Anzahl von Prozessen dauert es ungefähr 300 us, um einen Prozess zu erstellen. Es ist unmöglich, mehr als zweitausend Prozesse zu erstellen.
Wir sehen, dass für bis zu 30.000 Prozesse die Zeit zum Senden einer Nachricht zwischen zwei Erlang-Prozessen etwa 0,8 µs beträgt. Für C # dauert es ungefähr 50µs pro Nachricht, bis zur maximalen Anzahl von Prozessen (die ungefähr 1800 Prozesse waren). Java war noch schlimmer, für bis zu 100 Prozesse dauerte es ungefähr 50 us pro Nachricht, danach stieg es schnell auf 10 ms pro Nachricht an, wenn es ungefähr 1000 Java-Prozesse gab.
Meine Gedanken
Ich verstehe technisch nicht ganz, warum Erlang-Prozesse beim Laichen neuer Prozesse so viel effizienter sind und viel weniger Speicherbedarf pro Prozess haben. Sowohl das Betriebssystem als auch die Erlang-VM müssen die Planung und den Kontextwechsel durchführen und die Werte in den Registern usw. verfolgen.
Warum werden Betriebssystem-Threads nicht wie Prozesse in Erlang implementiert? Müssen sie etwas mehr unterstützen? Und warum benötigen sie einen größeren Speicherbedarf? Und warum haben sie langsameres Laichen und Kommunikation?
Warum sind Prozesse in Erlang technisch gesehen effizienter als OS-Threads, wenn es um das Laichen und die Kommunikation geht? Und warum können Threads im Betriebssystem nicht auf dieselbe effiziente Weise implementiert und verwaltet werden? Und warum haben Betriebssystem-Threads einen größeren Speicherbedarf sowie ein langsameres Laichen und eine langsamere Kommunikation?
Mehr lesen
erl +P 1000100 +hms 100
und als Typ {_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
und als Wartezeit etwa drei Minuten für Ergebnis. Das ist so einfach. Es dauert 140us pro Prozess und 1 GB RAM auf meinem Laptop. Aber es ist direkt von der Shell, es sollte besser aus kompiliertem Code sein.