持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情
进程访问文件的传统途径是直接借助于文件系统完成的。打开文件、读写文件的系统调用显式编写在进程代码空间中,系统内核执行系统调用,启动设备驱动程序访问磁盘,读入文件内容提交给进程。只有文件内容从外存读入内存后,进程方可向内存发出访问(读写)操作。
内存映射文件提供了另一种访问文件的途径。内存映射文件借助于虚拟存储器的缺页中断功能将所需文件内容从外存调入内存。通过内存映射文件途径访问文件时,进程在打开文件后,并不直接执行文件读写系统调用,而是执行内存映射功能,为文件分配虚拟存储器,并将文件部分或全部内容装入该虚拟存储器。对于进程来说,文件内容已经到达内存,可以直接访问内存中的文件内容。对于系统来说,物理内存尚未分配,文件内容尚未装入内存。当进程访问文件所属虚拟存储空间时,发生缺页中断,系统为文件分配物理内存,并将文件内容从外存装入内存。由此可见,内存映射文件的I/O操作是由内存访问指令驱动的,一直推迟到针对文件内容的内存操作发生时才物理地执行内存分配和I/O操作。文件I/O操作不是由进程主动发出的,而是由系统自动、隐含执行的。而传统的文件I/O操作是建立在实存基础上的。在访问文件前,其内容必须事先已经装入内存,文件I/O请求必须由进程主动、明确地发出。
使用内存映射文件技术可以减少文件内容递交给用户进程时的中转环节,提高大文件的处理效率。通过文件系统进行文件访问操作时,磁盘和用户进程之间的数据交换需要经过内核缓冲来进行。例如,编辑修改磁盘文件的应用涉及磁盘的读写操作。进程先向内核发出读磁盘文件的系统调用,文件内容由系统从磁盘输入到内核缓冲区中,再从内核缓冲区传输到用户空间中。修改完毕后,数据经由内核缓冲区输出到磁盘文件中。当文件较大时,数据传送操作较为耗时。内存映射文件方法将文件直接映射到用户空间中,缺页中断时,数据直接从磁盘加载到用户空间中,减少数据传输环节,因而提高了文件访问效率。