Rozumiem, że dwie z wielu innych opcji komunikacji między procesami mogą być:
- Pamięć współdzielona
- 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.
Odpowiedzi:
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.
źródło
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.
źródło