python sendfile_sendfile详解(转)[通俗易懂]

python sendfile_sendfile详解(转)[通俗易懂]在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢?在传统的文件传输里面(read/write方式),在实现上其实是比较复杂的,需要经过多次上下文的切换,我们看一下如下两行代码:read(file,tmp_buf,len);write(…

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

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile到底是什么呢?它的原理又是如何呢?

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

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

以上两行代码是传统的read/write方式进行文件到socket的传输。

当需要对一个文件进行传输的时候,其具体流程细节如下:

调用read函数,文件数据被copy到内核缓冲区

read函数返回,文件数据从内核缓冲区copy到用户缓冲区

write函数调用,将文件数据从用户缓冲区copy到内核与socket相关的缓冲区。

数据从socket缓冲区copy到相关协议引擎。

以上细节是传统read/write方式进行网络文件传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:

硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎

而sendfile系统调用则提供了一种减少以上多次copy,提升文件传输性能的方法。Sendfile系统调用是在2.1版本内核时引进的:

sendfile(socket, file, len);

运行流程如下:

sendfile系统调用,文件数据被copy至内核缓冲区

再从内核缓冲区copy至内核中socket相关的缓冲区

最后再socket相关的缓冲区copy到协议引擎

相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关 缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,系统调用方式仍然一样,细节与2.1版本的 不同之处在于,当文件数据被复制到内核缓冲区时,不再将所有数据copy到socket相关的缓冲区,而是仅仅将记录数据位置和长度相关的数据保存到 socket相关的缓存,而实际数据将由DMA模块直接发送到协议引擎,再次减少了一次copy操作。

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

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

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


相关推荐

  • Android 显示刷新机制、VSYNC和三重缓存机制

    Android 显示刷新机制、VSYNC和三重缓存机制Android显示刷新机制、VSYNC和三重缓存机制为了理解APP是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是VSYNC。首先,我们需要了解2个相关概念:刷新率(RefreshRate):代表了屏幕在一秒内刷新屏幕的次数,这取决于硬件的固定参数,例如60Hz。帧率(FrameRate):代表了GPU在一秒内绘制操作的帧数,例如30fps,60fps。GPU会获取图形数据进行渲染,然后硬件负责把渲染后的内容呈现到屏幕上,他们两者不停的进行协作。

    2022年5月21日
    42
  • pytest重试_pytest失败重跑

    pytest重试_pytest失败重跑安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

    2022年7月29日
    5
  • 操作系统课设详细解答

    操作系统课设详细解答操作系统课设详细解答一、题目一实验一Windows进程管理二、实验目的(1)学会使用VC编写基本的Win32ConsolApplication(控制台应用程序)。(2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。(3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程……

    2022年6月26日
    28
  • c语言学生成绩管理系统(超详细从文件中读取数据)

    c语言学生成绩管理系统(超详细从文件中读取数据)历经一个星期的努力打磨出一个较为完整的学生成绩管理系统注意:本文实在文件中直接读取学生的数据而不是手动添加暂时没有增加添加学生的功能后期更新(多添加一个函数的事情)所有源代码在本文的末尾运行环境:windows由于使用了windows的一个库所以在linux下会出错稍微修改一下也是可以运行的效果图先上结果图界面[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来…

    2022年6月20日
    32
  • 数据中台怎么选型?终于有人讲明白了

    数据中台怎么选型?终于有人讲明白了数据中台怎么选型?终于有人讲明白了

    2022年6月13日
    34
  • java必背代码_java必背代码入门有哪些?如何写出优质代码?

    java必背代码_java必背代码入门有哪些?如何写出优质代码?学习java还是要不断的积累,有必要的话,还是需要大家记忆的,这样更加有利于大家学习java,那么今天我们就给大家分享一些java入门必背代码,希望能够对大家有用!1、把Javautil.Date转成sql.Datejava.util.DateutilDate=newjava.util.Date();java.sql.DatesqlDate=newjava.sql.Date…

    2022年7月7日
    26

发表回复

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

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