文档章节

sendfile机制学习(转)

屌丝Lee
 屌丝Lee
发布于 2016/04/14 11:03
字数 637
阅读 106
收藏 1

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

read(file, tmp_buf, len);
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相关缓冲区—>协议引擎

 而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操作。

效率 3次copy->1次copy;

本文转载自:网络

共有 人打赏支持
屌丝Lee
粉丝 1
博文 27
码字总数 11777
作品 0
海淀
私信 提问
Apache站点下载大文件不完整原因及解决办法

今天在本地测试一个JQuery插件,但是浏览器里一直提示JQuery文件第x行缺少“}”。刚开始以为是js文件有问题,所以就从官方重新下载了一个JQuery,但还是有同样的问题,重新看了一下代码,没有...

苗雨顺
2011/04/01
0
0
sendfile()对nginx性能的提升

Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层---用户层多次读写系...

老徐_kevin
2014/05/26
0
0
磁盘及网络IO工作方式解析

PIO与DMA 有必要简单地说说慢速I/O设备和内存之间的数据传输方式。 PIO 我们拿磁盘来说,很早以前,磁盘和内存之间的数据传输是需要CPU控制的,也就是说如果我们读取磁盘文件到内存中,数据要...

go4it
2016/12/04
10
0
splice和sendfile

在linux2.6.17之后,内核提供了一个splice/tee系统调用,这可以让用户直接操作内核缓冲区了,这个特性特别适合做网络代理,本文简短的说明一下,快下班了。 在linux2.6.17之后,内核提供了一...

晨曦之光
2012/04/10
183
0
解剖Nginx·自动脚本篇(3)源码相关变量脚本 auto/sources

解剖 Nginx ·自动脚本篇(3)源码相关变量脚本 auto/sources Author: Poechant Blog: blog.CSDN.net/Poechant Email: zhongchao.ustc#gmail.com (#->@) Date: March 6th, 2012 Copyright ©......

晨曦之光
2012/04/24
116
0

没有更多内容

加载失败,请刷新页面

加载更多

纹理与表面细节添加方法---凹凸映射

中国龙-扬科
27分钟前
0
0
20181115上课截图

小丑鱼00
35分钟前
1
0
初识css自定义属性

这算是一篇两篇文章译文的糅合体,旨在帮助理解css自定义属性。 今天,CSS预处理器是Web开发的标准。 预处理器的一个主要优点是它们使您能够使用变量, 这有助于您避免复制和粘贴代码,并简化...

嫣然丫丫丫
44分钟前
1
0
JAVA基础--session共享的前生今世

session共享的前生今世 Session及cookie基本概念及生命周期 session   当浏览器发起一个新的HTTP请求时,WEB服务端会主动创建一个session.并分配一个sessionID作为服务端识别客户端的一个标...

spinachgit
53分钟前
0
0
Deepin Linux 下把 UC 缓存视频变为 MP4 文件

本文是利用 FFMPEG 的功能实现的。 生成 file.txt文件 因为缓存文件都是数字,且文件夹内还有其他文件,包括 index.* 的文件。 $ ls -1v --hide=file.txt --hide=index* > file.txt 解释 ls...

不避风云
54分钟前
0
3

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部