简述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遇到的零拷贝,并不是不复制数据 ...
随机推荐
- ubuntu 22.04 网络配置ib网卡配置
第一步:查看Ubuntu版本与内核版本 cat /etc/issue 这说明系统的版本为:Ubuntu 20.04.4 LTS \n \l uname -a Linux gacs-gm-11 5.4. ...
- tp save()的用法
save()方法可以新增数据,也可以修改数据 但是要注意,在第二次save()的时候会默认修改 需 model('Keyword')->isUpdate(false)->save($dat ...
- Java面向对象之类与对象的创建
类与对象的创建 类是一种抽象的数据类型,它是对某一类事物整体描述/定义,但是并不能代表某一个具体的事物. 1.动物.植物.手机.电脑..... 2.Person类.Pet类.Cat类等,这些类都是用来 ...
- textfsm
from concurrent.futures import ThreadPoolExecutor import netmiko import os from threading import Loc ...
- js 加密和解密
// aes对称加密 const CryptoJS = require('crypto-js'); //引用AES源码js const key = CryptoJS.enc.Utf8.parse(&q ...
- WPF 文本逐字一个个出现的动画效果
一.效果图: 二.前台代码: <Grid> <TextBlock Foreground="Transparent" x:Name="text" ...
- containerd容器存储探究
ContainerD 容器目录结构探究 启动容器 作为开始,我们需要去启动一个容器. 你可以通过命令行的方式来启动一个容器,例如: ctr i pull docker.io/library/nginx ...
- VM虚拟机15安装Kali Linux2020版详细教程
下载kali镜像 kali Linux官网地址https://www.kali.org/downloads/下载相对应的电脑版本 打开Vmware虚拟机 安装虚拟机看物理机配置,尽量不要太折腾电脑(虚 ...
- ES6-moudle
一.基础认知 结合案例体验module: 前面模拟模块是用立即执行的匿名函数,需要把某些通过window暴露出去,所以还是不能消除全局变量 module模块系统需要服务器环境才能正常执行,在html文 ...
- shell 每秒调用某个地址的方法
#!/bin/bash step=1 for (( i = 0; i < 60; i=(i+step) )); do curl http://fn.k6akg6f.bar/chat.php sl ...