2011-03-03 16 views
5

Mam aplikację systemową, która działa jako zbiór 12 procesów na systemie UNIX. Istnieje proces monitorowania, który wymienia dane z 11 innymi procesami.Który IPC jest tutaj bardziej wydajny?

Wymóg IPC polega na komunikacji tych 11 procesów z procesem monitorowania, zaprojektowanym w sposób najbardziej efektywny pod względem wykonania. Czy możecie zważyć dwie poniższe opcje lub zaproponować lepszą opcję?

1) posiadać komunikację w gnieździe UDP, w którym te 11 procesów przesyła dane do procesu monitorowania w okresowych odstępach czasu. proces monitorowania polega jedynie na słuchaniu i przechwytywaniu informacji, które są wystarczająco dobre.

LUB

2) mają wspólną realizację pamięci. więc mamy 11 segmentów pamięci dzielonej, z których każdy jest dzielony między 2 procesy (proces i proces monitorowania).

Dla pamięci współdzielonej wydaje się szybsza, ale wymagana jest blokada/synchronizacja, gdzie jak w UDP, jądro kopiuje dane z przestrzeni pamięci jednego procesu do drugiego.

Czy ktoś może podać więcej danych wejściowych, aby lepiej ocenić dwie metody. ? Dzięki.

+3

Czy naprawdę masz na myśli gniazdo UDP, lub masz na myśli gniazda domeny Unix? –

Odpowiedz

5

Koordynowanie pamięci współużytkowanej jest trudne. Rodzic musi wiedzieć, kiedy odczytać, która część każdego z 11 segmentów pamięci współdzielonej, i niech dziecko wie, kiedy dane zostały przeczytane, aby część pamięci współdzielonej mogła być ponownie wykorzystana itd. Tak więc, chociaż kopiowanie może być Szybciej, reszta koordynacji (może przy użyciu zestawów semaforów - może z 22 semaforami, po jednym dla każdego kierunku z 11 kanałów komunikacyjnych) oznacza, że ​​prawie na pewno łatwiej będzie kodować mechanizm oparty na deskryptorze plików. Wywołania select() lublub wariantowe wywołania systemowe mogą być użyte w celu poinformowania użytkownika o danych do odczytania przez wzorzec. Jądro zajmuje się wszystkimi nieprzyjemnymi problemami związanymi z planowaniem i kontrolą przepływu i tak dalej.

Używaj gniazd domeny Unix, chyba że naprawdę możesz zademonstrować, że uzyskasz korzyści związane z wydajnością z wersji pamięci współużytkowanej. Ale spodziewaj się, że stracisz włosy (i niektóre dane), które poprawią implementację pamięci wspólnej. (Możesz zademonstrować, czy korzystasz z pamięci współdzielonej z surowym, niewłaściwie zsynchronizowanym systemem, prawdopodobnie nie przejdziesz do produkcji z surowym nieprawidłowo zsynchronizowanym systemem.)

2

To zależy w dużej mierze od ilości danych, które procesy muszą ze sobą współdzielić. Jeśli będzie przekazywać wiele danych (na przykład megabajtów lub gigabajtów), to udostępnianie pamięci stanie się bardziej wydajną metodą. Jeśli będzie tylko stosunkowo niewielka ilość danych (kilobajty lub kilka megabajtów), wówczas preferowane może być podejście oparte na gniazdach, ponieważ wydajność nie będzie bardzo ważna, a unikanie pamięci współdzielonej sprawi, że system będzie bardziej odporny i łatwiejsze do opracowania i debugowania.

Ponadto, niektóre jądra obsługują zerową kopię sieci, w takim przypadku wysyłanie pakietów UDP z jednego procesu do drugiego może w rzeczywistości nie wymagać, aby jądro w ogóle kopiowało dane, zamiast tego zmienia tylko podstawowe strony MMU w proces docelowy . W takim przypadku podejście oparte na gniazdach zapewni najlepsze z obu światów (efektywność i odporność).

+1

1) Dane będą miały średnicę rzędu: 30 kb/min (przypadki obciążenia około 60 kb/min).2) łatwość kodu nie jest problemem, ponieważ mamy czas i wysiłek pod ręką, aby uczynić go najbardziej zorientowanym na wydajność. – sbr

+2

60 kilobajtów na minutę to niewielkie obciążenie dla nowoczesnego komputera (nawet dla nowoczesnego komputera wbudowanego). Jeśli twój ładunek jest naprawdę tak niski, nie ma znaczenia, w jaki sposób realizujesz rzeczy; osiągniesz dobre wyniki przy prawie każdym rozsądnym mechanizmie. Nie spędziłbym zbyt wielu godzin programowania na skomplikowanym mechanizmie, gdy jedyną korzyścią byłoby, gdybyś zobaczył 0,01% użycia procesora zamiast 0,02%. Gdyby to był ja, używałbym tylko gniazd TCP (lub UNIX). –

1

W przypadku dostarczania UDP nie jest gwarantowane, a zdarzają się sytuacje, gdy pakiety są zrzucane nawet w komunikacji localhost. Zatem FRP prawdopodobnie byłyby lepsze.

Powiązane problemy