Jaka jest różnica między programowaniem wielordzeniowym w Erlangu a innym językiem?

Czytałem Joe Armstrong 'Programowanie Erlanga' , i' n razy szybciej w n core machine ' teorii. Efektywnym sposobem programowania wielordzeniowego w Erlang jest użycie wielu procesów (wątków).

Jestem programistą C++, więc jestem ciekawy różnicy między tworzeniem wielu wątków w C++ a tworzeniem wielu procesów w Erlang. Rozumiem, że radzenie sobie z wątkami w C / C++ nie jest takie proste. Wiem również, że blokowanie/odblokowywanie powoduje spowolnienie systemu. Ale nie jest niemożliwe , prawda?

Więc.. dlaczego Erlang jest językiem przyjaznym muticore? Czy to dlatego, że jest łatwy do zaprogramowania?

Robię serwer gry online dla MMORPG, dlatego interesuje mnie Erlang jako alternatywny język serwera.

(przeczytałem już to pytanie, ale myślę, że nie jest to pytanie, którego szukam.)

Author: Community, 2009-03-13

5 answers

Nie, to nie jest niemożliwe, ale Erlang to znacznie ułatwia. Kluczem nie jest dzielenie stanu między procesami. Erlang osiąga to dzięki temu, że jest językiem funkcjonalnym. Funkcja nie powinna mieć żadnych skutków ubocznych ani dostępu do żadnego stanu zmiennej(poza argumentami przekazywanymi na stosie). Dzięki tym właściwościom obliczenia dowolnej funkcji w systemie można przenieść na inny procesor z oddzielną przestrzenią pamięci, a Erlang zrobi to za Ciebie. Tylko Erlang musi replikować argumenty do funkcji i wyniki między przestrzeniami pamięci (uwaga: nie byłoby to odpowiednie dla wszystkich rodzajów aplikacji...funkcja, która musiała działać na bardzo dużym stanie wejściowym, może powodować problemy z wydajnością podczas replikowania tego stanu).

Naiwne użycie wątków w aplikacji C++ może mieć różne procesory (w systemie wielordzeniowym) próbujące uzyskać dostęp do tej samej pamięci współdzielonej w tym samym czasie. System musi wtedy zrobić wiele należy upewnić się, że lokalne pamięci podręczne powiązane z każdym rdzeniem pozostają spójne. To jest, gdzie można cierpieć ogromne hity wydajności. Mamy w pracy aplikację, która obniża wydajność, gdy masz więcej niż kilka rdzeni z tego właśnie powodu. W rzeczywistości posunąłbym się tak daleko, że powiedziałbym, że lepiej będzie zaprojektować aplikacje tak, aby używały wątków tylko tam, gdzie trzeba wykonać asynchroniczne We/Wy, ale tam, gdzie trzeba mieć procesy wykonujące prawdziwą pracę i nie blokowane dla We/Wy, użyj pełnych procesów. Przez korzystając z pełnych procesów, gwarantujesz, że każdy proces ma własną przestrzeń pamięci i żadne dwa wątki nie będą używać tej samej pamięci w tym samym czasie (oczywiście musisz wtedy wymyślić dobry sposób komunikacji między tymi procesami). Z takim systemem i dyscypliną wokół zarządzania stanem i dystrybucji przetwarzania, możesz osiągnąć podobne wyniki do tego, co zapewnia Erlang, ale musisz zrobić wiele rzeczy infrastrukturalnych, które Erlang już dla Ciebie robi.

 15
Author: Stephen P. in Roswell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 04:19:05

Sprowadza się do wątków kontra procesów .

Systemy operacyjne zostały zaprojektowane tak, aby każdy "użytkownik" myślał, że ma cały komputer dla siebie - dlatego na przykład uruchamiasz apache jako użytkownik wwwrun .

Programiści, będąc programistami, zaczęli przeładowywać ten paradygmat, najpierw przez każdego ludzkiego użytkownika uruchamiającego wiele 'zadań'. Ponieważ systemy operacyjne zostały zaprojektowane dla wielu użytkowników, górna granica skalowania tej architektury odzwierciedlenie górnego limitu skalowania dla zalogowanych użytkowników - dlatego na przykład apache zacznie umierać od 4000 do 8000 użytkowników.

Procesy są dojrzałym paradygmatem(mój proces nie może upaść Twój). Kiedy jednak zaczynamy widzieć wprowadzenie wątków, rzeczy zaczynają się bardzo różnić. Tutaj mamy programy, które mają zewnętrzne działania blokujące (czekanie na dysku, czekanie na io, czekanie na pamięć), które chcą z jednej strony czekać, a z drugiej pracować i wątki pozwalają to zrobić i przezwyciężyć dwa problemy:

  • Nie można uzyskać wystarczającej ilości procesów, ponieważ system operacyjny nie może sobie z tym poradzić

  • Każdy proces jest kosztowny, ponieważ projektowo daje "użytkownikowi" pełną moc systemu operacyjnego

Problem z wątkami polega na tym, że przełamują one separację, do której zostały zaprojektowane procesy. Mój wątek może zniszczyć Twój wątek - błędy propagują.

Gdzie Erlang jest inny jest w liczba respektów. Praca doktorska Joe Armstronga nazywa się tworzeniem niezawodnych systemów rozproszonych w obecności błędów oprogramowania .

