Это сложная проблема.Если вы разветвляете одну программу для создания дочерних элементов, и только родительские и дочерние элементы будут использовать сегмент памяти, просто убедитесь, что сопоставили ее перед вилкой.Дети автоматически наследуют сопоставление от своего родителя, и нет необходимости использовать фиксированный адрес.
Если это не так, то первое, что нужно рассмотреть, - действительно ли вам нужно использовать необработанные контейнеры STL вместоускоренные межпроцессные контейнеры.То, что вы уже используете промежуточный процесс boost для выделения сегмента совместно используемой памяти, говорит о том, что у вас нет проблем с использованием boost, поэтому единственное преимущество, которое я могу придумать при использовании контейнеров STL, заключается в том, что вам не нужно переносить существующий код.Имейте в виду, что для работы с фиксированными адресами контейнеры и содержащиеся в них указатели на (при условии, что вы работаете с контейнерами указателей) должны храниться в общей памяти.
Если вы уверены, что это то, что вы хотите, вам нужно будет найти какой-то метод, чтобы договориться об адресе.Имейте в виду, что ОС может отклонять желаемый фиксированный адрес памяти .Он отклонит адрес, если страница по этому адресу уже была отображена в память или выделена.Поскольку разные программы будут распределять разные объемы памяти в разное время, то какие страницы будут доступны, а какие недоступны, будет зависеть от ваших программ.
Таким образом, вам нужно, чтобы программы достигли консенсуса по адресу памяти.Это означает, что несколько адресов могут быть опробованы и отклонены.Если возможно, что через некоторое время после запуска появится новая программа, поиск консенсуса придется начинать заново .Алгоритм будет выглядеть примерно так:
- Программа А предлагает адрес памяти X всем остальным программам.
- Другие программы отвечают с истинным или ложным, чтобы указать, отображается ли память по адресуX преуспел.
- Если программа A получает какие-либо ложные ответы, перейдите к # 1.
- Программа A отправляет сообщение другим программам, сообщая им, что адрес был проверен и, возможно, использован.
- Если новое приложение интересуется данными, оно должно уведомить программу А о том, что ему нужен адрес.
- Программа А затем должна сказать всем другим программам прекратить использование данных и перейти к # 1.
Чтобы выяснить, какие адреса А должен предлагать, вы можете иметь карту А с нефиксированным сегментом памяти, посмотреть, по какому адресу он сопоставлен, и предложить этот адрес.Если это неудовлетворительно, сопоставьте другой сегмент и предложите его.В какой-то момент вам понадобится отключить отображение сегментов, но вы не сможете сразу же отобразить их, потому что если вы удалите карту, то переназначите сегмент с одинаковым размером, и вероятность того, что ОС будет снова и снова возвращать вам один и тот же адрес. Имейте в виду, что вы никогда не достигнете консенсуса ;нет никакой гарантии, что во всех процессах имеется достаточно большой сегмент в общем месте.Это может произойти, если все ваши программы независимо используют почти всю память, скажем, если они зарезервированы тонной подкачки (хотя, если вы заботитесь о производительности, чтобы использовать общую память, надеюсь, вы избегаете подкачки).
Все вышеперечисленное предполагает, что вы находитесь в относительно ограниченном адресном пространстве. Если вы используете 64-разрядную версию, это может сработать . Перестановка оперативной памяти и памяти большинства компьютеров будет намного меньше, чем разрешено для 64-разрядных систем, поэтому вы можете поместить карту памяти в очень далеко фиксированный адрес, который вряд ли все процессы уже сопоставили. Я предлагаю по крайней мере 2 ^ 48, так как нынешние 64-битные процессоры x86 не выходят за пределы этого диапазона (несмотря на то, что указатели являются 64-битными, вы можете подключить только столько ОЗУ, сколько позволено 48-битным, но все равно тонна на время написания) Хотя нет никаких причин, по которым умный распределитель кучи не мог бы воспользоваться обширностью адресного пространства, чтобы сократить свою работу по ведению бухгалтерского учета, поэтому, чтобы быть по-настоящему надежным, вам все равно нужно будет достичь консенсуса. Имейте в виду, что вы, по крайней мере, захотите, чтобы адрес был настраиваемым - даже если в ближайшее время у нас не будет такого большого количества памяти, между этим и тем временем кто-то другой может иметь ту же идею и выбрать ваш адрес.
Для двунаправленной связи вы можете использовать любой из сокетов, каналов или другой сегмент совместно используемой памяти. Ваша ОС может предоставлять другие формы IPC. Но строго учтите, что вы, вероятно, сейчас вводите больше сложности, чем вам бы пришлось столкнуться, если бы вы просто использовали межпроцессные контейнеры Boost;)