Czy każdy może powiedzieć, jak wolne są gniazda domeny systemu UNIX w porównaniu z pamięcią wspólną (lub alternatywnym plikiem mapowanym w pamięci)?Gniazda domeny systemu UNIX a pamięć współużytkowana (plik odwzorowany)
Dzięki.
Czy każdy może powiedzieć, jak wolne są gniazda domeny systemu UNIX w porównaniu z pamięcią wspólną (lub alternatywnym plikiem mapowanym w pamięci)?Gniazda domeny systemu UNIX a pamięć współużytkowana (plik odwzorowany)
Dzięki.
To bardziej kwestia projektu niż prędkości (pamięć wspólna jest szybsza), gniazda domenowe są zdecydowanie bardziej uniksowe i mają znacznie mniej problemów. Pod względem wyboru wiedzieć wcześniej: Gniazda
Domena zalety
gniazd domeny niekorzystne
wieloosobowe zalety pamięci
Shared Memory niekorzystne
To wszystko, co mogę myśleć już teraz. Jednak korzystałbym z gniazd domenowych każdego dnia - nie wspominając o tym, że jest o wiele łatwiej niż ponowne wdrażanie ich do przetwarzania rozproszonego. Zwiększenie prędkości pamięci współdzielonej zostanie utracone ze względu na potrzebę bezpiecznego projektu. Jeśli jednak wiesz dokładnie, co robisz i korzystasz z odpowiednich wywołań jądra, możesz osiągnąć większą prędkość dzięki współużytkowanej pamięci.
Oba są mechanizmami komunikacji między procesami (IPC). Gniazda domeny UNIX służą do komunikacji między procesami na jednym hoście, podobnie jak gniazda TCP między różnymi hostami. Pamięć współdzielona (SHM) to pamięć, w której można umieszczać dane i udostępniać je pomiędzy procesami. SHM zapewnia dostęp losowy za pomocą wskaźników, Gniazda mogą być zapisywane lub czytane, ale nie można przewijać ani pozycjonować.
Pod względem szybkości pamięć współdzielona jest zdecydowanie zwycięzcą. Dzięki gniazdom będziesz mieć co najmniej dwie kopie danych - od procesu wysyłania do bufora jądra, a następnie od jądra do procesu odbierającego. W przypadku pamięci współdzielonej opóźnienie będzie wiązało się tylko z algorytmem spójności pamięci podręcznej między rdzeniami w skrzynce.
Jak zauważa Kornel, zajmowanie się pamięcią wspólną jest bardziej skomplikowane, ponieważ trzeba wymyślić własny schemat synchronizacji/sygnalizacji, który może dodać opóźnienie w zależności od trasy. Zdecydowanie użyj semaforów we wspólnej pamięci (zaimplementowanej z futex w systemie Linux), aby uniknąć wywołań systemowych w przypadku bez rywalizacji.
Wierzę, że to, co oddziela gniazda domeny Uniksa od normalne gniazda to to, że zapis na jednym końcu idzie bezpośrednio do bufora (-ów) odbiorczego na drugim końcu. Więc niekoniecznie są dodatkowe kopie. Może to być nadal więcej kopii, niż jest to wymagane, jeśli potrafisz znaleźć sposób, w jaki aplikacje będą używać tego samego obiektu we wspólnej pamięci zamiast go kopiować. –
Istnieją co najmniej dwie dodatkowe kopie - od użytkownika do jądra, a następnie z powrotem. –
W takim przypadku gniazda są szybsze. Zapis do pamięci współdzielonej jest szybszy niż dowolny IPC, ale zapis do pliku zmapowanego w pamięci i zapis do pamięci współdzielonej to dwie zupełnie różne rzeczy.
podczas zapisywania do pliku zmapowanego w pamięci trzeba "wypróżnić" to, co zostało zapisane w pamięci współdzielonej do rzeczywistego pliku powiązanego (nie do końca, kolor jest robiony dla ciebie), więc najpierw skopiuj dane do pliku pamięć współdzielona, a następnie kopiujesz ją ponownie (flush) do rzeczywistego pliku i to jest super duper ekspansywny - więcej niż cokolwiek, nawet więcej niż pisanie do gniazda, nic nie zyskujesz przez to.
To nie jest prawda. Konfigurowanie pamięci współużytkowanej jest stosunkowo łatwe dzięki plikowi mapowanemu w pamięci (który jest normalnym mechanizmem), a udostępnianie danych odbywa się w szybki sposób. –
+1 do porównania. – jldupont
Dzięki za szczegółową odpowiedź i porównanie! – SyBer
'potrzeby ręcznego zwalniania, nawet jeśli nieużywane przez żaden program' może być zwalczane za pomocą [' /dev/ashmem'](http://lwn.net/Articles/452035/) –