Jakie są zalety i wady komunikacji między procesami dokonywane za pośrednictwem gniazd a pamięci współdzielonej?

9

Rozumiem, że dwie z wielu innych opcji komunikacji między procesami mogą być:

  1. Pamięć współdzielona
  2. Gniazda

Właściwie widziałem te dwie opcje ujawniane przez Intellij Idea do debugowania aplikacji Java. Chcę wiedzieć, jakie są zalety i wady każdego podejścia.

Maniak
źródło
Nowszą metodą jest D-Bus.
ott--
@ ott-- Czy D-Bus nie używa samych gniazd domeny Unix?
@BrianMarshall Rzeczywiście, domeny i gniazda TCP / IP.
ott--
Tutaj też są odpowiedzi: stackoverflow.com/a/1844919/632951
Pacerier

Odpowiedzi:

11

Kilka zalet dla każdego z góry mojej głowy. Pamiętaj, że niektóre z tych elementów mogą nie mieć zastosowania we wszystkich przypadkach; są to tylko ogólne obserwacje.

Gniazda

Prosty i kontrolowany. W razie potrzeby można rozszerzyć na gniazda sieciowe z niewielkimi modyfikacjami lub bez modyfikacji. Model programowania wymaga serializacji, co z kolei wymaga zastanowienia się, jakie dane faktycznie są przesyłane z A do B. Synchronizacja jest koniecznie wbudowana w mechanizm komunikacyjny; żadna inna synchronizacja nie jest konieczna.

Pamięć współdzielona

Niekoniecznie wymaga syscall (dlatego potencjalnie szybszy). Udostępnianie nie wymaga jawnego przesyłania danych - można udostępnić dane, których odbiorca nie pobiera (przepustowość nie musi być marnowana na przesyłanie danych, których odbiorca nie użyje). Brak etapu serializacji / deserializacji oznacza brak czasu poświęcanego na narzut komunikacji.

tylerl
źródło
4
+1: gniazda skalują się do systemów rozproszonych, podczas gdy pamięć współdzielona jest znacznie szybsza.
mouviciel
@tylerl Dlaczego pamięć współdzielona nie wymaga wywołania systemowego?
Geek
@Geek: Przeczytaj o tym, jak zarządzanie pamięcią wirtualną jest wdrażane we współczesnych systemach operacyjnych. Zasadniczo pamięć współdzielona jest realizowana prawie identycznie jak normalna pamięć procesowa. Zdarza się tak, że ta sama strona fizyczna jest celowo mapowana na 2 (lub N) różnych procesów. Ale po ustanowieniu tego mapowania * px = 5 tworzy ten sam zestaw instrukcji, niezależnie od tego, czy px wskazuje na zmienną regularną, czy też wskazuje na segment pamięci wspólnej.
DXM
technicznie nie trzeba serializować danych przez gniazdo, jeśli miejsce docelowe może zaakceptować nieprzetworzony strumień bajtów w wysyłanym formacie. Większość ludzi oczywiście serializuje, aby wysłać je do każdego.
gbjbaanb
1
@gbjbaanb Myślę, że technicznie serializujesz dane, jeśli są przesyłane jako sekwencyjny ciąg bitów, bez względu na to, jaka jest struktura kodowania.
tylerl
6

Gniazda są jeden do jednego. Potrzebujesz wielu gniazd, jeśli chcesz wysłać to samo do wielu procesów. Dzięki pamięci współdzielonej możesz mieć wielu czytników, a także wielu pisarzy.

Gniazda wymagają dużych zasobów. Każda wiadomość przechodzi przez system operacyjny. Dzięki pamięci współdzielonej mapujesz pamięć współdzieloną, ale raz w pamięci aplikacji i od tej chwili możesz z niej korzystać. Jednak nadal musisz przejść przez system operacyjny, gdy korzystasz z pamięci współdzielonej; patrz poniżej.

Gniazda są zsynchronizowane (o ile nie korzystasz z UDP). W przypadku pamięci współdzielonej prawie nieuchronnie potrzebny jest dodatkowy mechanizm informujący inne procesy, że odczyt / zapis w pamięci współdzielonej jest w porządku / nie jest OK. Nie rób tego, a będziesz mieć problemy z uszkodzoną pamięcią. Przykład: załóżmy, że proces A zaczyna odczytywać współużytkowaną pamięć, ale zostaje częściowo zamieniony w trakcie odczytu. Proces B zapisuje w tej samej części pamięci współużytkowanej. Gdy proces A uruchamia się ponownie i kontynuuje czytanie pamięci współużytkowanej, to co wczytało, to połączenie starych i nowych danych. Aby temu zapobiec, nadal korzystasz z systemu operacyjnego, gdy korzystasz z pamięci współdzielonej.

Dość łatwo jest przekonwertować zestaw aplikacji opartych na gniazdach na taki, który korzysta z gniazd sieciowych. Możesz rozszerzyć przetwarzanie na wszystkie maszyny w swoim laboratorium lub jeszcze dalej. po prostu nie mogę tego zrobić ze wspólną pamięcią. Jesteś zablokowany na jednym komputerze z rozwiązaniem opartym na pamięci współdzielonej.

Gniazda są przeznaczone do małych ilości danych, pamięć współdzielona do dużych ilości danych. Istnieją różne mechanizmy rozwiązywania różnych problemów.

David Hammen
źródło