我开始阅读有关内存映射IO的内容,但是我对其中的概念有些困难。
到目前为止,这就是我所理解的:
每个进程都有一个虚拟地址空间。内存映射文件在虚拟地址空间中分配了一段特定的地址范围,该范围映射到物理内存上的相同地址。这样,所有由磁盘控制器通过DMA写入内存的内容都将反映到进程中,而无需进行额外的复制。(在非内存映射文件的情况下,CPU将不得不将内容复制到进程的缓冲区中)。
我的疑问:
我的理解正确吗?
如果有多个进程尝试映射文件并且没有连续的内存块可用于直接映射会发生什么情况?
我开始阅读有关内存映射IO的内容,但是我对其中的概念有些困难。
到目前为止,这就是我所理解的:
每个进程都有一个虚拟地址空间。内存映射文件在虚拟地址空间中分配了一段特定的地址范围,该范围映射到物理内存上的相同地址。这样,所有由磁盘控制器通过DMA写入内存的内容都将反映到进程中,而无需进行额外的复制。(在非内存映射文件的情况下,CPU将不得不将内容复制到进程的缓冲区中)。
我的疑问:
我的理解正确吗?
如果有多个进程尝试映射文件并且没有连续的内存块可用于直接映射会发生什么情况?
mmap
的工作原理的理解接近但还有一点偏差。mmap
但未加载)的虚拟内存具有“不存在”的条目。mmap
的情况下,它们从文件系统中的某个位置加载。mmap
所必需的(操作系统可以手动加载文件并将其复制到程序的新缓冲区中,在读-复制-更新情况下可能会发生这种情况),但现代系统会像您描述的那样执行。mmap
时,操作系统为映射分配length
字节,但由于虚拟内存,这些字节可能被分成多个块,并由处理器一起映射。mmap
相同的文件,则操作系统行为取决于访问是只读还是读/写;只读副本可以在许多进程之间共享(例如实际的可执行代码;这就是为什么即使Chrome可能有数十个进程运行,Chrome二进制文件也只存在于内存中一次的原因)。