Niezawodność oznacza, że procesy są lepsze niż wątki. Problem polega na tym, że procesy systemów operacyjnych są zbyt "drogie", ponieważ są przeznaczone dla ludzi (jesteś właścicielem maszyny), a nie współbieżnych jednostek programów. W Erlang VM maszyna wirtualna ma pełną moc systemu dla wielu użytkowników (działa w procesie systemu operacyjnego) i każdy Proces Erlanga ma znacznie mniejszy kwant mocy współbieżnej - jeśli chce użyć "wielkiej maszyny", rozmawia z maszyną Wirtualną, która to robi. Tak więc procesy Erlang są znacznie tańsze niż procesy operacyjne(i wątki). Po prostu się spawnujesz, spawnujesz, spawnujesz. Po wyjęciu z pudełka Erlang VM zaczyna się od 2 * * 8 procesów, ale możesz zwiększyć to do milionów (jeśli masz wystarczającą ilość pamięci RAM).

Również, Jak to ujął Joe w pierwszej części pierwszej części swojej pracy doktorskiej, aby mieć niezawodne oprogramowanie, musisz zacząć z dwoma komputerami. Z Erlang / OTP, w czasie zapisu nie wiesz, na którym komputerze będzie uruchomione Twoje oprogramowanie. Klaster Erlang / OTP w czasie działania przydzieli pracę obliczeniową. Tak więc proces Erlanga jest dystrybuowany natywnie, podobnie jak spawn () (Erlang Fork ()) i ponownie uruchamia semantykę.

Ponieważ Erlang ma swoje własne procesy, ma swój własny scheduler i własny program ładujący kod/format binarny (Erlang może być interpretowany lub kompilowany do natywnych binariów). To wtedy daje zestaw dodatkowych korzyści-zanim napiszesz swoją aplikację Erlang/OTP, może ona już hot swapować swoje binaria, itp, itp

Więc oczywiście możesz pisać wielowątkowe aplikacje w C++ - ale Twoim obowiązkiem jest zapobieganie propagacji błędów i budowanie stabilności systemu.

I pewnie, że można zbudować niezawodne oprogramowanie w C - spójrz na Erlanga (VM jest napisane w C) chodzi o to, dlaczego miałbyś chcieć? W dawnych czasach firmy pisały własne "systemy operacyjne", można było napisać teraz masz własny system operacyjny, ale po co? Istnieją miliony linii solidnego testowanego kodu, który "robi to", podobnie jak 1,5 m Linii solidnego testowanego kodu w systemie Erlang/OTP, który "robi to".

Korzystanie z Erlang polega na używaniu rzeczy, które napisali inni ludzie i tylko budowanie bitów, które sprawiają, że Twoja firma jest skuteczna.

 24
Author: Gordon Guthrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 16:08:31

Przełącznik kontekstowy jest niezwykle drogi. W Erlang ich nie ma. Locks sprawia, że tradycyjne programy zaczynają myśleć, który wątek będzie następny. Jest to również niezwykle kosztowne.

 3
Author: Flinkman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 05:30:50

Gordon Guthrie ' S odpowiedź jest świetna. Gdzie jest większa różnica to osobiste preferencje. Z mojego punktu widzenia większa różnica w Erlang jest niezawodność i serendipitous skalowalność. W Erlang można projektować współbieżne procesy w sposób naturalny bez dużych problemów z wydajnością i będzie to serendipity skalowalne a dystrybuowalne. Istnieją pułapki w dużych wiadomości i tak, ale w większości przypadków Twój projekt będzie elegancki i działa dobrze bez szczególnej troski. Kiedy twój projekt jest elegancki, popełniasz mniej błędów, będzie lepiej zarządzalny, a nawiasem mówiąc, możesz rozprowadzać i skalować przy minimalnym wysiłku, a wynik będzie niezawodny.

Mówiąc krótko, w Erlang możesz zaprojektować swój program inaczej niż w C++, ponieważ możesz to zrobić bez dużego problemu z wydajnością i obiecuje dobrą skalowalność i niezawodność bez dużego wysiłku. Nikt nie jest idealny, ale dla ciekawie dużej ilości zadań Erlang jest najlepszym wyborem.

Edit : Nice prezentacja {[2] } o różnicy między Erlangiem A C++ - Erlang 2.5 x większa najwyższa wydajność, 3x mniejsze opóźnienia i 18X mniej SLOC - zakładam, że programiści Motoroli mają doświadczenie w C++ na tyle, aby pisać dobre oprogramowanie.

 2
Author: Hynek -Pichi- Vychodil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:30

Cóż, natura języka ze zmiennymi, które można ustawić tylko raz i fakt, że jest to język funkcjonalny automatycznie sprawia, że programy z dużą ilością równoległości są pisane i wykonywane "we właściwy sposób" dla wielordzeniowego.

Niewiele wiem o erlangu poza tymi dwoma faktami, więc może być coś jeszcze. Ale to nie znaczy, że nie można zrobić program C++ jako skalowalny, ale prawdopodobnie przejść przez wiele, aby osiągnąć wydajność, skalowalność i stabilność który przyjdzie bez kosztów, jeśli napiszesz w erlang.

 1
Author: Vasil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-13 04:23:46