零拷贝技术:mmap和sendFile

一、传统的IO操作

在这里插入图片描述
通过上面的步骤可以发现传统的 IO 操作执行,有 4 次上下文的切换(用户态—内核态之前的切换)和 4 次拷贝(2次CPU拷贝,2次DMA拷贝),操作繁琐,性能较差。接下来就来看看两种所谓的“零拷贝”技术,mmap和sendFile。

二、mmap

mmap 是一种内存映射技术,将用户空间的虚拟地址和内核空间的虚拟地址指向同一个物理内存地址,这样用户空间和内核空间共享同一个内存数据。
在这里插入图片描述
上图中的虚线方框中就是mmap技术的应用,相比传统的IO操作,减少了一次内核缓冲区—用户缓冲区的拷贝,也就是减少了一次CPU拷贝,但是上下文切换的次数还是没变。
RocketMQ 中就是使用的 mmap 来提升磁盘文件的读写性能!

三、sendFile

从 Linux 2.4+ 内核开始,提供 sendFile 函数,实现了零拷贝。
在这里插入图片描述
上图中,已经没有了用户缓冲区,因为用户缓冲区是在用户空间的,所以没有了用户缓冲区也就意味着不需要上下文切换了,就省略了这一步的从内核态切换为用户态。

同时也不需要基于 CPU 将内核缓冲区的数据拷贝到 Socket 缓冲区了,只需要从内核缓冲区拷贝一些 offset 和 length 到 Socket 缓冲区。

接着从内核态切换到用户态,从内核缓冲区直接把数据拷贝到网络协议引擎里去;同时从 Socket 缓冲区里拷贝一些 offset 和 length 到网络协议引擎里去,但是这个 offset 和 length 的量很少,几乎可以忽略。

sendFile 整个过程只有两次上下文切换和两次 DMA 拷贝,很重要的一点是这里完全不需要 CPU 来进行拷贝了,所以才叫做零拷贝,这里的拷贝指的就是操作系统的层面。
Kafka 和 Tomcat 内部使用就是 sendFile 这种零拷贝。

四、零拷贝中的其他要点

1、DMA

如果我们始终让CPU来进行各种数据传输工作,会特别浪费。一方面,我们的数据传输工作用不到多少CPU核新的“计算”功能。另一方面,CPU的运转速度也比I/O操作要快很多。
所以,我们希望能够给CPU“减负”。
于是,工程师们就在主板上放上了DMAC这样一个协处理器芯片。通过这个芯片,CPU只需要告诉DMAC,我们要传输什么数据,从哪里来,到哪里去,就可以放心离开了。

2、零拷贝的使用场景

如果数据内容不需要用户空间处理,当然可以使用零拷贝技术,减少不必要的拷贝,但是如果数据内容需要在用户空间处理,那么就不能使用零拷贝技术了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值