2010-10-24 11 views
20

Istnieje co najmniej trzy dobrze znane podejścia do tworzenia równoległych aplikacji:współbieżne techniki programowania, plusy, minusy

  1. Wielowątkowość i synchronizacja pamięci poprzez blokowanie (.NET, Java). Software Transactional Memory (link text) to kolejne podejście do synchronizacji.

  2. Przesyłanie asynchronicznych wiadomości (Erlang).

Chciałbym dowiedzieć się, czy istnieją inne podejścia i omówić różne wady i zalety tych podejść stosowane do dużych aplikacji rozproszonych. Moim głównym celem jest upraszczanie życia programisty.

Na przykład, moim zdaniem, używanie wielu wątków jest łatwe, gdy nie ma między nimi zależności, co jest dość rzadkie. We wszystkich innych przypadkach kod synchronizacji wątku staje się dość kłopotliwy i trudny do debugowania i powodu.

+3

Dodaj jeszcze jeden do swojej listy: pamięć transakcyjna oprogramowanie (http://en.wikipedia.org/wiki/Software_transactional_memory). Dostępna jest również wersja Java: http://multiverse.codehaus.org/ –

+0

Dodano jako podelement do 1). Nie wygląda to na koncepcyjnie nowy sposób pisania współbieżnych aplikacji, a raczej jako alternatywę dla konstrukcji blokujących. –

+0

@Serge: Nie jestem pewien, dlaczego widzę, dlaczego jest on mniej koncepcyjnie inny niż przekazywanie wiadomości. – jalf

Odpowiedz

8

Gorąco polecam patrząc na this presentation Rich Hickey. Opisuje podejście do budowania wydajnych, współbieżnych aplikacji, które, jak twierdzę, różnią się od projektów opartych na blokadach lub przekazywaniu komunikatów.

zasadzie to podkreśla:

  • Lock Free, wielowątkowy współbieżnych aplikacji
  • niezmiennymi trwała struktura danych
  • Zmiany stanu obsługiwane przez Software Transakcyjnej Pamięci

i mówi o tym, jak zasady te wpłynęły na konstrukcję języka Clojure.

5

Przeczytaj Herb Sutter kolumnę Effective Concurrency, a ty też będziesz oświecony.

+0

Świetne znalezisko Podczas gdy doceniam, jak głęboko on zagłębia się w synchronizację wątku, koncentruje się głównie na wątkach, blokowaniu i operacjach atomowych, co jest tylko jednym z wielu podejść do współbieżności. Kilka artykułów, ale IMHO nie idzie zbyt daleko.Również, jego artykuły pokazują, jak trudno jest uzyskać wielowątkowe prawo.Jestem nadal ma koszmary o różnych modelach pamięci –

+0

Tak, kolumny Sutters mają określony nacisk na robienie tradycyjna synchronizacja za pomocą blokady jest łatwiejsza w zarządzaniu, niż eksploracja * alternatywnych * technik, ale mimo to dobrze się czyta – jalf

2

Dzięki interfejsowi API do współbieżności Java 5 współbieżne programowanie w języku Java nie musi być uciążliwe i trudne, o ile korzystasz z narzędzi wysokiego poziomu i używasz ich poprawnie. Znalazłem książkę, Współzależność Java w praktyce Briana Goetza, aby była doskonałą lekturą na ten temat. Podczas mojej ostatniej pracy wykorzystałem techniki z tej książki, aby przekształcić niektóre algorytmy przetwarzania obrazu w wiele procesorów i potoczyć zadania związane z procesorem i dyskiem. Uważam, że jest to wspaniałe doświadczenie i osiągnęliśmy doskonałe wyniki.

Jeśli używasz C++, możesz wypróbować OpenMP, który używa dyrektyw #pragma do tworzenia równoległych pętli, chociaż nigdy nie używałam go sam.

+0

Nie Równoległe i równoległe nie są synonimami.tbb dostarcza również 'parallel_for',' parallel_map' i 'parallel_reduce', ale nie pomaga w współbieżności. Podobnie istniały języki, takie jak newsqueak, które były zorientowane na współbieżność, ale nie zapewniały przetwarzania równoległego. – Dustin

+0

+1, dobra książka i porada - zaskakująco rzadko zdarza się, że * potrzebujesz * do pisania skomplikowanego, wątkowo bezpiecznego kodu przy użyciu prymitywów niskopoziomowych w Javie. Przeglądanie i wnioskowanie na temat kodu korzystającego z nowszych interfejsów API jest znacznie łatwiejsze. – SimonJ

+2

Microsoft wydał TPL z .NET 4.0, który jest zbiorem abstrakcji wyższego poziomu nad wątkami podobnymi do Javy. Upraszczając kodowanie kłopotliwych problemów równoległych, nie pomaga to jednak w zarządzaniu stanem współdzielonym, a raczej daje fałszywe wrażenie prostoty. –

1

W Erlang and OTP in Action autorzy przedstawiają cztery proces komunikacji paradygmaty:

  • wspólna pamięć zamki

    Konstrukt (zamka) służy do ograniczyć dostęp do udostępnionych zasobów. Często wymagana jest obsługa sprzętu z systemu pamięci, pod względem instrukcji specjalnych .Wśród możliwych wad tego podejścia: narzut, punkty sporne w systemie pamięci, trudności w debugowaniu, szczególnie przy ogromnej liczbie procesów.

  • Software transakcyjna pamięci

    Pamięć jest traktowany jako bazie, gdzie transakcje zdecydować, co pisać i kiedy. Główny problem tutaj: jest reprezentowany przez ewentualne niezgodności z i liczby nieudanych prób transakcji transakcji .

  • Futures, obietnice i podobne

    Podstawowym założeniem jest to, że przyszłość jest wynikiem obliczeń, który został zlecane innym procesie (potencjalnie na innym CPU lub maszyna) i może być przekazana około jak każdy inny obiekt. W przypadku wystąpienia błędu sieci może wystąpić problem z siecią.

  • przechodząc

    synchroniczny lub asynchroniczny, w Erlang stylu wiadomość.

Powiązane problemy