共享内存映射文件和共享内存区域是基于彼此实现的吗?

共享内存映射文件和共享内存区域是基于彼此实现的吗?

共享内存映射文件和共享内存区域是基于彼此实现的吗?下面两句话似乎是这么说的,对我来说似乎是一个先有鸡还是先有蛋的问题。

下面操作系统概念介绍共享内存映射文件。多个进程是否通过共享保存文件内容的同一物理内存区域来共享同一个文件?

可以允许多个进程同时映射同一个文件,以允许共享数据。任何进程的写入都会修改虚拟内存中的数据,并且可以被映射文件同一部分的所有其他进程看到。鉴于我们之前对虚拟内存的讨论,应该清楚如何实现内存映射部分的共享: 每个共享进程的虚拟内存映射都指向物理内存的同一页,即保存磁盘块副本的页。这种内存共享如图 9.22 所示。

在此输入图像描述

下面还介绍了共享内存。

  • 多个进程是否通过共享内存映射文件来共享内存区域?

  • “内存映射文件”驻留在磁盘还是主内存上?我认为它在磁盘上,但是“内存映射文件充当通信进程之间的共享内存区域”似乎意味着它驻留在主内存中。

很多时候,共享内存实际上是通过内存映射文件实现的。在这种情况下,进程可以通过让通信进程将同一文件内存映射到其虚拟地址空间来使用共享内存进行通信。内存映射文件充当通信进程之间的共享内存区域(图 9.23)。

在此输入图像描述

谢谢。

答案1

共享内存映射文件和共享内存区域是基于彼此实现的吗?

归根结底,几乎/dev/shm 只是一个虚拟磁盘。

“内存映射文件”驻留在磁盘还是主内存上?

是的!

被访问的文件部分被复制(由交换器)到缓冲区 - 即 RAM。

对该内存的任何写入都将立即在文件中可见,但在缓冲区同步或刷新之前不会写入物理磁盘。

答案2

共享内存可以由常规文件、块设备或交换区支持。这取决于内存区域是如何创建的。

当多个进程使用同一共享内存区域时,它们各自的虚拟地址将指向同一物理地址。一个进程的写入对其他进程直接可见,无需通过内存附加的磁盘文件(如果有)。

如果共享内存后面有文件,内核偶尔会将更改的页面从 RAM 同步到文件。使用内存的进程通常不需要知道这种情况何时发生,但如果有必要,它们可以调用msync以使其更快发生。

如果共享内存后面没有文件,则内核在需要释放一些 RAM 时可能会将页面移动到交换区,就像处理非共享进程内存一样。当它们被换回时,它们会获得一个新的物理地址,该地址立即可供所有映射共享内存的进程使用。

还有一件事让我第一次看到它时感到困惑:如果您使用 映射文件mmap,则如果您想要进行更改并将它们保存回文件,则必须使用MAP_SHARED,即使只涉及一个进程。起初我认为MAP_SHARED这个功能的名称是错误的,但经过进一步思考,您正在与使用read或稍后出现的文件访问该文件的其他进程“共享”您的修改mmap。所以这是有道理的。

相关内容