在学习sendfille之前,我们先来了解一下浏览器访问页面时,后台服务器的大致工作流程。

下图是从用户访问某个页面到页面的显示这几秒钟的时间当中,在后台的整个工作过程。

如上图,黑色箭头所示的过程,是传统方式的数据传输:

第一步:当用户请求www.test.com/index.html网页时,nginx服务器通过网卡接收到请求后,系统调用read导致了从用户空间到内核空间的上下文切换,内核再向磁盘发送关于Index.html的请求,DMA模块从磁盘中读取index.html(以下简称为数据)发送到内核缓冲区,完成第一次复制。

第二步:系统调用read返回,导致从内核空间到用户空间的上下文切换,此时数据已存放在用户缓冲区中,完成第二次复制。

第三步:系统调用write导致了从用户空间到内核空间的上下文切换,此时数据存放在了内核空间与socket相关的特定缓冲区中(注意这里要将第一步中的内核缓冲区区分开来),完成第三次复制。

第四步:系统再次调用返回,导致了第四次上下文切换,数据来到了相关协议引擎,完成了第四次复制。再有相关引擎返回给用户浏览器。

这里的复制操作均由DMA模块来执行完成。

了解了这个过程后,我们来看一下sendfile和mmap到底是什么?

sendfile“零拷贝”

它的目的也是提升数据的传输性能

如上图中的红色箭头,sendfile机制实际上就是节省了从内核空间到用户空间,再从用户空间到内核空间这个往返的过程,相比于传统的方式节省了一次数据的复制,提高了访问效率。它的大致步骤是:

第一步:从磁盘到内核空间,完成第一次复制。

第二步:从内核空间到socket buffer(注意这里的缓冲区也要和传统方式中第三部的socket区别开来,可以理解为另一块与socket相关的特定缓冲区),完成第二次复制。

第三步:数据从socket buffer到协议相关引擎,完成第三次复制。

自内核版本号2.1,引进了sendfile2.4之后,sendfile实现了更简单的方式,不同之处在于,文件到达内核缓冲区后,不必再将数据全部复制到socket buffer缓冲区,而只将记录数据位置和长度相关的数据保存到socket buffer,而数据实际由DMA模块直接发送给协议相关引擎,再次降低了复制操作。

mmap内存映射

就是在用户的虚拟地址空间中寻找空闲的一段地址进行对文件的操作,不必再调用read、write系统调用,它的最终目的是将磁盘中的文件映射到用户进程的虚拟地址空间,实现用户进程对文件的直接读写,减少了文件复制的开销,提高了用户的访问效率。

总之,sendfile和mmap的目的就是减少了数据从磁盘到用户过程中的复制操作,使数据传输更加高效,提高用户的访问速率。
————————————————
原文链接:https://blog.csdn.net/keil_wang/article/details/86688271

sendfile“零拷贝”和mmap内存映射的更多相关文章

  1. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  2. linux mmap 内存映射【转】

    转自:http://blog.csdn.net/xyyangkun/article/details/7830313 [-] mmap vs readwritelseek mmap vs malloc ...

  3. mmap内存映射

    http://blog.csdn.net/kongdefei5000/article/details/70183119 内存映射是个很有用,也很有意思的思想.我们都知道操作系统分为用户态和内核态,用户 ...

  4. linux mmap 内存映射

    mmap() vs read()/write()/lseek() 通过strace统计系统调用的时候,经常可以看到mmap()与mmap2().系统调用mmap()可以将某文件映射至内存(进程空间), ...

  5. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  6. mmap内存映射复习

    c语言初学时,比较常见的一个习题就是实现cp. 使用c库实现的cp就不赘述了. 最近工作用到内存映射,就拿来练下手,复习一下mmap的用法. 很简单,将目标文件和源文件映射到内存,然后使用memcpy ...

  7. Linux网络编程--sendfile零拷贝高效率发送文件

    from http://blog.csdn.net/hnlyyk/article/details/50856268 Linux系统使用man sendfile,查看sendfile原型如下: #inc ...

  8. [转载]Linux驱动mmap内存映射

    原文地址:https://www.cnblogs.com/wanghuaijun/p/7624564.html mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法 ...

  9. Linux驱动mmap内存映射

    mmap在linux哪里? 什么是mmap? 上图说了,mmap是操作这些设备的一种方法,所谓操作设备,比如IO端口(点亮一个LED).LCD控制器.磁盘控制器,实际上就是往设备的物理地址读写数据. ...

随机推荐

  1. Hyper-V 中设置虚拟机静态 IP

    一.新建虚拟网络交换机 二.配置网络 网络共享默认使用 192.168.137.0/255 作为内网地址,192.168.137.1 作为网关 三.配置虚拟机静态 IP 安装完成虚拟机后修改配置文件: ...

  2. Java读书计划和分享

    写在前面 为什么要写这些呢? 接触java已经有三年多了,感触颇多,比如从0到60,只要勤实践.勤思考,很快就可以入门,从60分到满分极致,则单单不是凭借工作年限或者什么就可以.曾经也有过一段迷茫时期 ...

  3. 老猿学5G扫盲贴:推荐三篇介绍HTTP2协议相关的文章

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 5G中的服务化接口调用都是基于HTTP2协议的,老 ...

  4. PyQt(Python+Qt)学习随笔:Qt Designer中主窗口对象的dockOptions属性

    dockOptions属性代表主窗口对浮动部件停靠的反应,其类型为枚举类型QMainWindow.DockOptions.相关取值及含义如下: 这些枚举值可以组合使用,仅控制如何在QMainWindo ...

  5. 【软件测试部署基础】webpack的认识

    1. 什么是webpack webpack 是一个 JavaScript 应用程序的静态模块打包器(module bundler). 它做的事情就是分析你的项目结构,找到JavaScript模块以及其 ...

  6. 【面试】关于get和post两种方法的不同。

    最近在面试题和笔试题中经常会看到这道题,所以打算系统的整理一下. 一般标准的答案是这样的. GET在浏览器回退时是无害的,而POST会再次提交请求(浏览器应该告知用户数据会被重新提交). GET产生的 ...

  7. web移动端点击穿透问题

    在移动端开发的时候,我们有时候会遇到这样一个bug:点击关闭遮罩层的时候,遮罩层下面的带有点击的元素也会被触发,给人一种击穿了页面的感觉,这是为什么呢?主要是因为用户touch事件关闭按钮的时候,触发 ...

  8. 3款pdf插件介绍

    1.pdf.js:推荐使用.小窗口可以使用iframe来解决.ie8及以下不支持,但是360的兼容模式ie8下可以在新标签页中打开,在iframe中打不开,ie8中在新标签页也不支持打开.可使用ua- ...

  9. IDEA注册码(附修改hosts文件的方法)

    推荐获取IDEA注册码的网站:http://idea.lanyus.com/ 亲测好用! 也可复制下边的注册码: K71U8DBPNE-eyJsaWNlbnNlSWQiOiJLNzFVOERCUE5F ...

  10. git clone GitLab 工程报错Repository not found

    有时使用git拉取gitlab上的项目时会出现如下的错误信息:Repository not found remote: Repository not found.fatal: repository ' ...