文件映射

首先,映射是一种对应关系。

在文件映射中指的是硬盘上文件位置进程逻辑地址空间中的某处大小相同的区域的对应。

此对应为纯逻辑上的概念,物理上是不存在此对应的。

原因则是进程的逻辑地址空间本身是不存在的。在映射过程中,没有实际的数据拷贝文件没有被加载到内存。只是在逻辑上是被放入了内存中。

既然没有进行实际的数据拷贝,那么进程怎么可以直接通过内存访问文件呢?

系统通过在构建映射时会返回一个指向进程逻辑地址空间中的一个地址的指针。通过这个指针可以直接操作文件而不是再对文件调用 read, wirte 进行读写操作。

但是因为指向的是逻辑地址,如果需要操作数据,需要将逻辑地址转换为物理地址。这个过程与内存映射无关。

因为内存映射没有实际拷贝数据,因此在转换物理地址时会失败。将产生缺页中断(即如果访问的数据页面不在内存中就会停止指令执行),此时响应函数就会在 swap 中查找相对应页面。

如果没有找到,也就是从来没有被读入内存中。则会通过建立的映射关系,从硬盘上读取文件到内存。这个过程与内存映射无关。

用文件映射方法进行文件操作,效率会高。是因为系统调用的方法,如 read ,read 首先会将文件内容从硬盘加载到内核空间的缓冲区,然后再将数据加载到用户空间。实际上进行了两次拷贝。

而虽然 mmap 也是系统调用,但是它没有进行数据拷贝,实际的数据拷贝是在缺页中断处理时进行的。因为它将文件直接映射到用户空间,所以处理函数就根据映射关系直接将文件内容加载到用户空间,只进行了一次拷贝。


文件映射
http://localhost:8080/archives/d03a3467-32f9-4fb3-8f9d-460018ff7d29
作者
inksha
发布于
2024年09月14日
许可协议