在 NT系列操作系统(包括NT、2000及以后的所有Windows系统)和正常运行的Win9x系统中,常规的文件操作过程是应用程序(或运行库)调用kernel32中的文件读写函数,再经过ntdll进入内核模式,由内核服务构造I/O请求包发给文件系统驱动程序,再由磁盘驱动程序完成I/O。通常情况下,文件系统驱动程序会对文件数据进行缓冲,当重复读写数据时不必每次都进行磁盘I/O操作,应用程序在打开文件时可以指定是否使用缓冲机制,如果不使用缓冲机制,则直接使用用户缓冲区与磁盘交换数据,但只能整扇区操作。

        文件映射是把一段虚拟地址空间与文件的某一段内容建立映射关系,程序中对这段地址空间进行读写就相当于读写文件,实际的I/O操作由系统自动完成,如果程序所访问的地址未映射到物理内存,则处理器会产生页故障,系统在处理页故障时,如果需要从文件中读取数据,则构造I/O请求包发给磁盘驱动程序。当应用程序要求刷新或关闭映射,或者物理内存资源不足而需要回收时,系统会将内存中的数据写入磁盘。

 

1.普通情况下对没有在系统缓存里的文件的处理:

分配内存 -- ReadFile -- 构造IRP -- 缺页异常 -- 文件系统读取文件 -- 系统缓冲区 -- 复制到用户内存

2.内存映射文件

访问MapViewOfFile的指针 -- 缺页异常 -- 文件系统读取文件 -- 系统缓冲区


基于如上看来,省略了 分配内存+构造IRP+复制内存的时间

如果该内存越大,这省略的时间越可观,这就是为什么在大文件或者非常频繁的文件操作中
内存映射文件性能较高的原因