Мне нужны 2 различных программы для работы над единственным набором данных. Я имею, может настроить сеть (UDP) соединение между ними, но я хочу избежать передачи целых данных каким-либо образом.
Это звучит немного абсурдным, но действительно ли возможно совместно использовать некоторый указатель между этими двумя программами так, чтобы, когда каждый обновляет его, другая простая банка получила указатель и начала использовать его??
Я использую Ubuntu 9.10
Вы говорите о межпроцессном взаимодействии IPC. Есть много вариантов.
Один из них - файл с отображением в памяти. Это близко к тому, что вы описали. Однако это может быть или не быть оптимальным подходом для ваших требований. Прочтите IPC, чтобы получить некоторую глубину.
Совместно используемая память может обеспечить максимальную пропускную способность из всех доступных IPC, но с ней также сложно справиться - вам необходимо синхронизировать доступ к общей памяти, как если бы вы делали это с потоками. Если вам действительно нужна эта необработанная полоса пропускания, это примерно лучший вариант, но дизайн, которому требуется такая пропускная способность, часто бывает с плохо выбранной разделительной линией между процессами, и в этом случае это может быть излишне сложно заставить его работать хорошо.
Также обратите внимание, что каналы (например) намного проще в использовании и по-прежнему имеют довольно серьезную полосу пропускания - они по-прежнему (обычно) используют выделенный ядром буфер в памяти, но они автоматизируют синхронизацию доступа к нему. Потеря полосы пропускания связана с тем, что автоматизация синхронизации требует очень пессимистичного алгоритма блокировки. Это все еще не налагает огромных накладных расходов ...
Возможно, лучше использовать memcached в качестве посредника между вашими двумя процессами, тогда каждый процесс может обменивать ключи друг на друга.
Вы ограничены, я полагаю, 1024 КБ на пару ключ / значение или меньше, но непосредственные преимущества - это совместимость, стабильность и будущая возможность соединять несколько процессов на нескольких машинах вместе.
То, что вы ищете, обычно называется «сегментом разделяемой памяти», и способ доступа к нему зависит от платформы.
В системах POSIX (большинство Unix / Linux) вы используете API shm _ * () в sys / shm.h.
В Win32 это делается с отображенными в память файлами, поэтому вы будете использовать CreateFileMapping () / MapViewOfFile () и т. Д.
Не уверен насчет Mac, но вы, вероятно, можете использовать и shm _ * () там.
Нет, извините. Я давно слышал об экспериментальной ОС с очень большим адресным пространством, где его части находились на одной машине, а другие части - на других. Это позволило бы именно то, о чем вы просите ...
Примечание: я предполагаю, что две программы работают на разных машинах. Если это просто разные процессы, вы можете использовать именованные разделы для обмена данными.
POSIX функции разделяемой памяти для Unix. Мэйнфреймы IBM (370/xa/esa/Zos) могут использовать службы кросс-памяти на низком уровне. Вы также должны учитывать, будет ли ваше приложение масштабироваться за пределы одного процессора или нет.
Если вам действительно, действительно нужно это сделать, это намек на то, что ваши две программы действительно могут быть изменены на одну с двумя потоками... (если у вас есть исходники программы, то сделать это проще простого).
Если отбросить тот факт, что это можно сделать, межпроцессное взаимодействие никогда не осуществляется путем совместного использования ресурсов - не говоря уже о пространствах памяти. Это верный рецепт катастрофы.
Правильное IPC осуществляется с помощью соответствующих средств связи, таких как сокеты. Совместное использование памяти - это не выход.