c++ 使用具有boost进程间托管共享内存的大分页

py49o6xq  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(211)

我使用https://www.boost.org/doc/libs/1_80_0/doc/html/interprocess/managed_memory_segments.htmlboost::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 标志的文档。任何帮助都将不胜感激!

xqk2d5yq

xqk2d5yq1#

对自定义Map选项的支持只存在于mapped_region
通过使用mapped_region(例如,在shared_memory_objectanonymous_shared_memory之上),您仍然可以鱼与熊掌兼得。然后,您可以在其上挂载一个managed_external_buffer,以便在自定义Map中获得托管段。
也许考虑到您所追求的控制级别,您可以直接使用mapped_region

代码潜水

该提交在git中的生存方式为提交f9c10bd60d8a1ad30ebc7ef86ca5cb9184fbd966:
1.54.0的发行说明中提到

*  Added support for platform-specific flags to mapped_region (ticket #8030)

以下文档位于mapped_region
Map是使用default_map_options创建的。此标志取决于操作系统,除非用户需要指定特殊选项,否则不应更改。
在Windows系统中,map_options是作为dwDesiredAccess传递给MapViewOfFileExDWORD值。如果传递了default_map_options,它将初始化为零。map_optionsFILE_MAP_[COPY|READ|WRITE]进行异或运算。
在UNIX系统和POSIXMap中,map_options是一个int值,作为flags传递给mmap。如果指定了default_map_options,如果该选项存在,它将被初始化为MAP_NOSYNC,否则将被初始化为零。map_optionsMAP_PRIVATEMAP_SHARED异或。
在UNIX系统和XSIMap中,map_options是作为shmflg传递给shmat的int值。如果指定了default_map_options,则将其初始化为零。如果需要,map_options将与SHM_RDONLY进行异或运算。

相关问题