简述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/C++语言)递推、递归、顺序思维
前言 本文中博主将一步一步地.以正常人的顺序思维完成题目--费解的开关,使用的核心方法是递推与递归. 题目 参考题目:费解的开关 详细的题目信息相信大家都已经知道了,因此这里为了简洁只展示输入输出格式 ...
- Docker之Elastic Search&Kibana保姆级别安装
Docker之Elastic Search&Kibana保姆级别安装: 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) ...
- k8s安装gitlab-ce
docker镜像打包 根据官方说明:gitlaby docker镜像中已经不包含邮件代理传输,需要重新打包镜像 FROM gitlab/gitlab-ce RUN apt-get update &am ...
- 记一次 turbostat 的使用
场景:为了测试海光cpu的性能,从而使用turbostat 来监测cpu工作时候的相关频率. cpu 型号: 1.Hygon C86 7165 24-core Processor 1.9GHz 384 ...
- uniapp使用百度地图
要使用第三方百度地图,首先要去百度地图官方申请一个密钥,之后引入百度地图的API文件,参考使用文档即可开发使用.而在uniapp中是没法直接引入百度地图API文件的,我们要结合uniapp中的web- ...
- GUI程序设计——班级信息收集系
import pymysql import wx class MyFrame(wx.Frame): def __init__(self,parent,id): wx.Frame.__init__(se ...
- Oracle查询表中的各列的列名,数据类型,以及类型长度
SELECT table_name, column_name, data_type,data_length FROM all_tab_cols WHERE table_name = UPPER('ba ...
- netmiko批量操作华为设备
from concurrent.futures import ThreadPoolExecutorimport timeimport netmikoimport osfrom threading im ...
- ssr 学习总结
自己构建ssr 前提:了解 koa, koa-router, koa-static, webpack 文件结构 ssr 中的router store 都是 一个工厂函数 在服务器端渲染(SSR) ...
- 【转载】C++标准库容器与C#容器对比
转载自栈他喵的又溢出了 我简单的整理一下,方便观看: C#容器 C++容器 备注 Array C array .net的Array可以是非0起始索引(鸡肋?查了一下,用Array.CreateInst ...