sendfile为什么比read、writer快

sendfile为什么比read、writer快本文转自: http://www.yanyufly.com/2010/10/22/sendfile为什么比readwrite快/ 在看关于文件IO优化资料时,其中提到了sendfile,man了一下,原理是:由于cp都执行在内核态中,避免用户多次调用的切换以及内存cp,因此性能要高于read()+write().适用于从一个文件读出写到另一个文件(网络Fd也可)#include

大家好,又见面了,我是你们的朋友全栈君。

本文转自: http://www.yanyufly.com/2010/10/22/sendfile为什么比readwrite快/ 

在看关于文件IO优化资料时,其中提到了sendfile,man了一下,原理是: 由于cp都执行在内核态中,避免用户多次调用的切换以及内存cp, 因此性能要高于read()+write(). 适用于从一个文件读出写到另一个文件(网络Fd也可)
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

在网上查到了一个关于sendfile在网络应用的解释,非常好,特列如下:
硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
一般来说一个网络应用是通过读硬盘数据,然后写数据到 socket 来完成网络传输的。上面2行用代码解释了这一点,不过上面2行简单的代码掩盖了底层的很多操作。来看看底层是怎么执行上面2行代码的:

1、系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。

2、数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode。

3、系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer 和 socket 相关联。

4、系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换了),然后 DMA 从 kernel buffer 拷贝数据到协议栈(第4次拷贝了)。

  上面4个步骤有4次上下文切换,有4次拷贝,我们发现如果能减少切换次数和拷贝次数将会有效提升性能。在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数。

再来看一下用 sendfile() 来进行网络传输的过程:
sendfile(socket, file, len);
硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈

1、系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝。

2、DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里。

  步骤减少了,切换减少了,拷贝减少了,自然性能就提升了。这就是为什么说在 Nginx 配置文件里打开 sendfile on 选项能提高 web serve r性能的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144765.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电脑桌面图标点击打不开怎么办_双击桌面图标打开的是属性

    电脑桌面图标点击打不开怎么办_双击桌面图标打开的是属性在网上我们经常会看到有人提问“怎样解决笔记本电脑双击桌面图标打不开”的问题,引发该问题的原因是exe文件的关联损坏了,当然系统中毒也可能导致此现象,那么我们该如何解决这个问题呢?下面就由学习啦小编跟大家分享具体的处理方法吧,希望对大家有所帮助~笔记本电脑双击桌面图标打不开的两个处理方法笔记本电脑双击桌面图标打不开的处理方法一:1、点击屏幕左下角的开始菜单按钮,然后再点击“所有程序”;2、接着点击“…

    2022年8月12日
    6
  • 什么是CICD

    什么是CICD什么是CICD一、简介二、持续集成(CI)三、持续交付(CD)四、持续部署(CD)五、下一步是什么?一、简介CI/CD的采用改变了开发人员和测试人员如何发布软件。最初是瀑布模型,后来是敏捷开发,现在是DevOps,这是现代开发人员构建出色的产品的技术路线。随着DevOps的兴起,出现了持续集成(ContinuousIntegration),**持续交付(ContinuousDeli…

    2022年4月26日
    60
  • Matlab保存图像的5种方法「建议收藏」

    Matlab保存图像的5种方法「建议收藏」此博客转自:https://blog.csdn.net/holybin/article/details/39502077,另外我补充了一些实验结果。1、使用imwrite函数如图像是img,则可以使用imwrite(img,’result.jpg’);这种方法保存图像大小和显示的大小是一样的。下面的方法得到的图像和原图像的大小不一样;下面是用该方法保存的图片我们注意到,用imwrite保存的图…

    2022年9月13日
    2
  • sql注入详解_sq注入教程

    sql注入详解_sq注入教程SQL注入(SQLInjection)是一种常见的Web安全漏洞,主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。从而导致数据库受损(被脱库、被删除、甚至整个服务器权限陷)。即:注入产生的原因是后台服务器接收相关参数未经过滤直接带入数据库查询…

    2022年10月3日
    4
  • tlb表项_谷物对人体的好处

    tlb表项_谷物对人体的好处TLB:TranslationLookasideBuffer.根据功能可以译为快表,直译可以翻译为旁路转换缓冲,也可以把它理解成页表缓冲。里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是通过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内存地址,而CPU寻址时会优先在TLB中进行寻址。处理器的性能就和寻址的命中率有很大的关系。映射机制必须使一个程序能断言某个地址在其自己的进程空间或地址空间

    2025年5月28日
    4
  • Lamp架构_lamp部署

    Lamp架构_lamp部署lamp(Web应用软件组合)Linux+Apache+Mysql/MariaDB+Perl/PHP/Python一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。随着开源潮流的蓬勃发展,开放源代码的LAMP已经与J2EE和.Net商业软件形成三足鼎立之势,并且该软件开发的项目在软件方…

    2022年10月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号