我使用https://www.boost.org/doc/libs/1_80_0/doc/html/interprocess/managed_memory_segments.html(boost::interprocess::managed_shared_memory)作为向量:
// Vector, SharedData typedefs
mempool_ = segment_.find_or_construct<Vector<SharedData>>((const char *) mempool_name_.c_str())(size_, segment_.get_segment_manager());
在上面的size_ = 32K
中,它的工作情况和预期的一样。当我在几次迭代中分析向量的内存访问时,我观察到向量中连续元素的访问在每4KiB内存访问时都有延迟跳跃!操作系统中的默认页面大小是4KiB。这肯定是由于在下一次内存访问的边界处发生页面错误。
为了避免在延迟敏感的用例中出现这些页面错误,我尝试使用hugepages增加此共享内存段的页面大小。
我发现一个对话在助推谷歌集团这是完全相关的:https://groups.google.com/g/boost-developers-archive/c/bDSd9DOTbp0
有一张票似乎是固定的:https://svn.boost.org/trac10/ticket/8030
但是我似乎找不到关于如何使用 MAP_HUGETLB 标志的文档。任何帮助都将不胜感激!
1条答案
按热度按时间xqk2d5yq1#
对自定义Map选项的支持只存在于
mapped_region
。通过使用
mapped_region
(例如,在shared_memory_object
或anonymous_shared_memory
之上),您仍然可以鱼与熊掌兼得。然后,您可以在其上挂载一个managed_external_buffer
,以便在自定义Map中获得托管段。也许考虑到您所追求的控制级别,您可以直接使用
mapped_region
。代码潜水
该提交在git中的生存方式为提交f9c10bd60d8a1ad30ebc7ef86ca5cb9184fbd966:
1.54.0的发行说明中提到
以下文档位于
mapped_region
:Map是使用
default_map_options
创建的。此标志取决于操作系统,除非用户需要指定特殊选项,否则不应更改。在Windows系统中,
map_options
是作为dwDesiredAccess
传递给MapViewOfFileEx
的DWORD
值。如果传递了default_map_options
,它将初始化为零。map_options
与FILE_MAP_[COPY|READ|WRITE]
进行异或运算。在UNIX系统和POSIXMap中,
map_options
是一个int值,作为flags
传递给mmap
。如果指定了default_map_options
,如果该选项存在,它将被初始化为MAP_NOSYNC
,否则将被初始化为零。map_options
与MAP_PRIVATE
或MAP_SHARED
异或。在UNIX系统和XSIMap中,
map_options
是作为shmflg
传递给shmat
的int值。如果指定了default_map_options
,则将其初始化为零。如果需要,map_options
将与SHM_RDONLY
进行异或运算。