了解内存映射文件

时间:2013-09-11 20:49:14

标签: io operating-system mmap virtual-memory dma

我已经开始阅读有关内存映射IO的内容,并且我在掌握概念方面遇到了一些困难

这是我到目前为止所理解的:

  

每个进程都有一个虚拟地址空间。内存映射文件分配了一个          虚拟地址空间中的特定地址范围,映射到相同的地址          物理记忆。这样,所有由磁盘控制器完成的写入          内存(通过DMA)将反映到进程中,无需任何额外的操作          复制。 (在非内存映射文件的情况下,CPU必须复制内容          到过程的缓冲区)。

我的怀疑:

  • 我的理解是否正确?

  • 如果有多个进程尝试mmap a会发生什么    文件并没有可用于直接映射的连续内存块?

1 个答案:

答案 0 :(得分:6)

内存子系统本身对“文件”没有任何理解,这是一个操作系统概念,并且some operating systems根本没有使用文件。你对mmap如何运作的理解很接近但有些偏差。

每个进程都有自己的虚拟地址空间,这可能与物理内存几乎没有关系(许多虚拟地址空间根本没有任何内存关联,并且交换出来的虚拟内存也没有'有任何物理记忆)。系统使用某种查找表(在x86上称为descriptor tables),指定哪些虚拟地址范围映射到哪些物理地址范围。非“常驻”(换出,mmap但未加载)的虚拟内存具有“不存在”条目。

每当程序试图访问此内存时,CPU都会导致页面错误,该错误会告诉操作系统在某处找到适当的内容并将其加载到物理内存中。在交换的情况下,内容从交换文件或分区加载;在mmap的情况下,它们被加载到文件系统的某个地方。

将它们放入物理内存并更新描述符表的机制可能会有所不同。您所描述的是DMA,它允许驱动器控制器将内容直接复制到物理内存块和零拷贝I / O,这是一种技术,操作系统只是创建一个新的描述符映射,告诉处理器“传送” “物理内存区域进入程序的地址空间。 mmap技术上都不需要(操作系统可以“手动”加载文件并将其复制到程序的新缓冲区中,这可能发生在读取 - 复制 - 更新情况中),但现代系统会这样做就像你描述的那样。

物理内存不一定必须是连续的。当调用POSIX版本的mmap时,操作系统会为映射分配length个字节,但是由于虚拟内存,这些字节可以在多个块之间拆分并由处理器一起映射。

如果多个进程尝试mmap同一个文件,则OS行为取决于访问是只读还是读/写;只读副本可以在许多进程之间共享(例如实际的可执行代码;这就是为什么即使Chrome可能有几十个进程在运行,Chrome二进制文件只在内存中运行一次)。