一、内存映射文件的由来
1.1 基于缓冲区的 I/O 操作
I/O 的基础是缓冲区,所谓“输入/输出”简单来说就是把数据移进或移出缓冲区。
数据从外部磁盘向运行中的进程的内存区域移动的过程大致如下:
- 进程使用 read()系 统调用,要求其缓冲区被填满。
- 内核随即向磁盘控制硬件发出命令,要求其从磁盘读取数据。
- 磁盘 控制器把数据直接写入内核内存缓冲区,这一步通过 DMA 完成,无需主 CPU 协助。
- 一旦磁盘控 制器把缓冲区装满,内核即把数据从内核空间的临时缓冲区拷贝到进程执行 read( )调用时指定的缓 冲区。
1.2 缓冲区在哪里?
通过上图,可清晰看到内核空间和用户空间的缓冲区其实都是在物理内存中,此处会有疑问为什么要分要分两个空间,要 2 个缓冲区?
这是因为操作系统的设计,要求内核空间和用户空间必须隔离,以保护内核空间。而磁盘和内存之间的数据复制操作的也只能发生在内核空间中,所以会发生 2 次数据拷贝:
- 磁盘中的数据先拷贝到内核空间的物理内存中