简述Linux零拷贝原理
什么是零拷贝
零拷贝描述的是在计算机操作系统中,CPU不执行将数据从一个内存区域,拷贝到另一个内存区域的任务。
通过网络传输文件时,零拷贝通常可以节省CPU周期和内存带宽。
零拷贝的好处
- 节省了CPU周期,空出的周期可以完成其它任务。
- 减少内存区域间的数据拷贝,节省内存带宽。
- 减少用户态和内核态之间的数据拷贝,提升数据传输效率。
- 减少用户态和内核态之间的上下文切换。
零拷贝原理
传统IO中,用户态和内核态空间之间的复制是完全没有必要的,因为用户态空间仅仅起到一种数据转存媒介的作用,除此之外没有做任何事情。
传统I/O
通过传统socket和I/O流传输文件时,需要先把文件从磁盘加载到内核空间,再从内核空间加载到用户空间。在用户空间可以对文件做一些操作,然后再传给内核空间,最终由内核空间把文件发送到协议栈,再回到用户空间继续执行。4次上下文切换,4次I/O。

Linux提供sendfile()减少数据拷贝和上下文切换次数
Linux2.1版本的sendfile()函数

- 发起sendfile()系统调用,操作系统由用户态空间切换到内核态空间(第一次上下文切换)
- 通过DMA引擎将数据从磁盘拷贝到内核态空间的输入socket缓冲区中(第一次拷贝)
- 将数据从内核空间拷贝到与之关联的socket缓冲区(第二次拷贝)
- 将socket缓冲区的数据拷贝到协议引擎中(第三次拷贝)
- sendfile()系统调用结束,操作系统由内核态空间切换到用户态空间(第二次上下文切换)
根据以上过程,一共产生了2次上下文切换和3次I/O拷贝。减少了从用户空间到内核空间以及相反的2次拷贝,从操作系统的角度来看,这就是零拷贝。
内核空间出现复制的原因:通常硬件在通过DMA访问时期望的是连续的内存空间。

Linux2.4版本sendfile()函数
Linux2.4对sendfile()做了一些优化,将文件从内核缓冲区拷贝到socket缓冲区的操作(上述步骤3)被优化为只传输少量标志位信息到socket缓冲区。这样来文件可以直接从内核空间拷贝到协议栈。2次上下文,2次拷贝。

mmap零拷贝原理
mmap通过内存映射,将内核缓冲区的文件映射到用户空间,使用户空间可以共享内核空间 的映射文件,这样来省去了将内核空间的文件拷贝到用户空间的步骤。文件被加载到内核空间后,做一次内存映射,之后直接拷贝到socket缓冲区,再发送给协议栈。4次上下文切换,3次拷贝。但这不是真正意义上的零拷贝,因为还存在一次CPU拷贝。

总结
- 零拷贝是从操作系统的角度来理解的,所以只有不存在CPU拷贝(内核空间拷贝到内核空间)才能称为零拷贝。
- 零拷贝是网络编程的关键。
- mmap适合少量数据读写,sendfile适合大文件传输。
- sendfile可以以DMA的方式实现零拷贝,而mmap不能。
简述Linux零拷贝原理的更多相关文章
- Linux零拷贝原理
Linux零拷贝原理 前言 磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝.直接 I/O.异步 I/O 等等,这些优化的目的就是为了提 ...
- 【面试普通人VS高手】Kafka的零拷贝原理?
最近一个学员去滴滴面试,在第二面的时候遇到了这个问题: "请你简单说一下Kafka的零拷贝原理" 然后那个学员努力在大脑里检索了很久,没有回答上来. 那么今天,我们基于这个问题来看 ...
- Netty 零拷贝(一)Linux 零拷贝
Netty 零拷贝(一)Linux 零拷贝 本文探讨 Linux 中主要的几种零拷贝技术以及零拷贝技术适用的场景. 一.几个重要的概念 1.1 用户空间与内核空间 操作系统的核心是内核,独立于普通的应 ...
- Linux零拷贝技术 直接 io
Linux零拷贝技术 .https://kknews.cc/code/2yeazxe.html https://zhuanlan.zhihu.com/p/76640160 https://clou ...
- NIO学习笔记,从Linux IO演化模型到Netty—— Linux零拷贝
这里只是感性地认识Linux零拷贝,不涉及具体细节. 1.Linux传统的数据拷贝 用户进程是不能直接访问文件系统的,要先切换到内核态,发起系统调用,DMA把磁盘中的数据写入内核空间,内核再把数据拷贝 ...
- Linux零拷贝技术
本文转载自Linux零拷贝技术 导语 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较 ...
- Linux零拷贝技术,看完这篇文章就懂了
本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 本文讲解 ...
- Linux 零拷贝技术
简介 零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道.实现高速服务器和路由器的关键技术之一. ...
- Linux "零拷贝" sendfile函数中文说明及实际操作分析
Sendfile函数说明 #include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfile ...
- 框架篇:Linux零拷贝机制和FileChannel
前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...
随机推荐
- 【C学习笔记】day5-1 完成猜数字游戏
#include <stdio.h> #include <stdlib.h> int main() { int s = 0; srand((unsigned)time(NULL ...
- codeforce A. Many Equal Substrings
http://codeforces.com/contest/1029/problem/A 嗳,简单的题做起来是真的舒服qwq 1 public static void main(String[] ar ...
- CLIP 读书笔记
论文:Learning Transferable Visual Models From Natural Language Supervision CLIP: Contrastive Language- ...
- python 日志分割器 大文本处理
import math i=0 filename='' write='' Rline = '' def writeFile(fileName,line): global filename global ...
- input 模糊搜索下拉框
html <input type="text" class="layui-input blockInput" id="taskExpressio ...
- Minio客户端工具mc
简介:mc(Minio Client)是Minio提供访问和操作服务端的客户端工具,有Windows和Linux两个平台版本. 一.安装(基于Linux) 1. mc下载:wget https://d ...
- myJRebel 已不可用
周末在家里撸代码,突然 IDEA 提示 JRebel 需要激活. 原来一直使用的 myJRebel 的激活码,天真的以为是我的网络问题,尝试重新激活,结果不管用,就想去 myJrebel 的网站上去看 ...
- PLC数据块中的偏移量
PLC数据块中的偏移量是什么? 偏移量定义为:把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为"有效地址或偏移量". 段地址左移四位,与有效地址相加,就构成了逻 ...
- JS中两个数组对象筛选
const arr1 = [ {id: 1, name: 'aaa'}, {id: 2, name: 'bbb'}, {id: 3, name: 'ccc'}, {id: 4, name: 'ddd' ...
- 090_Java
在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. ● 1. 尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载 ...