当我们将文件映射到内存时,需要进行系统调用。后续对该文件的访问是否需要系统调用,或者进程的虚拟内存页面是否映射到内存中的实际页面缓存?

更新:我还想知道的是,如果多个进程通过 mmap 访问同一个文件。他们将访问相同的物理内存部分写入。

有帮助吗?

解决方案

无需额外的系统调用 (由工艺)后,您只需访问它像普通的记忆。当你用文件来完成,只需拨打munmap

  

返回值

     

在成功,mmap()   返回一个指向映射区域。   错误时,值MAP_FAILED(即   是,(无效*)-1)被返回,   错误号被适当地设定。上   成功,munmap()返回0,上   失败-1,errno设置(可能   到EINVAL)。

这里查看手册页详细信息

修改对于澄清:

我说,函数的文件到调用进程的内存空间映射,并返回一个指向内存块的开始。

例如,如果有两个不同的过程映射与MAP_SHARED标志相同的文件,则每个进程将访问相同的物理存储器,但存储器可在每个进程的虚拟内存空间中的不同位置被映射,即通过在每个进程的虚拟内存空间MMAP返回指针可以不相等。

这带来了点,如果例如需要存储的共享存储器块内的指针这些指针只会是有用的,如果它们被存储为相对于所述块/文件的开头的偏移量和他们将只能够有益地指向内部的块/文件位置。

其他提示

当您映射文件时,Linux 在 MMU(内存管理单元)中创建条目。MMU 监视 CPU 对真实 RAM 的所有读写操作。这样,它就知道您何时访问内存的哪些部分 mmap() 回。读取尚未在真实 RAM 中的部分将导致页面错误。MMU 将捕获它们并调用内核例程将文件的正确部分加载到 RAM 中的某个位置,然后它将更新 MMU 表中的条目,以便数据现在位于以下地址: mmap() 给你。事实上,它会在其他地方,但 MMU 会让它完全透明。

当你写入内存时,MMU会将修改的页面标记为“脏”。当它们被刷新时(因为您访问了更多文件或因为您调用 munmap()),然后更改将被写入磁盘。

因此,每次发生页面错误和脏页刷新时,都会发生系统调用。但由于页面大小为 4 或 8KB,因此这种情况很少发生。而且,内核一次会加载多个页面,因此系统调用的次数再次减少。最后,使用相同的代码来实现交换,因此非常优化。

所有这些效果使得 mmap 如此高效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top