c++ - 如何测量共享内存中 boost 进程间 vector 的大小?

标签 c++ boost shared-memory

我正在使用 boost::interprocess::vector 在进程之间共享一些字符串,我想确保我不会溢出它所在的共享内存段。

我如何找到 vector 在内存中占用多少空间,以及一个特殊的段分配字符串将占用多少内存?

typedef boost::interprocess::managed_shared_memory::segment_manager SegmentManager;
typedef boost::interprocess::allocator<char, SegmentManager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> ShmString;
typedef boost::interprocess::allocator<ShmString, SegmentManager> StringAllocator;
typedef boost::interprocess::vector<ShmString, StringAllocator> ShmStringVector;

const size_t SEGMENT_SIZE = ...;

addToSharedVector(std::string localString){
    using namespace boost::interprocess;
    managed_shared_memory segment(open_only, kSharedMemorySegmentName);
    ShmStringVector *shmvector = segment.find<ShmStringVector>(kSharedMemoryVectorName).first;

    size_t currentVectorSizeInShm =  ?????(shmvector);            <--------  HALP!
    size_t sizeOfNewStringInSharedMemory =   ?????(localString);  <--------

    //shared mutex not shown for clarity

    if (currentVectorSizeInShm + sizeOfNewStringInSharedMemory < SEGMENT_SIZE)  {
        CharAllocator charAllocator(segment.get_segment_manager());
        ShmString shmString(charAllocator);
        shmFunctionName = localString.c_str();
        shmvector->push_back(shmString);
    }
}

最佳答案

  1. 快速而肮脏

    你可以让共享内存成为一个物理映射的文件,看看有多少页实际已经提交到磁盘。这为您提供了许多实现的粗略指示,因为页面很可能一次提交 1,并且通常的内存页面大小为 4kb。

    我有另一个答案[1],向您展示了此方法的基础知识。

  2. 您可以在段管理器上使用 get_free_memory()。请注意,这并没有说明/只是/为该 vector 分配了什么,但它让您了解(可以说更有用)有多少空间被实际占用。

another answer [2] 我用它来衡量具有连续存储的数据容器与基于节点的容器之间的内存开销差异。

enter image description here

如您所见,单独分配的开销很高,重新分配会很快导致碎片化。所以值得一看

  • 提前预留空间以防止重新分配
  • 使用专门的 Boost Interprocess 分配器更好地利用共享内存区域

[1] 参见 Memory Mapped Files, Managed Mapped File and Offset Pointer

[2] 参见 Bad alloc is thrown

关于c++ - 如何测量共享内存中 boost 进程间 vector 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26305868/

相关文章:

linux - shm_open() 不创建共享内存段 ipcs

c++ - 在堆上和堆栈上传递数组以运行

c++ - 如何将 boost::shared_ptr 引入现有(大型)C++ 代码库?

c - 与 docker 共享内存

c++ - 将 mem_fun 与具有多个参数的函数一起使用

c++ - fatal error LNK1104 : cannot open file 'libboost_log-vc141-mt-gd-1_64.lib'

php - 为什么PHP的sem_acquire会阻塞程序执行?

网格到网格相交的 C++ 库 : what is available?

c++ - VisualStudio *.obj 文件大小(513Mb objs 和 534Mb lib)

c++ - gstreamer audiomixer 命令到代码转换