【问题标题】:Pre-allocate memory and use in forked processes.预分配内存并在分叉进程中使用。
【发布时间】:2012-03-08 12:46:30
【问题描述】:

我想在派生进程之前在程序中预先分配足够多的内存,然后在派生进程中进一步分配/使用该池中的内存。我遇到过一些内存分配器,例如 Bget、Boost 等,但无法理解如何使用它们。

有没有最简单的,我可以像这样使用

poolhandle = poolallocate(pool_size)

然后在分叉的过程中使用类似的东西

ptr = allocatefromPool(poolhandle,no_of_bytes)

然后如果我通过某个 IPC 将此指针传递给另一个进程,即使在该进程中也应该可以访问它。

你能指出我正确的方向吗?如果 Boost 是要走的路,你能给我一个如何使用它的例子吗?

【问题讨论】:

    标签: boost memory-management pool


    【解决方案1】:

    老实说,最简单的方法是使用内存映射文件。然后你就可以通过寻找和写作来保存东西,或者寻找和阅读来获取东西。

    除此之外,始终存在演员的概念,您根本不共享任何内存,只需在演员之间发送消息,每个演员都是自己数据存储的管理者。这更易于编程,尤其是使用 ZeroMQ 之类的工具使进程间和线程间消息传递变得如此简单。

    如果你把这两个想法结合起来,那么每个actor进程都有一个他们拥有的内存映射文件的区域,你来回传递消息来告诉他们要读什么或写什么。

    有关内存映射文件作为共享内存Posix shared memory vs mapped files的更多信息,请参阅此问题

    这是一个关于 IPC,您需要多个进程来协调操作 IPC vs domain sock vs named pipes

    如果您有大量数据要在消息中移动,那么您可能希望将数据保留在内存映射文件中并实现某种形式的无锁共享。您可以使用关键字 lock-free 与“共享内存”或“数据结构”结合使用 Google 搜索很多内容。

    【讨论】:

    • 嗨迈克尔,感谢您提供这些意见。内存映射文件是我知道的一个选项,但我的任务要求使用现成的简单分配器或自己编写一个......基本上是某种堆/内存管理器。我宁愿先探索可用的选项,看看它是否符合要求。内存映射文件,即我听说过的 mmap 可能会很慢,因为它涉及到几个系统调用?(对不起,我使用过它,但尚未验证)
    • 是否有任何流行且简单的堆管理器/内存分配器/池可供我使用?另外 boost 实际上并没有预先分配内存,是吗?基本上我想预先分配一大块内存,然后从中分配我的结构、数组、整数、字符等数据结构。此外,当我将指向这些的指针传递给另一个(分叉的)进程时,该进程应该能够访问该内存。
    猜你喜欢
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2014-07-17
    • 2012-03-10
    相关资源
    最近更新 更多