众所周知,最重要的mmap()特性是文件映射在许多进程之间共享.但众所周知,每个进程都有自己的地址空间.
问题是memmapped文件(更具体地说,它的数据)真正保存在哪里,以及进程如何访问这个内存?我的意思不是*(pa + i)和其他高级的东西,但我的意思是这个过程的内部.
这发生在操作系统中的虚拟内存管理层.当您对内存映射文件时,内存管理器基本上将该文件视为该进程的交换空间.当您访问虚拟内存地址空间中的页面时,内存映射器必须解释它们并将它们映射到物理内存.当您跨越页面边界时,这可能会导致页面错误,此时操作系统必须将一大块磁盘空间映射到一块物理内存并解析内存映射.使用mmap,它只是从您的文件而不是自己的交换空间这样做.
如果您想了解有关这种情况的详细信息,则必须告诉我们您正在使用哪种操作系统,因为实施细节会有所不同.
这非常依赖于实现,但以下是一种可能的实现:
当文件是第一个内存映射时,数据一开始不会存储在任何地方,它仍然在磁盘上。虚拟内存管理器 (VMM) 为文件的进程分配一系列虚拟内存地址,但这些地址不会立即添加到页表中。
当程序第一次尝试读取或写入这些地址之一时,就会发生页面错误。操作系统捕获页面错误,确定该地址对应于内存映射文件,并将适当的磁盘扇区读取到内部内核缓冲区中。然后,它将内核缓冲区映射到进程的地址空间,并重新启动导致页面错误的用户指令。如果错误指令是读取,我们现在就完成了。如果是写,则将数据写入内存,并将该页标记为脏页。对同一页内数据的后续读取或写入不需要从磁盘读取/写入/写入磁盘,因为数据在内存中。
当文件被刷新或关闭时,任何被标记为脏的页面都会被写回磁盘。
对于以非常随意的方式读取或写入磁盘扇区的程序,使用内存映射文件是有利的。您只读取实际使用的磁盘扇区,而不是读取整个文件。
| 归档时间: |
|
| 查看次数: |
3015 次 |
| 最近记录: |