传统io&mmap&直接io&sendfile零拷贝 对比

传统io

步骤:硬盘(dma)》内核缓冲(cpu)》用户缓冲(cpu)》socket缓冲(dma)》协议层

1、四次上下文切换。

2、四次copy

 

Mmap(内存映射):

步骤:硬盘(dma)》内核缓冲(share用户缓冲)(cpu)》socket缓冲(dma)》协议层

优点

  1. 较缓存io,因为系统内核缓存和用户缓存共享,通过mmap访问硬盘数据减少了一次系统缓存至应用缓存之间的copy,提升了性能。
  2. 实现用户区域与系统内核之间的高效交互。
  3. 提供进程间共享内存间的相互通信方式。(如k8s的共享内存就要到这种方式)
  4. 可用于实现高效的大规模数据传输。(因为mmap的内存可大于物理内存,采取淘汰算法,将需要淘汰的内存页换成新的内存页)

缺点

  1. 文件很小,小于4096,因为mmap是页为单位,因此连续小文件会浪费内存。
  2. 对变长文件不适合,文件无法扩展;mmap到内存,所能操作的访问就确认了。
  3. 更新文件操作很多的情况不适合,因为会产生大量脏页回写,引发随机io。

 

 

直接io

步骤:硬盘(dma?)》用户内存》协议层。

少了内核缓存这步骤,直接操作硬盘。

优点

不用经过内核缓冲,节省了内存,某种场景下算是加快了速度,nginx支持直接io;

数据库采用这种方式就很好,实时修改文件,及时响应修改。

缺点

没有内核缓冲,意味着每次访问文件都从硬盘访问,多线程同时访问同一文件的时候性能会比较差。

一般跟aio异步线程一起使用

 

 

 

sendFile (零拷贝)

 

步骤:

2.1内核:硬盘(dma)》内核缓冲(cpu)》socket缓存(dma)》协议层。(不经过用户层)

2.4内核以上:硬盘(dma)》内核缓冲(cpu)》des描述文件进入socket缓冲(dma)》协议层。(不经过用户层,文件不经过socket缓冲,只是描述文件进入socket缓冲)

2.1三次上下文切换,三次copy

2.4三次上下文切换,两次copy,文件直接内核缓存传输到协议层。

 

 

优点

1、节省内存空间,只在内核缓冲存储了一份数据,减少内存拷贝(2-3次),上线文切换(3次)

2、充分利用了dma,减少cpu的负担。

 

缺点

1、数据不经过用户系统,都是在操作系统内核中传输,用户系统编写的对传输内容操作不了?

2、貌似传输文件大于2g会出问题。

暂未发现太多。。

kafka、nginx都支持零拷贝;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyongq04

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值