Лучший способ межпроцессного взаимодействия на C ++

У меня есть два процесса, один будет запрашивать данные у другого. Будет огромное количество запросов за ограниченное время (10000 в секунду), и данные (> 100 МБ) будут передаваться в секунду. Тип данных будет целым типом (double , int) У меня вопрос, как подключить этот процесс?

Общая память, очередь сообщений, lpc (вызов локальной процедуры) или другие ....

А еще я хочу спросить, какую библиотеку вы предлагаете? кстати, пожалуйста, не предлагайте MPI. редактировать: под Windows XP 32 бит


person Qubeuc    schedule 16.12.2008    source источник


Ответы (5)


Одно слово: Boost.InterProcess. Если это действительно нужно быстро, то лучше всего использовать разделяемую память. У вас почти нулевые накладные расходы, поскольку операционная система выполняет обычное сопоставление между виртуальными и физическими адресами, и для данных не требуется копирование. Вам просто нужно следить за проблемами параллелизма.

Для фактической отправки таких команд, как выключение и query, я бы использовал очереди сообщений. Я ранее использовал для этого сетевое программирование localhost и использовал ручное выделение разделяемой памяти, прежде чем я узнал о повышении. Блин, если бы мне пришлось приложение переписывать, я бы сразу взял буст. Boost.InterProcess упрощает вам задачу. Проверить это.

person Johannes Schaub - litb    schedule 16.12.2008
comment
Будьте осторожны: в Windows ›= Vista UIPI блокирует доступ с более низким уровнем целостности к процессам с более высоким уровнем целостности. Например, процесс с более низким уровнем целостности не может отправлять оконные сообщения или подключаться к процессам с более высоким приоритетом. - person Alex; 19.09.2012
comment
Похоже, что та же проблема влияет на Boost :: Interprocess (по состоянию на 1_51) в Windows, т.е. вы не можете отправлять сообщения от low-priv до high-priv с помощью объекта boost :: interprocess :: message_queue. - person Alex; 24.09.2012
comment
Мой предыдущий комментарий неверен: для того, чтобы отправить сообщение от low-priv к high-priv (т.е. чтобы позволить low-priv открывать очередь, созданную high-priv), нужно установить соответствующий объект разрешения, см. это - person Alex; 25.09.2012

Я бы использовал общую память для хранения данных и очереди сообщений для отправки запросов.

person Marc    schedule 16.12.2008

Я поддержу предложение Марка - я бы не стал беспокоиться о повышении, если у вас нет проблем с переносимостью или если вы хотите делать классные вещи, такие как сопоставление стандартных типов контейнеров с общей памятью (в этом случае я бы определенно использовал boost).

В противном случае с очередями сообщений и общей памятью справиться довольно просто.

person Community    schedule 16.12.2008

Если ваши данные состоят из нескольких типов и / или вам нужны такие вещи, как мьютекс, используйте Boost. В противном случае используйте разделяемую часть памяти с помощью #pragma data_seg или файла с отображением памяти.

person EhevuTov    schedule 21.07.2011

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

person Greg Rogers    schedule 16.12.2008