sendfile实现文件服务器,sendfile
在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢? 在传统的文件传输里面(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操作。
sendfile实现文件服务器,sendfile相关推荐
- Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee
文章目录 传统文件传输的问题 Linux中实现零拷贝的方法 传统文件传输的问题 在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用writ ...
- Linux Sendfile的优势
Sendfile函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile函数的定义例如 ...
- linux 高级IO函数之sendfile splice tee
sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免内核缓冲区和用户缓冲区之间的数据拷贝,效率很高,这被称为零拷贝.函数的定义如下: #include<sys/send ...
- Linux网络编程--sendfile零拷贝高效率发送文件
本博文介绍使用sendfile函数进行零拷贝发送文件,实现高效数据传输,并对其进行验证. 那么什么是sendfile呢? linux系统使用man sendfile,查看sendfile原型如下: # ...
- Linux的高效传输函数sendfile
参考手册:http://man7.org/linux/man-pages/man2/sendfile.2.html 函数原型: #include <sys/sendfile.h> ssiz ...
- sendfile()对nginx性能的提升
Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)---内核层--- ...
- sendfile相关
考虑将一个本地文件通过socket发送出去的问题.我们通常的做法是:打开文件fd和一个socket,然后循环地从文件fd中read数据,并将读取的数据send到socket中.这样,每次读写我们都需要 ...
- Socket网络编程中的sendfile传送文件
前言 文件传送是聊天室的最后一个功能了,这篇博客依然建立在聊天室的项目背景之上. 在我们可以使用Socket套接字在两个客户端进行通信的基础上,传送文件的难点在于如何接收以及文件的离线发送. 文件发送 ...
- sendfile | 传说中的零拷贝(主要用于网络中文件传输)
sendfile函数 sendfile函数简介 sendfile简单小例子 用sendfile函数简单模拟文件下载 sendfile函数简介 sendfile函数:sendfile函数是在两个文件描述 ...
最新文章
- pandas基于条件判断更新dataframe中特定数据列数值内容的值(Conditionally updating values in specific pandas Dataframe )
- Spring Boot Bean的使用,@Repository,@Service,@Controller,@Component
- 【PAT乙级】1048 数字加密 (20 分)
- SQL Server 使用OPENROWSET访问ORACLE遇到的各种坑总结
- Firefox 5 公开测试下载
- php 废弃,PHP 7 废弃特性
- 借攻防演习提升企业安全能力
- 几种软件滤波算法的原理和比较(带源码)
- Mybatis与Spring整合示例
- matplotlib制作多张图
- Mybatis 控制台打出Sql-Log的设置
- nginx的配置总结
- 非参数统计的Python实现——随机游程检验
- 为了方便在微博上看小黄图,我写了一段JS
- handlersocket原理和性能测试
- 原生js实现动态生成表格
- JAVA中对集合排序
- 微信小游戏马甲包过审策略
- 202102-一个小屁民的若有所思
- 数据库第九章习题作业