当前位置: 首页>移动开发>正文

快速了解内存映射文件

一、虚拟内存

1.1 什么是虚拟内存

虚拟内存让每个进程都好像在使用一个连续的、独占的内存空间,实际上这些空间可能是分散存储在物理内存和硬盘上的。

1.2 虚拟内存的实现原理

虚拟内存的实现除了需要操作系统的支持外,还需要硬件的支持。硬件中最关键的部分是内存管理单元(Memory Management Unit, MMU),它负责虚拟地址到物理地址的转换过程。MMU是CPU架构的一部分,它通过使用页表(page tables)来维护虚拟地址和物理地址之间的映射关系

页表存储在物理内存中,每当程序访问一个虚拟地址时,MMU会查找页表以确定相应的物理地址。如果找到了相应的映射,那么访问就会被重定向到正确的物理内存位置。如果没有找到映射(即发生了页面错误),操作系统会介入处理,可能会从硬盘的交换空间中加载所需的页面到物理内存中,并更新页表以反映新的映射。

1.3 用户空间、内核空间

虚拟内存分为用户空间和内核空间。

内核空间是操作系统专用的内存空间,操作系统在这个空间内,管理硬件资源、执行进程调度、内存管理、输入输出操作等任务。每个进程有自己完整的虚拟内存,每个进程的虚拟内存中,用户空间是独立的、互不干扰,内核空间是共享的(系统只有一个)。

举例说明,内核空间是如何共享的:
32位地址空间下,所有进程(无论用户进程还是系统进程)的虚拟内存大小都是4GB,其中地址空间中的0到3GB是用户空间,3GB到4GB是内核空间。所有进程的0到3GB部分在页表中有独立的映射(每个进程有自己的映射),而所有进程的3GB到4GB在页表中共用一个映射,这就是所谓的共享内核空间。

二、页缓存

页缓存,也称磁盘缓存。是对磁盘文件页的内存缓存。操作系统在进行磁盘文件IO时,优先读写页缓存,页缓存未命中才进行真正的磁盘IO。

页缓存属于虚拟内存的一部分,位于虚拟内存中的内核空间。所有进程共享一份页缓存。

三、内存映射文件

内存映射文件(如通过mmap()创建的映射)和普通的文件IO(如read()和write())使用不同的系统调用。

两者都通过页缓存优化硬盘访问。但对于普通的文件IO来说,由于页缓存位于内核空间,数据需要在用户空间和内核空间之间拷贝。这个过程涉及用户态到内核态的切换,以及数据在两个空间之间的物理拷贝。而内存映射文件通过设置页表项,将存储内存映射文件的这部分页缓存直接映射到用户空间,这种直接映射减少了上下文切换和数据拷贝的开销。

所以内存映射文件在处理大文件时可以提供更好的性能。


https://www.xamrdz.com/mobile/4rx1997640.html

相关文章: