Ваш вопрос немного широк и сводится к "Я боюсь сделать это неправильно".Итак, позвольте мне кратко остановиться на проблемах.
Позволяет ли куча памяти увеличить размер оперативного сегмента памяти (когда процессы обращаются к нему)?
Если вы имеете в видуобычная куча процессов (что облегчается стандартными библиотеками (C)), то да.Я не думаю, что вам когда-либо требовалось явно указывать размер кучи (не говоря уже о ее увеличении) за последние 20-30 лет.
Да, операционные кучи прозрачно увеличиваются ОС¹.
В чем разница между управляемой разделяемой памятью и памятью управляемой кучи?
Опять же, если под "управляемой кучей" вы подразумеваете обычную кучу процессов [стандартной библиотеки], различияявляются существенными.
Все, что совместно используется между процессами, должно быть очищено от абсолютных ссылок на память, поскольку отображение может будет находиться по другому базовому адресу в других процессах.Это означает, что автоматически поддерживаются только строго типы данных POD .Все остальное, как контейнеры, только если используется специальный распределитель, который избегает абсолютных указателей.
Sidenote: если вы думали об «управляемых кучах», таких как концепции JVM или CLR, это другая история.Ссылочные типы в этих виртуальных машинах обычно могут быть прозрачно перемещены на , но их механика значительно отличается (поскольку они служат различным целям: избегая фрагментации и разделения в сборщиках мусора поколений ).
Позволяет ли куча памяти увеличивать размер сегмента памяти в оперативном режиме (когда процессы обращаются к нему)?
К такой куче нельзя получить доступ из более чем одного процесса вообще.
Хотелось бы узнать, можно ли использовать объект карты, существующий в процессе, к которому имеют доступ другие потоки, другому процессу, выполняющему другие потоки?
Для целейпотокобезопасность, вы можете рассматривать процессы, эквивалентные потокам.То же самое касается потоков из других процессов.Вы должны синхронизировать доступ к общим данным - будь то из потока в том же процессе или вне его.
Это может быть достигнуто с атомарными типами данных (https://www.boost.org/doc/libs/1_66_0/doc/html/atomic.html или https://en.cppreference.com/w/cpp/atomic), а также с классическими синхронизирующими примитивами.
Совместное использование этих примитивов между процессами часто можно сделать двумя способами:
- с использованием примитивов буста inteprocess внутри разделяемой памяти
- с помощью справки из ОС в виде именованных примитивов межпроцессной синхронизации
Подробнее см. https://www.boost.org/doc/libs/1_68_0/doc/html/interprocess/synchronization_mechanisms.html.
Обобщение
Вопрос, который вы НЕ задавали, но который, возможно, стоит за вашими мыслями: «Чем управляет менеджер сегментов Boost Interprocess»?
На практике это дает возможность управления общей памятью в виде кучи (с одним из ограничений).: не в состоянии расти в сетиngs или другие контейнеры) внутри вашего сегмента общей памяти.
Если вы посмотрите мои ответы, вы найдете много примеров того, как это сделать:
¹ в основных операционных системах последних десятилетий