boost iostream mapped file和boost interprocess mapped file有什么区别?

13

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

你们有任何关于如何在共享内存中创建映射文件的想法吗?我正在尝试让多线程程序读取以二进制文件格式编写的大double数组。而iostream和interprocess中的映射文件有什么区别呢?

2个回答

2
据我所知,iostreams将把映射的文件放在共享内存中(这正是你想要的);然而,interprocess将文件放在另一个进程的地址空间中。
除非您有多个进程(而不是线程)将以某种方式相互通信,否则应该使用iostreams。

谢谢你的澄清,Joe。我会尝试使用iostream。 - Yijinsei
2
@Joe D:这与我从进程间库中获得的印象完全不同。具体来说,根据文档:“系统创建一个文件映射来关联文件和进程的地址空间。”对于多个进程,它本质上是带有文件系统备份的共享内存。 - rcollyer
是的,但是进程间库并不创建文件系统备份,它只是将文件映射到进程间共享内存中。然而iostreams会将其映射到单个进程的内存中。这可能(我没有检查实现)更有效率。 - Joe D
我同意你的结论,但我不确定进程间通信的描述是否完全准确。它允许而不是强制将同一文件加载到其他进程中;它还使用“偏移指针”隐藏指针之间的差异,因此如果在一个进程中将文件加载到地址A,在另一个进程中加载到不同的地址B,这两个进程仍然可以干净地访问其中嵌入的数据结构。 - Jonathan Leffler
只有在使用多个进程时才需要这样做。 - Joe D
显示剩余4条评论

0

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

对于单个进程,使用boost::iostream内存映射文件没有太多好处。但是,它可以减少处理文件时的延迟,因为它已经被加载到内存中。但是,只有在不断重写文件的部分时才能获得此优势。对于单个读/写文件的操作,可能不会有任何加速。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接