Boost C ++ Interprocess - PullRequest
       60

Boost C ++ Interprocess

0 голосов
/ 03 октября 2018

Я новичок, начиная с библиотеки межпроцессных технологий boost c ++ и механизма ipc.В чем разница между управляемой разделяемой памятью и управляемой кучей памяти?

В управляемой разделяемой памяти, чтобы увеличить размер сегмента, нам нужно вырастить его в автономном режиме с использованием методаgment :: grow ().

Позволяет ли кучная память увеличивать размер сегмента памяти в режиме онлайн (когда процессы обращаются к нему)?

Я хотел бы знать, может ли объект карты, существующий в процессе, доступ к которому осуществляется различными потоками, можетбыть разделенным с другим процессом, выполняющим другие потоки?

Как лучше всего это реализовать?Я не смог получить это из документации межпроцессного повышения.

1 Ответ

0 голосов
/ 03 октября 2018

Ваш вопрос немного широк и сводится к "Я боюсь сделать это неправильно".Итак, позвольте мне кратко остановиться на проблемах.

Позволяет ли куча памяти увеличить размер оперативного сегмента памяти (когда процессы обращаются к нему)?

Если вы имеете в видуобычная куча процессов (что облегчается стандартными библиотеками (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 или другие контейнеры) внутри вашего сегмента общей памяти.

Если вы посмотрите мои ответы, вы найдете много примеров того, как это сделать:


¹ в основных операционных системах последних десятилетий

...