Sendfile函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝。

Sendfile函数的定义例如以下:

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

1.传统方式read/write send/recv

在传统的文件传输里面(read/write方式),在实现上事实上是比较复杂的,需要经过多次上下文的切换。我们看一下例如以下两行代码:

1.read(file, tmp_buf, len);
2.write(socket, tmp_buf, len);

以上两行代码是传统的read/write方式进行文件到socket的传输。

当需要对一个文件进行传输的时候,其详细流程细节例如以下:

1.调用read函数,文件数据被copy到内核缓冲区

2.read函数返回。文件数据从内核缓冲区copy到用户缓冲区

3.write函数调用。将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。

4.数据从socket缓冲区copy到相关协议引擎。

以上细节是传统read/write方式进行网络文件传输的方式,我们能够看到,在这个过程其中,文件数据实际上是经过了四次copy操作:

硬盘-->内核buf-->用户buf-->socket相关缓冲区(内核)-->协议引擎

2.新方式sendfile

而sendfile系统调用则提供了一种降低以上多次copy。提升文件传输性能的方法。

Sendfile系统调用是在2.1版本号内核时引进的:

sendfile(socket,file,len);

执行流程如下:

1.sendfile系统调用,文件数据被copy至内核缓冲区

2.再从内核缓冲区copy至内核中socket相关的缓冲区

3.最后在socket相关的缓冲区copy到协议引擎

相较传统read/write方式,2.1.版本号内核引进的sendfile已经降低了内核缓冲区到user缓冲区。再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本号2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本号的不同之处在于,当文件数据被拷贝到内核数据缓冲区时,不再将全部数据copy到socket相关的缓冲区,而是只将记录数据位置和长度相关的数据保存到socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次降低了一次copy操作。

Linux Sendfile的优势相关推荐

  1. Linux的强大优势(转)

    Linux的强大优势(转)[@more@]您或许已听到大量称赞Linux如何如何强壮的言论,现今就让我们来仔细逐条地对他们进行阐述,在众人赞誉声中获得事实真相. 低廉的附加费用 ----Linux经常 ...

  2. win08跟linux,Win 8 PK Linux!八大优势助微软完胜

    作为传统桌面OS的霸主,Windows操作系统长期统治着桌面操作系统.即使是不可一世的苹果,在桌面OS上,也难以跟Windows的影响力对比.而在开源市场,却有着不可忽视的一股新生力量,Linux桌面 ...

  3. linux数字标牌,数字标牌操作系统中,Android、 Windows、Linux各自的优势在哪?

    Android.Windows.Linux数字标牌操作系统到底三者有何优势,相信很多朋友都在思考这个问题,今天智能数字标牌网小编和大家一起探讨.首先Android.Windows.... Androi ...

  4. 浅谈学习掌握linux系统的优势

    导读 Linux系统让我们懂得了共享.开放.自由可以让人类生活的更加美好,开源精神是一种让每个从事Linux行业的技术人员从骨子里自豪的情怀,开源产品的兴盛受益于开源社区的强壮根基.Linux真的给了 ...

  5. Liunx之网络编程

    Liunx网络编程 进程 线程 TCP/IP协议簇 并发编程 操作系统 进程 进程:资源分配的最小单元,操作系统执行的最小单位: Linux对进程采用了一种层次系统,每个进程都依赖于一个父进程.内核启 ...

  6. 凡人学习Linux之路

    近期Windows 11的信息频频出现在各个公众平台上,对它的评价好坏参半,我的关注点是它取消了任务栏移动功能,只能靠着屏幕底边,不能移动到顶部或左右两侧,而且有人喊话说准备撤了,换Linux.其实现 ...

  7. Linux的命令行界面简介

    学习目标:能够知道什么是命令行,能够说出命令提示符的组成,能够说出如何获取到相关命令的帮助 一.命令行的介绍 命令行界面(英语:command-line interface,缩写:CLI)是在图形用户 ...

  8. 为什么建议大家使用Linux开发?

    原文链接 : cnblogs.com/summertime-wu/p/11140052.html Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上.当我告诉 ...

  9. 嵌入式Linux的特点

    Linux系统是完全开放.免费的. Linux操作系统的显著优势是多用户和多任务. 设备是独立的.

最新文章

  1. python制作贪吃蛇游戏_用Python写贪吃蛇游戏的代码实例
  2. 为什么多个线程不可能同时抢到一把锁_并发基础理论:原子性问题、锁、管程...
  3. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)
  4. 云小课 |选定合适的证书,做“有证”的合规域名
  5. python网络编程-socketserver模块
  6. 1.4 案例:广告预测、房价预测
  7. CuteFTP下载包含中文的文件,无法下载的问题
  8. Unity太空大战游戏-Socket网络通信教学示例
  9. 【存储数据恢复】esx vmfs的互斥导致存储数据丢失的数据恢复案例
  10. SVN :找不到这样的主机
  11. 【开源方案】PPT/PPTX转image图片
  12. 冒泡排序和快速排序的效率比较
  13. python双样本t检验_两样本t检验的scipy实现
  14. iPhone在线音乐盒,代码开源
  15. PR AE PS安装资源包
  16. 全球及中国组织工程医疗产品行业深度分析及十四五前景预测报告2022年版
  17. How to evaluate and motivate a speech
  18. 《你是我的荣耀》制片人张萌犯受贿罪:被判处有期徒刑三年
  19. 计算机组成原理笔记(7)---定、浮点运算、算术逻辑单元
  20. 在接下来的几周,Mt.gox可能会上演一出好戏

热门文章

  1. java中三种常见内存溢出错误的处理方法
  2. activemq的部署(三)
  3. 大量更新后数据膨胀_段合并的原理探寻
  4. 使用最新版mysql 8.0.11会出现的一些问题
  5. 原理详解与标准解法——蓝桥杯_2016年省赛B组 第七题 剪邮票(暴力+迷宫变形)
  6. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)
  7. android平台 arcgisr_第一个基于ArcGIS的Android应用
  8. 智能情绪分析技术_情绪转变令市场再次修正 Justforex:欧元、英镑、日元、黄金技术分析...
  9. Shell编程之条件语句(if语句,case分支语句)
  10. mysql榨包是什么意思_模块与包 Mysql与Oracle区别