【问题标题】:Boost c++ InterprocessBoost C++ 进程间
【发布时间】:2019-03-08 19:50:49
【问题描述】:

我是一个初学者,从 boost c++ 进程间库和 ipc 机制开始。托管共享内存和托管堆内存有什么区别?

在托管共享内存中,为了增加段的大小,我们需要使用 segment::grow() 方法离线增长它。

堆内存是否允许在线增加内存段的大小(当进程正在访问它时)?

我想知道存在于不同线程访问的进程中的映射对象是否可以共享给执行不同线程的其他进程?

实现这一点的最佳技术是什么?我无法从 boost 进程间文档中得到这个。

【问题讨论】:

    标签: c++ multithreading boost shared-memory interprocess


    【解决方案1】:

    您的问题有点宽泛,归结为“我害怕做错”。所以请允许我简要地解决这些问题。

    堆内存是否允许在线增加内存段的大小(当进程正在访问它时)?

    如果您指的是常规进程堆(由 (C) 标准库提供支持),那么,是的。在过去的 20 到 30 年中,我认为您不需要明确说明堆的大小(更不用说增长了)。

    是的,操作系统会透明地增长进程堆¹。

    托管共享内存和托管堆内存有什么区别?

    同样,如果您所说的“托管堆”是指常规 [标准库] 进程堆,则差异很大。

    任何跨进程共享的东西都必须清除绝对内存引用,因为映射可能将在其他进程中位于不同的基地址。这意味着仅自动支持严格的POD data types。所有其他的,就像容器一样,只有在使用避免绝对指针的特殊用途分配器时。

    旁注:如果您正在考虑像 JVM 或 CLR 概念这样的“托管堆”,那就另当别论了。这些 VM 中的引用类型通常可以透明地移动,但其机制有很大不同(因为它们服务于不同的目标:避免generational garbage collectors 中的碎片和分区)。

    堆内存是否允许在线增加内存段的大小(当进程正在访问它时)?

    根本无法从多个进程访问这种堆。

    我想知道存在于不同线程访问的进程中的map对象是否可以共享给执行不同线程的其他进程?

    出于线程安全的目的,您可以将进程视为等同于线程。来自其他进程的线程也是如此。您必须同步对共享数据的访问 - 无论是来自同一进程内的线程,还是来自进程外的线程。

    这可以通过原子数据类型(https://www.boost.org/doc/libs/1_66_0/doc/html/atomic.htmlhttps://en.cppreference.com/w/cpp/atomic)以及经典同步原语来实现。

    跨进程共享这些原语通常可以通过两种方式完成:

    • 在共享内存中使用 Boost 的进程间原语
    • 使用操作系统的帮助,以命名的进程间同步原语的形式

    详情请见https://www.boost.org/doc/libs/1_68_0/doc/html/interprocess/synchronization_mechanisms.html

    总结

    您没有问但可能在您的想法背后的问题是“Boost Interprocess 段经理管理什么”?

    在实践中,它确实提供了类似堆的共享内存管理(有一个限制:无法在线增长)。然后使用它来促进 Boost Interprocess allocator,您可以使用它在共享内存段中存储非 POD 数据类型(如字符串或其他容器)。

    如果您查看我的回答,您会发现很多如何做到这一点的示例:


    ¹在过去几十年的主流操作系统上

    【讨论】:

    • 感谢您回答我的问题。我特别想了解托管堆内存和托管共享内存。根据我在 boost 进程间托管共享内存中所指出的,可以在具有内核级持久性的进程之间共享。而托管堆内存我很困惑是否可以在进程之间共享或者它只存在于特定进程中?基本上我想知道 boost 中提到的 4 个托管段之间的区别。进程间文档。以及可以应用它们的用例?
    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多