本文来说下内存映射文件 mmap 原理
文章目录
mmap原理分析
假设我们要把一个磁盘文件映射到内存里来,然后把映射到内存中的数据通过socket发送出去。
零拷贝有两种实现方式,一种是mmap技术,另一种使用sendfile技术。
mmap技术,也就是内存映射,可以直接将磁盘文件映射到内核缓冲区。首先还是会发生一次内核态到用户态的切换,这个过程是基于DMA引擎拷贝的,磁盘文件拷贝到内核缓冲区。
接下来,从内核态切换回用户态,此时不会把内核缓冲区的数据拷贝到用户空间。用户缓冲区会跟内核缓冲区建立一个映射,共享一块内存数据,这就不需要从内核缓冲区拷贝到用户缓冲区了。
然后,要把数据通过socket发送出去,需要从用户态切换到内核态,在内核态直接把内核缓冲区的数据拷贝到socket缓冲区里去,然后基于DMA技术把socket缓冲区的数据拷贝到网卡,发送出去。
完成以上步骤之后,就会从内核态切换回用户态。
总结来说,需要4次用户态和内核态之间的切换,3次数据的拷贝,比普通的io操纵少了一次数据拷贝,但切换次数并不减少。
大名鼎鼎的rocketmq就使用了mmap技术,有兴趣的伙伴,可以去看看它的源码实现。
为了方便理解,笔者画了一张图,如下: