【问题标题】:Is there a difference between boost iostream mapped file and boost interprocess mapped file?boost iostream 映射文件和 boost 进程间映射文件之间有区别吗?
【发布时间】:2011-02-01 15:57:13
【问题描述】:

我想在内存中创建一个映射的二进制文件;但是我不确定如何创建要映射到系统的文件。我多次阅读文档并意识到有 2 个映射文件实现,一个在 iostream 中,另一个在进程间。

你们知道如何将映射文件创建到共享内存中吗?我试图让多线程程序读取以二进制文件格式编写的大型双精度数组。另外iostream和interprocess中的映射文件有什么区别?

【问题讨论】:

    标签: c++ boost interprocess boost-interprocess boost-iostreams


    【解决方案1】:

    据我所知,iostreams 会将映射文件放在共享内存中(这是您想要的);然而,interprocess 将文件放在另一个进程的地址空间中。

    您应该使用 iostreams,除非您有多个以某种方式相互通信的进程(不是线程)。

    【讨论】:

    • 感谢 Joe 的澄清,我将尝试 iostream。
    • @Joe D:这根本不是我从进程间库中得到的印象。具体来说,来自文档:“系统创建文件映射以关联文件和进程的地址空间。”对于多个进程,它本质上与文件系统备份共享内存。
    • 是的,但是进程间库不会创建文件系统备份,它只是将文件映射到进程间共享内存中。但是 iostreams 会将其映射到单个进程的内存中。这可能(我还没有检查过实现)更有效。
    • 我同意你的结论——但我不确定进程间的描述是否相当准确。它允许(而不是强制)将相同的文件加载到其他进程中;它还隐藏了指针之间的差异(使用“偏移指针”),因此如果文件在一个进程中加载​​到地址 A 而在另一个进程中加载​​到不同的地址 B,这两个进程仍然可以干净地访问嵌入其中的数据结构。
    • 我的意思是,不是让文件简单地在线程之间共享,而是将它放在共享内存中——这将允许其他进程访问它。我同意你的观点,我说它强制时我犯了一个错误。
    【解决方案2】:

    我看到两者之间的主要区别在于它们的使用方式。在boost-interprocess 中,要使用内存映射文件,您可以使用放置new 在该内存空间中创建对象,并且这些对象会自动以二进制形式保存在您的文件中。然后其他进程可以映射同一个文件并使用这些对象,或者程序本身可以将其用作持久缓存并稍后重新加载它们。 boost-iostreams 中的内存映射文件就像文件流一样,具有作为boost::iostream 的额外好处,并且将为进程间通信提供流语义。

    对于单个进程,使用boost::iostream 内存映射文件并没有太多好处。但是,它可以减少处理文件的延迟,因为它已经被加载到内存中。但是,只有在不断地重写文件的某些部分时,您才能获得这种好处。对于文件的单次读/写传递,可能没有任何加速。

    【讨论】:

      猜你喜欢
      • 2018-07-14
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多