Используется ли на моем жестком диске boost :: managed_shared_memory файл? - PullRequest
4 голосов
/ 21 октября 2019

Когда я создаю новый boost::interprocess::managed_shared_memory, я вижу файл, отображаемый в C:\ProgramData\boost_interprocess\1571641094\NAME_OF_SHARED_MEMORY, размер которого, кажется, соответствует размеру созданной совместно используемой памяти.

Мое понимание из документации это то, что есть два широко используемых объекта, используемых для совместного использования памяти между процессами (в пределах managed_shared_memory):

  • basic_managed_shared_memory
  • basic_managed_mapped_file

managed_shared_memory использует реализацию basic_managed_shared_memory. Я предположил, что эта реализация правильная совместно используемая память , а не сопоставленная память файл .

Видя, что он используетфайл озадачивает меня. Обе эти управляемые разделяемые памяти основаны на реализации файла с отображенной памятью?

Является ли единственное решение для расширенной разделяемой памяти в Windows, которое позволяет избежать файлов с отображенной памятью, windows_shared_memory?

Примечание: яв Windows 10 с использованием VC ++ на VS2013.

Пример кода, который может воспроизвести поведение создания файла в ProgramData при использовании managed_shared_memory:

#include <boost/interprocess/managed_shared_memory.hpp>

int main(int argc, char *argv[])
{
  boost::interprocess::permissions permissions;
  permissions.set_unrestricted();

  boost::interprocess::managed_shared_memory* sharedMemory;
  sharedMemory = new boost::interprocess::managed_shared_memory(
  {
    boost::interprocess::open_or_create,
    "NAME_OF_SHARED_MEMORY",
    400000,
    0,
    permissions
  }
  );

  return 0;
}

1 Ответ

4 голосов
/ 21 октября 2019

Ваши предположения верны. Раздел « Эмуляция для систем без объектов общей памяти » в документации Boost объясняет, что происходит:

Boost.Interprocess предоставляет переносную разделяемую память с точки зрения семантики POSIX. Некоторые операционные системы не поддерживают разделяемую память, как определено в POSIX:

  • Операционные системы Windows предоставляют разделяемую память, используя память, поддерживаемую файлом подкачки, но семантика времени жизни отличается от тех, которые определены в POSIX (см. Раздел собственной памяти Windows для получения дополнительной информации).

...

На этих платформах разделяемая память эмулируется сопоставленными файлами, созданными в папке «boost_interprocess», созданной во временнойкаталог файлов. На платформах Windows, если в реестре присутствует ключ «Common AppData», в этом каталоге создается папка «boost_interprocess» (в XP обычно это «C: \ Documents and Settings \ All Users \ Application Data» и в Vista «C: \». Данные программы"). Для платформ Windows без этого ключа реестра и систем Unix разделяемая память создается в системном каталоге временных файлов ("/ tmp" или аналогичном).

Из-за этой эмуляции разделяемая память имеет время жизни файловой системы в некоторых из них. systems.

Как вы уже указали, в качестве альтернативы вы можете использовать собственные ресурсы общей памяти Windows объектов (используя windows_shared_memory). Он будет использовать объект общей памяти, поддерживаемый файлом подкачки, вместо файла, создаваемого в C:\ProgramData. Как правило, при этом не будет использоваться файловая система (см .: https://stackoverflow.com/a/6215317/79111). В случае, если переносимость не является проблемой, это, вероятно, лучший подход, поскольку он обеспечивает взаимодействие с другими приложениями, которые используют разделяемую память, но не полагаются на Boost. Interprocess.

...