加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

磁盘文件通过收集发送阔别传统式实现

发布时间:2021-05-22 04:52:29 所属栏目:教程 来源:互联网
导读:传统方法实现:先读取磁盘、再用 socket 发送,现实也是进过四次 copy buffer=File. read Socket.send(buffer) 这一进程可以类比上边的出产动静: 起首通过体系

传统方法实现:先读取磁盘、再用 socket 发送,现实也是进过四次 copy

buffer = File.read  

Socket.send(buffer) 

这一进程可以类比上边的出产动静:

起首通过体系挪用将文件数据读入到内核态 Buffer(DMA 拷贝)

然后应用措施将内存态 Buffer 数据读入到用户态 Buffer(CPU 拷贝)

接着用户措施通过 Socket 发送数据时将用户态 Buffer 数据拷贝到内核态 Buffer(CPU 拷贝)

最后通过 DMA 拷贝将数据拷贝到 NIC Buffer

Linux 2.4+ 内核通过 sendfile 体系挪用,提供了零拷贝。数据通过 DMA 拷贝到内核态 Buffer 后,直接通过 DMA 拷贝到 NIC Buffer,无需 CPU 拷贝。这也是零拷贝这一说法的来历。除了镌汰数据拷贝外,由于整个读文件 - 收集发送由一个 sendfile 挪用完成,整个进程只有两次上下文切换,因此大大进步了机能。

Kafka 在这里回收的方案是通过 NIO 的 transferTo/transferFrom 挪用操纵体系的 sendfile 实现零拷贝。总共产生 2 次内核数据拷贝、2 次上下文切换和一次体系挪用,消除了 CPU 数据拷贝

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读