W jaki znaczący sposób Erlang zapobiega warunkom wyścigowym podczas równoczesnego programowania?

11

Czytanie o współbieżności w Erlangu przypomina mi zestaw narzędzi do współbieżności Akka . Oba zapewniają narzędzia do zapobiegania lub ograniczania warunków wyścigu . Możesz jednak wysyłać linki do zmiennych danych do innych procesów za pomocą zestawu narzędzi Akka, który nadal jest niebezpieczny. Uważam Akka za przydatne narzędzie, ale nie zapewnia ono ochrony przed nieuporządkowanym dostępem do obiektów i danych prowadzącym do warunków wyścigowych, impasu i / lub głodu. Nie zapobiega to pisaniu niebezpiecznego kodu w sposób, w jaki Java lub C # chroni cię przed pisaniem większości rodzajów wycieków pamięci, które możesz napisać w C ++ (nadal możesz tworzyć wycieki pamięci w Javie, oszukując moduł wyrzucania elementów bezużytecznych, ale jest mniej problemu niż konieczność zwalniania każdego przydzielonego bajtu).

Czy Erlang gwarantuje stopień poprawności, wydajności i solidności w programowaniu współbieżnym? Myślę, że systemy operacyjne zapewniają ochronę podczas uzyskiwania dostępu do zasobów systemowych (zakładając, że autorzy sterowników wykonali swoje zadania dobrze). Bazy danych ACID zapewniają ochronę odczytów i aktualizacji. Wygląda więc na to, że jest to problem do rozwiązania. A może ogólne bezpieczne rozwiązanie zniweluje wzrost wydajności zapewniany przez współbieżność? Czy inne języki lub zestawy narzędzi zapewniają równoczesne bezpieczeństwo, które Erlang robi (lub nie robi)?

To pytanie uzupełniające do komentarza @ Malfist do odpowiedzi @ user1249 na: Jaki język programowania generuje najmniej trudnych do znalezienia błędów? .

GlenPeterson
źródło

Odpowiedzi:

19

Jest kilka rzeczy, które robi Erlang, aby im pomóc.

  • Dane są niezmienne, więc nie ma wyścigów danych
  • Serwery OTP gen_servers i gen_fsm zapewniają bardzo dobrze przetestowany wzorzec dla serwerów
  • Organy nadzoru pozwalają na odzyskanie systemu po awarii
  • procesy są małe i tanie
  • Pamięć jest przydzielana dla poszczególnych procesów (bez zawieszania się GC)
  • Erlang VM jest zoptymalizowany do pracy pod bardzo dużymi obciążeniami
  • Oprogramowanie można aktualizować na bieżąco, więc nie ma przestojów w aktualizacji

Najważniejsze jest to, że w Erlang nie ma stanu wspólnego, który mógłby wymagać blokady, więc nie ma potrzeby blokowania. Jest to świetny język dla miękkich aplikacji w czasie rzeczywistym, które nie wymagają przestojów oraz wysokiej odporności na awarie i współbieżności

Zachary K.
źródło
12
@JarrodRoberson: W rzeczywistości głównym punktem nie jest wspólny stan mutable . Stan udostępniania nie stanowi problemu, jeśli go nie mutujesz. Zmienny stan nie stanowi problemu, jeśli go nie udostępnisz.
Jörg W Mittag
1
Istnieje również nowe narzędzie Concuerror youtube.com/watch?v=FpkjKN9wTKg, które pozwala uruchamiać testy ze wszystkimi możliwymi porządkami zdarzeń
Zachary K