首页 技术 正文
技术 2022年11月15日
0 收藏 621 点赞 2,231 浏览 1210 个字

在学习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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,860