У меня есть два процесса, один будет запрашивать данные у другого. Будет огромное количество запросов за ограниченное время (10000 в секунду), и данные (> 100 МБ) будут передаваться в секунду. Тип данных будет целым типом (double , число) У меня вопрос, как подключить этот процесс?
Общая память, очередь сообщений, lpc (вызов локальной процедуры) или другие ....
А еще я хочу спросить, какую библиотеку вы предлагаете? кстати, пожалуйста, не предлагайте MPI. редактировать: под Windows XP 32 бит





Одно слово: Boost.InterProcess. Если это действительно нужно быстро, то лучше всего использовать разделяемую память. У вас почти нет накладных расходов, поскольку операционная система выполняет обычное сопоставление между виртуальными и физическими адресами, и для данных не требуется копирование. Вам просто нужно следить за проблемами параллелизма.
Для фактической отправки таких команд, как неисправность и запрос, я бы использовал очереди сообщений. Я ранее использовал для этого сетевое программирование localhost и использовал ручное выделение разделяемой памяти, прежде чем я узнал о повышении. Блин, если бы мне пришлось переписать приложение, я бы сразу взял буст. Boost.InterProcess упрощает вам задачу. Проверить это.
Похоже, что та же проблема влияет на Boost :: Interprocess (по состоянию на 1_51) в окнах, т.е. вы не можете отправлять сообщения от low-priv до high-priv с помощью объекта boost :: interprocess :: message_queue.
Мой предыдущий комментарий неверен: чтобы отправить сообщение от low-priv к high-priv (т.е. чтобы позволить low-priv открывать очередь, созданную high-priv), нужно установить правильный объект разрешения, см. это
Я бы использовал общую память для хранения данных и очереди сообщений для отправки запросов.
Я поддержу предложение Марка - я бы не стал беспокоиться о повышении, если у вас нет проблем с переносимостью или если вы хотите делать классные вещи, такие как сопоставление стандартных типов контейнеров с общей памятью (в этом случае я бы определенно использовал boost).
В противном случае с очередями сообщений и общей памятью справиться довольно просто.
Если вы действительно используете разделяемую память, вам нужно будет решить, вращать или нет. Я ожидал, что если вы используете семафор для синхронизации и хранения данных в общей памяти, вы не получите большого преимущества в производительности по сравнению с использованием очередей сообщений (при значительном ухудшении ясности), но если вы включите атомарную переменную для синхронизации, тогда вы придется страдать от последствий этого.
Если ваши данные состоят из нескольких типов и / или вам нужны такие вещи, как мьютекс, используйте Boost. В противном случае используйте разделяемую часть памяти с помощью #pragma data_seg или файла с отображением памяти.
Будьте осторожны: в Windows> = Vista UIPI блокирует доступ с более низкой целостностью к процессам с более высокой целостностью. Например, процесс с более низким уровнем целостности не может отправлять оконные сообщения или подключаться к процессам с более высоким приоритетом.