boost的“ windows_shared_memory”和boost的“ managed_windows_shared_memory”之间有什么区别?

问题描述 投票:1回答:1

Boost提供了几种类型的共享内存。其中windows_shared_memory使用Windows自己的基础共享内存功能,因此是平台特定的,并且与其他共享内存(与POSIX兼容的共享内存)相比具有某些特殊性。

描述为here in the documentation

但是,在this other documentation page中描述了managed_windows_shared_memory。都没有提及对方的存在。

这两个共享内存实现之间有什么区别?

在我看来,根据文档,它们的行为相同。它们只是显示两个不同接口来使用它们的相同机制吗?

包含两个实现的包括:

// The first implementation has to be included here
#include <boost/interprocess/windows_shared_memory.hpp>

// The second implantation has to be included here
#include <boost/interprocess/managed_windows_shared_memory.hpp>
c++ boost shared-memory boost-interprocess
1个回答
0
投票

Boost.Interprocess根据POSIX语义提供了可移植的共享内存抽象。 POSIX是IEEE操作系统指定的一组标准,可以选择实施这些标准,以提供不同(UNIX)操作系统之间的软件兼容性。 Windows具有POSIX subsystem,但仅实现POSIX.1。

共享内存是POSIX 1.b(实时扩展)的一部分,因此Windows不支持POSIX共享内存。因此,Boost.Interprocess必须在Windows上模拟POSIX共享内存,这会导致某些限制:

在那些平台上,共享内存是通过映射文件来模拟的在临时文件中创建的“ boost_interprocess”文件夹中创建目录。在Windows平台中,如果“ Common AppData”键存在于在该目录中创建注册表“ boost_interprocess”文件夹(在XP中通常为“ C:\ Documents and Settings \ All Users \ Application Data”在Vista中为“ C:\ ProgramData”)。对于没有该功能的Windows平台注册表项和Unix系统,在系统中创建共享内存临时文件目录(“ / tmp”或类似文件)。

...

由于此仿真,共享内存在其中某些系统中具有文件系统生存期。

Emulation for systems without shared memory objects

Windows具有自己的本机非POSIX兼容共享内存实现。 Boost还为本地Windows共享内存实现提供了包装。与仿真版本的主要区别在于,它不是直接由文件系统支持的,而是使用由页面文件支持的主内存的,通常不会导致将文件写入磁盘(另请参见:https://stackoverflow.com/a/6215317/79111)。其他区别在文档中列出:

Windows操作系统还提供共享内存,但是使用寿命共享内存的大小与内核或文件系统非常不同一生。共享内存是由页面文件支持的,它是当最后一个进程附加到共享时自动销毁内存被破坏。

...

Windows共享内存的创建与可移植共享有点不同内存创建:在以下情况下必须指定段的大小创建对象,并且不能像这样通过截断来指定共享内存对象。注意最后一步附加到共享内存的销毁了已销毁,因此与本地Windows共享不存在持久性内存。

服务和用户应用程序之间的共享内存也不同。要在服务和用户应用程序之间共享内存,共享内存的名称必须以全局名称空间前缀开头“全球\”。此全局名称空间可在多个客户端上启用进程与服务应用程序进行通信的会话。服务器组件可以在全局名称空间中创建共享内存。然后一个客户会话可以使用“全局”前缀来打开该内存。

Native Windows shared memory

最后,两个实现都提供相同的功能。因此,您选择什么取决于特定用例的需求。要考虑到其他操作系统的可移植性,然后进行POSIX仿真。如果您不希望其他Windows进程直接控制访问共享内存块,请使用本机版本。是性能问题吗?测量并据此进行选择。

© www.soinside.com 2019 - 2024. All rights reserved.