sendfile零拷贝
来源:互联网 发布:ubuntu 12.04 163源 编辑:程序博客网 时间:2024/05/17 21:52
sendfile函数
#include<sys/sendfile.h>ssize_t sendfile(int outfd,int in_fd,off_t* offset,size_t count);
in_fd是待读出内容的文件描述符,out_fd参数是待写入内容的文件描述符。offset参数指定从读入文件流的哪个位置开始读,如果为空,则使用读入文件流默认的起始位置。count参数指定在文件描述符in_fd和out_fd之间传输的字节数,失败返回-1并设置errno。
该函数man手册明确指出,in_fd必须是一个支持类似mmap函数的文件描述符,即它必须指向真实的文件,不能是socket和管道;而out_fd则必须是一个socket。由此可见sendfile几乎专门为在网络上传输文件而设计的。
sendfile传送文件为什么是“零拷贝”?
用普通方法传送文件时,首先要循环调用read和write
- 系统调用read产生一个上下文切换,从用户态切换到内核态,然后DMA执行拷贝,把文件数据从硬盘读到一个kernel buffer中。
- 数据从内核态拷贝到用户态,系统调用read返回
- 系统调用write,从用户态切换到内核态,把用户态的数据拷贝到内核态
从内核态切换到用户态,然后DMA从内核缓冲区拷贝数据到协议栈
每次read和write要经过4次用户态和内核态之间的切换,系统调用开销大,传送速率慢。并且对于传送文件来说,我们只要知道文件存在,直接发送给对端,而不需要对文件进行读取,sendfile应用而生…
系统调用sendfile,通过DMA 把硬盘数据拷贝到内核缓冲区,然后数据被内核直接拷贝到另外一个socket相关的内核缓冲区中。这里没有用户态和内核态之间的切换,在内核中直接完成了数据从一个内核缓冲区拷贝到另一个内核缓冲区。
- DMA把数据从内核缓冲区拷贝到协议栈
阅读全文
1 0
- 零拷贝与 sendfile
- sendfile函数--零拷贝
- sendfile零拷贝
- sendfile:Linux中的"零拷贝"
- sendfile()实现零拷贝详解
- Linux "零拷贝" sendfile函数
- sendfile: Linux中的"零拷贝"
- sendfile:Linux中的"零拷贝"
- sendfile:Linux中的"零拷贝"
- Sendfile Linux 系统中的零拷贝
- 【Linux编程】零拷贝之sendfile( )函数
- Linux "零拷贝" sendfile函数中文说明及实际操作分析
- Linux "零拷贝" sendfile函数中文说明及实际操作分析
- Linux "零拷贝" sendfile函数中文说明及实际操作分析
- linux网络编程八:高效的sendfile,实现零拷贝
- Linux网络编程--sendfile零拷贝高效率发送文件
- sendfile函数如何实现零拷贝提高性能
- 扯淡nginx的sendfile零拷贝的概念
- C++的重载,覆盖以及隐藏
- Android图表控件MPAndroidChart的简单介绍(MPAndroidChart3.0)
- windows 7 python3.4 安装scrapy与常见错误
- SQL优化大总结之 百万级数据库优化方案
- 常见面试题 -- JAVA 小结
- sendfile零拷贝
- 数学&数论 知识总结
- 百度分享插件的使用
- FPN网络
- 用python写网络爬虫-爬取新浪微博评论
- 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
- 8.17 H – Frogger
- 常用正则表达式
- java集合之PriorityQueue