文档章节

sendfile机制学习(转)

屌丝Lee
 屌丝Lee
发布于 2016/04/14 11:03
字数 637
阅读 100
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

Python介绍

Python介绍 一、简介 Python是完全面向对象的语言。函数、模块、数字、字符串都是对象。并且完全支持继承、重载等,有益于增强源代码的复用性。Python相对于Lisp这种传统的函数式编程语言,P...

星汉
13分钟前
0
0
VS_设置护眼背景色

工具---->选项---->环境---->字体和颜色:

一个小妞
15分钟前
0
0
Flask跨域请求的处理方法

在Flask开发RESTful后端时,前端请求会遇到跨域的问题。下面是解决方法: 使用 flask-cors库可以很容易的解决 pip install flask-cors 两种方法,一个是全局/批量的,一个是单一独立的: 安全...

ykbj
16分钟前
2
0
Pandas学习记录-Series

系列(Series)是能够保存任何类型的数据(整数,字符串,浮点数,Python对象等)的一维标记数组。轴标签统称为索引。 pandas.Series Pandas系列可以使用以下构造函数创建 - pandas.Series( dat...

kipeng300
24分钟前
0
0
可以实现内网穿透的几款工具

最近没什么事情,看了一些关于内网穿透的文章,因我本身已是做微信开发相关的工作,对这部分关注的比较多,现分享给大家。 首先说下内网穿透的原理。 NAPT原理 在NAT网关上会有一张映射表,表...

哥本哈根的小哥
25分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部