2010-01-20 9 views

Odpowiedz

53

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

  • tryb blokowania i non-blocking i przełączanie między nimi
  • nie trzeba, aby je uwolnić, gdy zadania są zakończone

gniazd domeny niekorzystne

  • muszą czytać i pisać w sposób liniowy

wieloosobowe zalety pamięci

  • nieliniowy przechowywania
  • nigdy nie będzie blokować
  • wiele programów do niego dostęp

Shared Memory niekorzystne

  • konieczność blokowania realizacji ma
  • potrzebę ręcznego uwolnienie, nawet jeśli nieużywane przez dowolny program

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.

+0

+1 do porównania. – jldupont

+0

Dzięki za szczegółową odpowiedź i porównanie! – SyBer

+2

'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/) –

2

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ć.

7

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.

+0

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ć. –

+0

Istnieją co najmniej dwie dodatkowe kopie - od użytkownika do jądra, a następnie z powrotem. –

0

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.

+2

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. –

Powiązane problemy