Какой IPC здесь более эффективен? - PullRequest
5 голосов
/ 03 марта 2011

У меня есть системное приложение, которое работает как коллекция из 12 процессов в Unix.Существует процесс мониторинга, который обменивается данными с 11 другими процессами.

Требование IPC состоит в том, чтобы эти 11 процессов взаимодействовали с процессом мониторинга, разработанным таким образом, который наиболее эффективен с точки зрения выполнения.Можете ли вы, ребята, взвесить два приведенных ниже варианта или предложить лучший.

1) имеет связь через сокет UDP, где эти 11 процессов будут периодически передавать данные в процесс мониторинга.процесс монитора просто слушает и захватывает информацию, которая достаточно хороша.

ИЛИ

2) имеют реализацию с общей памятью.Таким образом, существует 11 сегментов общей памяти, каждый из которых разделен между двумя процессами (процесс i-й и процесс мониторинга).

Для общей памяти это кажется быстрее, но требуется блокировка / синхронизация, где, как в udp,Ядро копирует данные из памяти одного процесса в другой.

Может ли кто-нибудь предоставить больше информации, чтобы помочь лучше оценить два метода.?Спасибо.

Ответы [ 3 ]

5 голосов
/ 03 марта 2011

Координация совместно используемой памяти является сложной задачей.Родитель должен знать, когда читать, какую часть каждого из 11 сегментов совместно используемой памяти, и сообщить ребенку, когда данные были прочитаны, чтобы можно было повторно использовать часть совместно используемой памяти и т. Д. Таким образом, хотя копирование может бытьбыстрее, остальная часть координации (возможно, с использованием наборов семафоров - возможно, с 22 семафорами, по одному для каждого направления из 11 каналов связи) означает, что вы почти наверняка найдете механизм, основанный на дескрипторе файла, гораздо проще для кодирования.Системные вызовы select() или poll() или другие варианты могут использоваться, чтобы сообщить вам, когда есть данные для чтения мастером.И ядро ​​решает все неприятные вопросы планирования и управления потоками и т. Д.

Итак, используйте сокеты Unix-домена, если вы не можете реально продемонстрировать, что вы получите выигрыш в производительности от версии с общей памятью,Но ожидайте потерять некоторые волоски (и некоторые данные), получая правильную реализацию совместно используемой памяти.(Вы можете продемонстрировать, есть ли выигрыш в производительности при использовании совместно используемой памяти с грубой, неправильно синхронизированной системой; вы, вероятно, не пойдете в производство с грубой неправильно синхронизированной системой.)

2 голосов
/ 03 марта 2011

Многое зависит от того, сколько данных процессы должны обмениваться друг с другом.Если будет много данных (например, мегабайты или гигабайты), переданных туда и обратно, то совместно используемая память будет более эффективным способом.Если объем данных будет относительно небольшим (килобайт или, может быть, несколько мегабайт), то подход на основе сокетов, вероятно, предпочтительнее, поскольку эффективность не будет иметь большого значения, а отказ от общей памяти сделает вашу систему более надежной ипроще в разработке и отладке.

Кроме того, некоторые ядра поддерживают создание сетей с нулевым копированием, и в этом случае отправка пакетов UDP от одного процесса другому может фактически не требовать от ядра копирования данных вообще, а просто перераспределяетсябазовые страницы MMU в процессе назначения.Если это так, то подход сокетов даст вам лучшее из обоих миров (эффективность И надежность).

1 голос
/ 03 марта 2011

В UDP доставка не гарантируется, и бывают случаи, когда пакеты отбрасываются даже при локальной связи. Таким образом, MMF, вероятно, будет лучше.

...