Можно ли иметь общий указатель между двумя разными программами на одном компьютере? - PullRequest
7 голосов
/ 26 февраля 2010

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

Звучит немного абсурдно, но возможно ли разделить указатель между этими двумя программами, чтобы одна обновляла его, а другая могла просто получить указатель и начать его использовать?

Я использую Ubuntu 9.10

Ответы [ 8 ]

12 голосов
/ 26 февраля 2010

Вы говорите об IPC - межпроцессное взаимодействие. Есть много вариантов.

Один из них - это отображенный в память файл. Это близко к тому, что вы описали. Это может или не может быть оптимальным подходом для ваших требований, хотя. Читайте IPC, чтобы получить некоторую глубину.

9 голосов
/ 26 февраля 2010

То, что вы ищете, обычно называется «сегментом совместно используемой памяти», и способ доступа к нему зависит от платформы.

В системах POSIX (большинство Unix / Linux) вы используете API shm _ * () в sys / shm.h.

В Win32 это делается с отображенными в память файлами, поэтому вы будете использовать CreateFileMapping () / MapViewOfFile () и т. Д.

Не уверен насчет Mac, но вы также можете использовать там shm _ * ().

2 голосов
/ 26 февраля 2010

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

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

1 голос
/ 26 февраля 2010

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

1 голос
/ 26 февраля 2010

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

Вы ограничены, я полагаю, 1024Кб на пару ключ / значение или меньше, но непосредственными преимуществами являются функциональная совместимость, стабильность и возможность в будущем соединять несколько процессов на нескольких машинах вместе.

1 голос
/ 26 февраля 2010

Функции совместно используемой памяти POSIX для разновидностей Unix. Мэйнфреймы IBM (370 / xa / esa / Zos) могут использовать службы кросс-памяти на низком уровне. Вы также должны решить, будет ли ваше приложение масштабироваться за пределы одного процессора или нет.

0 голосов
/ 26 февраля 2010

Если оставить в стороне тот факт, что можно сделать, межпроцессное взаимодействие никогда не осуществляется путем совместного использования ресурсов - не говоря уже о пространствах памяти . Это правильный рецепт для катастрофы.

Правильный IPC осуществляется с помощью надлежащих средств связи, таких как розетки. Разделение памяти - это никогда не путь.

0 голосов
/ 26 февраля 2010

Нет, извините. Я давно слышал об экспериментальной ОС, которая имела очень большое адресное пространство, где ее части были на одной машине, а другие - на других. Это позволило бы именно то, что вы просите ...

Примечание. Я предполагаю, что две программы работают на разных компьютерах. Если это просто разные процессы, вы можете использовать именованные разделы для обмена данными.

...