内存映射文件mmap原理分析

本文来说下内存映射文件 mmap 原理

文章目录


mmap原理分析

假设我们要把一个磁盘文件映射到内存里来,然后把映射到内存中的数据通过socket发送出去。

零拷贝有两种实现方式,一种是mmap技术,另一种使用sendfile技术。

mmap技术,也就是内存映射,可以直接将磁盘文件映射到内核缓冲区。首先还是会发生一次内核态到用户态的切换,这个过程是基于DMA引擎拷贝的,磁盘文件拷贝到内核缓冲区。

接下来,从内核态切换回用户态,此时不会把内核缓冲区的数据拷贝到用户空间。用户缓冲区会跟内核缓冲区建立一个映射,共享一块内存数据,这就不需要从内核缓冲区拷贝到用户缓冲区了。

然后,要把数据通过socket发送出去,需要从用户态切换到内核态,在内核态直接把内核缓冲区的数据拷贝到socket缓冲区里去,然后基于DMA技术把socket缓冲区的数据拷贝到网卡,发送出去。

完成以上步骤之后,就会从内核态切换回用户态。

总结来说,需要4次用户态和内核态之间的切换,3次数据的拷贝,比普通的io操纵少了一次数据拷贝,但切换次数并不减少。

大名鼎鼎的rocketmq就使用了mmap技术,有兴趣的伙伴,可以去看看它的源码实现。

为了方便理解,笔者画了一张图,如下:

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值