目录

Linux I/O 缓存背景

当请求文件服务器的下载功能时,服务端程序所做的事情是:将服务器磁盘中的文件不做修改地从已连接的 Socket 发送到客户端,通常使用下面的代码完成:

while ((n = read(diskfd, buf, BUF_SIZE)) > 0)
write(sockfd, buf , n);

该程序的基本操作就是循环的从磁盘读入文件内容到缓冲区,再将缓冲区的内容发送到 Socket。Linux I/O 操作默认是缓冲 I/O,主要使用了 read()write() 这两个系统调用。当应用程序访问某块数据时,操作系统首先会检查最近是否访问过此系统,文件内容是否缓存在了内核缓冲区。如果是,操作系统则直接根据 read() 传入的 buf 地址,将内核缓冲区中的内容拷贝到 buf 地址所指向的用户空间缓冲区中;如果不是,操作系统则首先将磁盘上的数据拷贝的内核缓冲区,这一步主要依靠 DMA(直接存储器存取)来传输,继而再把内核缓冲区上的内容拷贝到用户空间缓冲区。接下来,write() 再把用户缓冲区的内容拷贝到网络堆栈相关的内核缓冲区中,最后 Socket 再把内核缓冲区的内容发送到网卡上。

可见,上述简单的 I/O 操作,实际上发生了多次的数据拷贝。与此同时,在用户态、内核态运行模式的切换也会产生多次 CPU 上下文切换,无疑也加重了 CPU 的性能损耗。



问题的关键在于,在文件下载的过程中,我们并不需要对文件的内容做任何修改,那么这种缓存式的 I/O 操作就显得非常的无谓了。零拷贝技术主要就是为了解决这种低效性。

零拷贝技术(Zero-Copy)

零拷贝是一种数据传输的优化思想,主要任务是避免进行不必要的数据拷贝动作。主要的优化思路有两类:

  • 针对特定应用场景,去除完成不必要的拷贝。
  • 优化拷贝过程,例如:让别的组件来承接这一类简单的数据传输任务,继而释放 CPU,让系统资源的利用更加有效。

参考文章

https://mp.weixin.qq.com/s/3H26Yqa8pp5g3BYEGgaAXw

https://mp.weixin.qq.com/s/GtNrVAvqsnzYSoGiqoI-0A

Linux 的零拷贝技术的更多相关文章

  1. Linux零拷贝技术,看完这篇文章就懂了

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复 「1024」 即可领取,欢迎大家关注,二维码文末可以扫. 本文讲解 ...

  2. [转帖]Linux 中的零拷贝技术,第 2 部分

    Linux 中的零拷贝技术,第 2 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy2/index.html   Linux 中 ...

  3. [转帖]Linux 中的零拷贝技术,第 1 部分

    Linux 中的零拷贝技术,第 1 部分 https://www.ibm.com/developerworks/cn/linux/l-cn-zerocopy1/index.html   引言 传统的 ...

  4. Linux零拷贝技术

    本文转载自Linux零拷贝技术 导语 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较 ...

  5. Linux 中的零拷贝技术,第 2 部分

    技术实现 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.第一部分主要介绍了一些零拷贝技术的相关背景知识,简要概 ...

  6. Linux 中的零拷贝技术,第 1 部分

    概述 本系列由两篇文章组成,介绍了当前用于 Linux 操作系统上的几种零拷贝技术,简单描述了各种零拷贝技术的实现,以及它们的特点和适用场景.本文是本系列文章的第一部分,主要是介绍一些零拷贝技术的相关 ...

  7. Linux 零拷贝技术

    简介 零拷贝(zero-copy)技术可以减少数据拷贝和共享总线操作的次数,消除通信数据在存储器之间不必要的中间拷贝过程,有效地提高通信效率,是设计高速接口通道.实现高速服务器和路由器的关键技术之一. ...

  8. Linux中的零拷贝技术

    转载:https://www.jianshu.com/p/fad3339e3448 引文## 在写一个服务端程序时(Web Server或者文件服务器),文件下载是一个基本功能.这时候服务端的任务是: ...

  9. Linux零拷贝技术 直接 io

    Linux零拷贝技术 .https://kknews.cc/code/2yeazxe.html   https://zhuanlan.zhihu.com/p/76640160 https://clou ...

随机推荐

  1. Matlab---绘图中坐标系显示设置

    Matlab绘图---坐标系显示设置 [@wp20180507-20180511(week 5)] 目录: 一.设置坐标范围 二.修改坐标轴显示的刻度.密度.lable文字.位置等 三.Matlab绘 ...

  2. Matlab---绘制柱状图

    Matlab---绘制柱状图 目录: hist()函数 histc( )函数 bar()函数 正文: 注意区分:频率.频数分布直方图. 一.             hist()函数 hist():实 ...

  3. CCPC 2017 哈尔滨 D. X-Men && HDU 6233(思维+期望)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6233 题意:一个树上有m个人,每个人在某个节点上,每个时刻每个人可以和一个与他距离大于 1 的点进行交 ...

  4. 【AndroidStudio-添加RecyclerView包】 AndroidStudio添加v7包中的RecyclerView

    关于AndroidStudio如何添加v7包中的RecyclerView? 左侧Project视图,在External Libraries下找到appcompat-v7包 右击appcompat-v7 ...

  5. linux 下使用github

    Linux下Git和GitHub环境的搭建 1.创建Github帐号  (name@server.com) 2.安装git [root@cloud ~]# yum install git -y 3.生 ...

  6. JavaScript三元运算符

    ㈠条件运算符也叫做三元运算符 ⑴语法:条件表达式?语句1:语句2: ⑵执行的流程: ①条件运算符在执行时,首先对条件表达式进行求值 ▶如果该值为true,则执行语句1,并返回执行结果 ▶如果该值为fa ...

  7. C# params object[] args 可以传多个参数,可以不限制类型

    http://blog.csdn.net/wslyy99/article/details/1836486 C#参数数组(params)的使用方法 http://www.vcsos.com/articl ...

  8. BZOJ 4017 小 Q 的无敌异或 ( 树状数组、区间异或和、区间异或和之和、按位计贡献思想 )

    题目链接 题意 : 中文题 分析 : 首先引入两篇写的很好的题解 题解一.题解二 听说这种和异或相关区间求和的问题都尽量按位考虑 首先第一问.按二进制位计贡献的话.那么对于第 k 位而言 其贡献 = ...

  9. 51 Nod 1449 砝码称重

    1449 砝码称重  题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 现在有好多种砝码,他们的重量是 w0,w1, ...

  10. [Luogu] 无线网络发射器选址

    https://www.luogu.org/problemnew/show/P2038 二维前缀和 #include <iostream> #include <cstdio> ...