简述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遇到的零拷贝,并不是不复制数据 ...
随机推荐
- 学编程很盲目?不会代码?你可以来瞧瞧这本。是一本难得的Python 入门手册。
Python语言及其应用,pdf高清免费下载地址 获取码:d414 内容简介 · · · · · · 本书介绍Python 语言的基础知识及其在各个领域的具体应用,基于最新版本3.x.书中首先介绍了 ...
- [Unity]射线的简单应用和对UGUI的检测
最近做的小游戏,需要通过触屏来控制移动,主要做法就是在Update中检测Input.TouchCount,但是问题是会盖住UGUI的Button事件,第一时间想到射线检测 常用射线 Unity有射线类 ...
- iOS中的三种定时器
iOS中的三种定时器 NSTimer 一.背景 定时器是iOS开发中经常使用的,但是使用不慎会造成内存泄露,因为NSTimer没有释放,控制器析构函数dealloc也没有调用,造成内存泄露. 二.使用 ...
- mysql主从故障跳过错误
mysql主从故障跳过错误1.从库报错 21,22,23,25无法执行Retrieved_Gtid_Set: 265c6c2a-86ca-11ed-b07a-0242ac120002:1-25Exec ...
- ElasticSearch、ElasticSearch-head的安装和问题解决
前言:elasticsearch作为一个基于Lucene的分布式搜索引擎,其搜索功能的强大之处不用多说,而elasticsearch-head作为一个node项目,能够轻松管理elasticsearc ...
- 集成mupdf实现手写笔签批应用
1. 首先,需要在Android Studio中集成mupdf,使用Android Studio的Gradle构建系统,可以在dependencies中添加如下依赖: implementation ' ...
- C# 查看变量的内存占用和分布
在程序的调试过程中,有时候我们想知道变量在内存中的具体占用状况,这样方便我们调试程序,以便于追踪变量的变化过程 这就需要查看变量的内存占用. 1.如何进入内存查看? 2.如何查看变量? 查看变量,需要 ...
- 传统编码方式转 gRPC 注意事项
# 赋值编码: 1.pbBuilder 设置值时不能为 null 2.pb 定义的类是不可变类,赋值时需要使用 Builder 模式,且每次 builder 都会 new 一个新对象,所以赋值时需要特 ...
- NSA对下一代新技术的评估“网络透视”2010
时间线回到2010年,那时候做渗透测试流行找目标还是通过Google hack,Google dork去寻找目标比如inurl:asp?id= 寻找asp网站可利用的注入点,在厉害点一键爬取域名在配合 ...
- class_schedule
#!/usr/bin/python # -*- coding: UTF-8 -*- class Schedule(object): def __init__(self, name=& ...