【问题标题】:How do I measure the size of a boost interprocess vector in shared memory?如何测量共享内存中 boost 进程间向量的大小?
【发布时间】:2014-12-06 00:05:35
【问题描述】:

我正在使用 boost::interprocess::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);
    }
}

【问题讨论】:

    标签: c++ boost shared-memory


    【解决方案1】:
    1. 又快又脏

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

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

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

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

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

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

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

    [2] Bad alloc is thrown

    【讨论】:

    猜你喜欢
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多