白话零拷贝「建议收藏」

白话零拷贝「建议收藏」sendfile()这个系统调用是在两个文件描述符之间直接传递数据(这个操作是完全在内核态进行),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,称之为零拷贝,操作效率很高—————————下面我们一步一步来了解什么是零拷贝———————–我们知道I/O操作分为缓存I/O和直接I/O缓存I/O缓存I/O,即标准I/O…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

sendfile()这个系统调用 是在两个文件描述符之间直接传递数据(这个操作是完全在内核态进行),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,称之为零拷贝,操作效率很高

————————— 下面我们一步一步来了解什么是零拷贝 ———————–

我们知道I/O操作分为缓存I/O和直接I/O

缓存I/O

缓存I/O,即标准I/O也就是传统I/O;传统IO在read时先把IO的数据拷贝到内核缓冲区,在拷贝到(用户空间)应用程序缓冲区;write时再把用户缓冲区的数据拷贝的内核缓冲区,如果数据是要通过网卡发送出去,数据还要从内核缓冲区再拷贝到网卡设备的缓冲区。一共经过了4次数据的拷贝
在这里插入图片描述
那么传统I/O好处:
1)内核缓冲区,在一定程度上将应用程序地址空间与时间物理设备隔离
2)可以减少读磁盘的次数,当数据已经在缓冲区时,不需要进行实际的物理读盘操作

对于写操作:
synchronous writes同步写机制:数据在写入内核缓冲区后,会立即写入磁盘,应用程序会一直等到数据写完为止
deferred writes延迟写机制:只要数据写到液缓存(即内核缓冲区)去就可以了,操作系统会定期的写入磁盘。与asynchronous writes异步机制不同的一点就是,异步写在完全写入磁盘后会通知应用程序。而延迟写不会,所以延迟写是有可能会丢失数据的

传统IO缺点:
传统I/O 机制中,虽然有DMA 方式可以将数据直接从磁盘读到页缓存(即内核缓存)中,或者将数据从页缓存直接写回到磁盘上,但是DMA不能直接在应用程序地址空间和磁盘之间进行数据传输,这样的话,数据在传输过程中需要在应用程序地址空间和页缓存之间进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。

在这里插入图片描述
直接I/O 如图,直接I/O,可以直接把数据从一个设备发送到另一个设备,而不需要在内核缓冲区和用户缓冲区直接把数据进行多次拷贝。直接I/O就没有数据的拷贝,所以直接I/O也叫零拷贝

当应用程序因为读写或者发送数据而使用系统调用(函数)时,就会发生用户空间到内核空间的来回切换,来进行多次的数据复制,虽然系统调用接口很简单。但这回损失系统的性能。这种简单的数据拷贝 不单单要占用CPU的时间片,还会占用内存带宽。而CPU和内容这都是最宝贵的系统资源,明显很不划算。

而零拷贝避免了这种情况。
1 零拷贝没有操作系统内核缓冲区之间进行数据拷贝
2 尽量避免内核缓冲区与应用程序缓冲区数据拷贝(除非这些数据需要应用程序进行处理,而不得不进行交互)
3 尽量使用DMA接口技术进行数据传输
一句话总结零拷贝就是不用进行数据拷贝,而直接进行数据传输的I/O操作,即直接I/O

———————- 下面看一下sendfile函数实现零拷贝的原理 ———————-

简单来说就是:
1)sendfile系统调用 利用DMA引擎将文件数据拷贝到内核缓冲区
2)之后数据被拷贝到内核socket缓冲区中,
3)DMA引擎将数据从内核socket缓冲区拷贝到协议引擎中,,这里有一个默认前提是sendfile() 只是适用于应用程序地址空间不需要对所访问数据进行处理的情况,因为sendfile 操作的数据没有在用户程序地址空间和内核空间进行任何交互。

如果我们在硬件上在做一下改进,上面提到的一次到内核缓冲区的拷贝也可以避免。现在的linux系统其实通过DMA数据收集技术已经实现了。

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

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

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


相关推荐

  • Axure的动态面板制作tab切换效果

    Axure的动态面板制作tab切换效果最近进行机房合作画原型图的时候用到了Axure画图软件,画出来的图感觉棒棒哒!在画结账窗体的时候确实遇到了一些问题,因为有动态效果图,点击不同的Tab时要有不同的界面显示,所以学习了一下!

    2022年5月18日
    40
  • mysql授予用户新建数据库的权限[通俗易懂]

    mysql授予用户新建数据库的权限

    2022年2月14日
    45
  • javas事件_java提供的事件处理模型

    javas事件_java提供的事件处理模型鼠标事件/*onclick:点击某个对象时触发ondblclick:双击某个对象时触发onmouseover:鼠标移入某个元素时触发onmouseout:鼠标移出某个元素时触发onmouseenter:鼠标进入某个元素时触发onmouseleave:鼠标离开某个元素时触发onmousedown:鼠标按下时触发onmouseup:鼠标抬起时触发onmousemove:鼠标被移动时…

    2025年7月17日
    8
  • Python源码保护[通俗易懂]

    Python源码保护[通俗易懂]1混淆改方法主要将函数、类名以及变量名等替换为其他符号,提高了阅读的难度,Python代码混淆网站。但该方法未改变程序的主体结构,实际效果并不是很好。具体如下图1所示:2pycpython是先把源码py文件编译成pyc或者pyo,然后由python的虚拟机执行。最简单的加密方法是将编译后的pyc二进制文件发布,详情可以参考blog。但与其他语言一样编译后的产生的pyc依然可以通过反编译得…

    2022年8月23日
    7
  • 2021.7idea激活码_在线激活

    (2021.7idea激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    72
  • 利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM

    利用 Composer 一步一步构建自己的 PHP 框架(四)——使用 ORM

    2021年11月7日
    37

发表回复

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

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