Charakterystyka Erlanga
Z Erlang Programming (2009):
Współbieżność Erlang jest szybka i skalowalna. Jego procesy są lekkie, ponieważ maszyna wirtualna Erlang nie tworzy wątku systemu operacyjnego dla każdego utworzonego procesu. Są tworzone, planowane i obsługiwane na maszynie wirtualnej niezależnie od bazowego systemu operacyjnego. W rezultacie czas tworzenia procesu jest rzędu mikrosekund i jest niezależny od liczby równolegle istniejących procesów. Porównaj to z Javą i C #, gdzie dla każdego procesu tworzony jest podstawowy wątek systemu operacyjnego: otrzymasz bardzo konkurencyjne porównania, z Erlangiem znacznie przewyższającym oba języki.
Z programowania współbieżnego w Erlang (pdf) (slajdy) (2003):
Obserwujemy, że czas potrzebny do stworzenia procesu Erlanga jest stały 1 µs do 2500 procesów; następnie wzrasta do około 3 µs do 30 000 procesów. Wydajność Java i C # jest pokazana u góry rysunku. W przypadku niewielkiej liczby procesów utworzenie procesu zajmuje około 300 µs. Stworzenie ponad dwóch tysięcy procesów jest niemożliwe.
Widzimy, że dla maksymalnie 30 000 procesów czas wysłania wiadomości między dwoma procesami Erlanga wynosi około 0,8 µs. W przypadku C # zajmuje to około 50 µs na wiadomość, aż do maksymalnej liczby procesów (czyli około 1800 procesów). Java była jeszcze gorsza, do 100 procesów zajmowało około 50 µs na wiadomość, po czym gwałtownie wzrosła do 10 ms na wiadomość, gdy było około 1000 procesów Java.
Moje myśli
Nie do końca rozumiem technicznie, dlaczego procesy Erlanga są o wiele bardziej wydajne w tworzeniu nowych procesów i mają znacznie mniejsze zużycie pamięci na proces. Zarówno system operacyjny, jak i maszyna wirtualna Erlang muszą wykonywać harmonogramy, przełączać konteksty, śledzić wartości w rejestrach i tak dalej ...
Dlaczego po prostu wątki systemu operacyjnego nie są implementowane w taki sam sposób, jak procesy w Erlang? Czy muszą wspierać coś więcej? Dlaczego potrzebują większej ilości pamięci? I dlaczego mają wolniejsze tarło i komunikację?
Technicznie, dlaczego procesy w Erlangu są wydajniejsze niż wątki systemu operacyjnego, jeśli chodzi o tworzenie i komunikację? I dlaczego nie można wdrażać i zarządzać wątkami w systemie operacyjnym w ten sam skuteczny sposób? I dlaczego wątki systemu operacyjnego mają większy ślad pamięci oraz wolniejsze tworzenie i komunikację?
erl +P 1000100 +hms 100
a następnie wpisz{_, PIDs} = timer:tc(lists,map,[fun(_)->spawn(fun()->receive stop -> ok end end) end, lists:seq(1,1000000)]).
i poczekaj około trzech minut na wynik. To takie proste. Zajmuje 140us na proces i 1 GB całej pamięci RAM na moim laptopie. Ale jest to bezpośrednio z powłoki, powinno być lepsze od skompilowanego kodu.Odpowiedzi:
Istnieje kilka czynników przyczyniających się do tego:
źródło
Po dalszych poszukiwaniach znalazłem prezentację autorstwa Joe Armstronga.
Z Erlang - oprogramowanie do współbieżnego świata (prezentacja) (po 13 min):
Myślę, że odpowiada, jeśli nie na wszystkie, przynajmniej na kilka moich pytań
źródło
Zaimplementowałem programy w asemblerze i zmierzyłem wydajność.
Przełączanie między programami, zwanymi procesami Erlanga, zajmuje około 16 instrukcji i 20 nanosekund na nowoczesnym procesorze. Ponadto często znasz proces, na który się przełączasz (przykład: proces odbierający wiadomość w swojej kolejce może być zaimplementowany jako bezpośrednie przekazanie z procesu wywołującego do procesu odbierającego), więc harmonogram nie wchodzi w grę, jest to operacja O (1).
Zmiana wątków systemu operacyjnego zajmuje około 500-1000 nanosekund, ponieważ wywołujesz jądro. Harmonogram wątków systemu operacyjnego może działać w czasie O (log (n)) lub O (log (log (n))), co zacznie być zauważalne, jeśli masz dziesiątki tysięcy, a nawet miliony wątków.
Dlatego procesy Erlang są szybsze i lepiej skalowalne, ponieważ zarówno podstawowa operacja przełączania jest szybsza, jak i program planujący działa rzadziej.
źródło
Procesy Erlang odpowiadają (w przybliżeniu) zielonym wątkom w innych językach; nie ma wymuszonej przez system operacyjny separacji między procesami. (Może istnieć separacja wymuszona językiem, ale jest to mniejsza ochrona, mimo że Erlang wykonuje lepszą pracę niż większość.) Ponieważ są o wiele lżejsze, mogą być używane znacznie szerzej.
Z drugiej strony wątki systemu operacyjnego można po prostu zaplanować na różnych rdzeniach procesora i (w większości) są w stanie obsługiwać niezależne przetwarzanie związane z procesorem. Procesy systemu operacyjnego są podobne do wątków systemu operacyjnego, ale z dużo silniejszą separacją wymuszaną przez system operacyjny. Ceną tych możliwości jest to, że wątki systemu operacyjnego i (a tym bardziej) procesy są droższe.
Innym sposobem zrozumienia różnicy jest to. Przypuśćmy, że zamierzasz napisać implementację Erlanga w górnej części JVM (nie jest to szczególnie szalona sugestia), wtedy każdy proces Erlanga będzie obiektem z pewnym stanem. Miałbyś wtedy pulę wystąpień Thread (zwykle o rozmiarze odpowiadającym liczbie rdzeni w systemie hosta; to jest dostrajalny parametr w rzeczywistych środowiskach wykonawczych Erlang), które uruchamiają procesy Erlang. To z kolei spowoduje rozłożenie pracy, która ma zostać wykonana, na rzeczywiste dostępne zasoby systemowe. To całkiem zgrabny sposób robienia rzeczy, ale całkowicie polegafakt, że każdy indywidualny proces Erlanga nie robi wiele. To jest w porządku, oczywiście; Erlang jest tak skonstruowany, że nie wymaga, aby te indywidualne procesy były ciężkie, ponieważ to cały ich zespół wykonuje program.
Pod wieloma względami prawdziwym problemem jest terminologia. Rzeczy, które Erlang nazywa procesami (i które silnie korespondują z tą samą koncepcją w CSP, CCS, a zwłaszcza w rachunku π), po prostu nie są tym samym, co języki z dziedzictwem C (w tym C ++, Java, C # i wiele innych) wywołują proces lub wątek. Istnieją pewne podobieństwa (wszystkie wiążą się z pojęciem równoczesnego wykonywania), ale na pewno nie ma równoważności. Dlatego bądź ostrożny, gdy ktoś mówi do ciebie „proces”; mogą zrozumieć, że oznacza to coś zupełnie innego…
źródło
Myślę, że Jonas chciał uzyskać kilka liczb dotyczących porównania wątków systemu operacyjnego z procesami Erlanga. Autor programu Programming Erlang, Joe Armstrong, jakiś czas temu testował skalowalność tworzenia procesów Erlang w wątkach systemu operacyjnego. Napisał prosty serwer WWW w Erlang i przetestował go na wielowątkowym Apache (ponieważ Apache używa wątków OS). Istnieje stara strona internetowa z danymi sięgającymi 1998 roku. Tylko raz udało mi się znaleźć tę witrynę. Więc nie mogę podać linku. Ale informacje tam są. Główny punkt badania wykazał, że Apache osiągnął maksymalny poziom prawie 8K procesów, podczas gdy jego ręcznie napisany serwer Erlang obsłużył ponad 10 000 procesów.
źródło
Ponieważ tłumacz Erlang musi martwić się tylko o siebie, system operacyjny ma wiele innych powodów do zmartwień.
źródło
Jednym z powodów jest to, że proces erlang jest tworzony nie w systemie operacyjnym, ale w evm (wirtualna maszyna erlang), więc koszt jest mniejszy.
źródło