繁体   English   中英

在Linux中多个进程使用文件指针读取文件时是否使用共享虚拟内存?

[英]Is shared virtual memory used when multiple processes read a file using file pointer in Linux?

我编写了一个C ++程序,该程序使用文件指针读取文件。 而且我需要同时运行多个进程。 由于文件的大小可能很大(100MB〜),为了减少多个进程的内存使用量,我认为我需要使用共享内存。 (例如,诸如boost::interprocess::shared_memory_object类的IPC库)

但这真的需要吗? 因为我认为如果多个进程读取同一文件,则每个进程的虚拟内存都将通过页面表映射到文件的同一物理内存。

我读了Linux文档,他们说:

共享虚拟内存

尽管虚拟内存允许进程具有单独的(虚拟)地址空间,但是有时您需要进程共享内存。 例如,系统中可能有几个运行bash命令外壳的进程。 与其拥有多个bash副本(而不是每个进程一个虚拟地址空间一个副本),不如在物理内存中仅拥有一个副本,并且所有运行bash的进程都共享它。 动态库是执行几个进程之间共享的代码的另一个常见示例。 共享内存还可以用作进程间通信(IPC)机制,其中两个或多个进程通过所有进程共有的内存交换信息。 Linux支持Unix TM System V共享内存IPC。

另外,维基说,

在计算机软件中,共享内存是

  • 一种进程间通信(IPC)的方法,即在同时运行的程序之间交换数据的方法。 一个进程将在RAM中创建一个区域,其他进程可以访问该区域,或者
  • 一种通过使用虚拟内存映射或在相关程序的明确支持下将访问通常是数据副本的访问定向到单个实例来节省内存空间的方法。 这最常用于共享库和XIP。

因此,我真正好奇的是操作系统级别是否支持共享虚拟内存?

提前致谢。

关于第一个问题-如果您希望数据可以被多个进程访问而不重复,那么您肯定需要某种共享存储。

在C ++中,我肯定会使用boost的shared_memory_object 这是在进程之间共享(大)数据的有效选项,并且它具有带有示例的良好文档( http://www.boost.org/doc/libs/1_55_0/doc/html/interprocess/sharedmemorybetweenprocesses.html )。

使用mmap()是C语言中通常使用的一种更底层的方法。要将其用作IPC,您必须使映射区域共享 http://man7.org/linux/man-pages/man2/mmap.2.html

MAP_SHARED

分享此映射。 映射的更新对于其他映射此文件的进程是可见的,并一直传递到基础文件。 在调用msync(2)或munmap()之前,实际上可能不会更新文件。

在该页面上还有一个将文件映射到共享内存的示例。

无论哪种情况,都至少要记住两件事:

  • 如果存在多个修改共享数据的进程,则需要同步。

  • 您不能使用指针,只能使用从映射区域开始的偏移量。 这是boost文档的解释:

如果多个进程映射相同的文件/共享内存,则每个进程中的映射地址肯定会不同。 由于每个进程可能以不同的方式使用其地址空间(例如,分配或多或少的动态内存),因此无法保证文件/共享内存将被映射到同一地址。

如果两个进程将同一对象映射到不同的地址,这将使指针在该内存中的使用无效,因为指针(这是绝对地址)仅对写入该对象的进程有意义。 解决方案是使用对象之间的偏移量(距离)而不是指针:如果两个对象通过一个进程放置在同一共享内存段中, 则每个对象的地址在另一个进程中将不同,但它们之间的距离(在个字节)将相同。

关于操作系统支持-是的,切碎内存是特定于操作系统的功能。 在Linux中, mmap()实际上是在内核和模块中实现的,可用于在用户空间和内核空间之间传输数据。

Windows也有它的详细信息:

Windows共享内存的创建与可移植共享内存的创建有些不同:创建对象时必须指定段的大小,并且不能像共享内存对象一样通过截断来指定。 请注意,当附加到共享内存的最后一个进程被破坏时,共享内存也将被破坏,因此本机Windows共享内存没有持久性。

您的问题没有道理。

我想我需要使用共享内存。 (例如,IPC库,例如boost::interprocess::shared_memory_object).

如果使用共享内存,则内存是共享的。

我认为,如果多个进程读取同一文件,则每个进程的虚拟内存都将通过页面表映射到文件的同一物理内存。

现在,您正在谈论内存映射的I / O。 这不是同一回事。 但是,在这种情况下,更可能您需要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM