众所周知,mmap()最重要的特性是文件映射在多个进程之间共享。但众所周知的是,每个进程都有自己的地址空间。
问题是memory文件(更具体地说,是它的数据)真正保存在哪里,以及进程如何访问这个内存?我的意思不是*(pa+i)和其他高级的东西,而是过程的内部。
发布于 2009-04-20 18:00:33
这发生在操作系统的虚拟内存管理层。当您对文件进行内存映射时,内存管理器基本上将该文件视为进程的交换空间。当您访问虚拟内存地址空间中的页面时,内存映射器必须解释它们并将它们映射到物理内存。当您跨越页面边界时,这可能会导致页面错误,此时操作系统必须将一块磁盘空间映射到一块物理内存,并解析内存映射。使用mmap,它只需从您的文件而不是它自己的交换空间执行此操作。
如果你想知道这是如何发生的,你必须告诉我们你使用的是哪种操作系统,因为实现细节不同。
发布于 2009-04-20 18:03:43
这非常依赖于实现,但以下是一种可能的实现:
当一个文件是第一次内存映射时,数据一开始不会存储在任何地方,它仍然在磁盘上。虚拟内存管理器(VMM)为文件的进程分配一定范围的虚拟内存地址,但这些地址不会立即添加到页表中。
当程序第一次尝试读取或写入这些地址之一时,就会发生page fault。操作系统捕获页面错误,找出该地址对应于内存映射文件,并将适当的磁盘扇区读入内部内核缓冲区。然后,它将内核缓冲区映射到进程的地址空间,并重新启动导致页面错误的user指令。如果出错指令是一个读取指令,那么我们现在都完成了。如果是写入,则将数据写入内存,并将该页标记为脏。对同一页中的数据的后续读取或写入不需要对磁盘进行读/写,因为数据在内存中。
当文件被刷新或关闭时,任何标记为脏的页面都会写回磁盘。
使用内存映射文件对于以非常随意的方式读取或写入磁盘扇区的程序是有利的。您只读取实际使用的磁盘扇区,而不是读取整个文件。
发布于 2009-04-20 18:01:27
我不太确定您在问什么,但是mmap()留出了一块虚拟内存来保存给定的数据量(通常是。它有时可以是文件备份的)。
进程是一个OS实体,它通过OS禁止的方法访问内存映射区域:调用mmap()。
https://stackoverflow.com/questions/769364
复制相似问题