白话零拷贝「建议收藏」

白话零拷贝「建议收藏」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数据收集技术已经实现了。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • python贪吃蛇游戏代码详解外加中文_Python贪吃蛇代码

    python贪吃蛇游戏代码详解外加中文_Python贪吃蛇代码感觉游戏审核新政实施后,国内手游市场略冷清,是不是各家的新游戏都在排队等审核。媒体们除了之前竞相追捧《PokemonGo》热闹了一把,似乎也听不到什么声音了。直到最近几天,突然听见好几人都提到同一个游戏,网上还有人表示朋友圈被它刷屏了。(不过现在微信已经悍然屏蔽了它的分享)这个游戏就是现在iOS免费榜排名第一的《贪吃蛇大作战》。一个简单到不行的游戏,也不知道怎么就火了。反正一款游戏火了,各路媒体…

  • [Python_3] Python 函数 & IO

    [Python_3] Python 函数 & IO

  • 解决:java.lang.UnsupportedClassVersionError「建议收藏」

    解决:java.lang.UnsupportedClassVersionError「建议收藏」问题: java.lang.UnsupportedClassVersionError: xxxxx Unsupported major.minor version 52.0启动Tomcat时出现这种错误。造成这种错误的原因是你的Tomcat运行的JDK版本与支持application运行的JDK版本不一致导致的。解决方法: 1、Window—&gt…

  • msm8953 uart配置

    msm8953 uart配置参考链接:MSM8937-MSM8953UART配置调试指南uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。一、修改设备树设备树的配置有三部分:1.msm8953.dtsi中添加code blsp2_uart2:serial@7af0000{ compatible=”qcom,msm-lsuart-v14″; reg=<0x7af00000x…

  • php sigpipe,Python的SIGPIPE信号「建议收藏」

    php sigpipe,Python的SIGPIPE信号「建议收藏」Haveyoueverseenasocket.error:[Errno32]BrokenpipemessagewhenrunningaPythonWebserverandwonderedwhatthatmeans?Theruleisthatwhenaprocesstriestowritetoasocketthathasalre…

  • lwip udp 发送_lwip udp发送

    lwip udp 发送_lwip udp发送一、udp.c实现的函数1、void&nbsp;udp_input(structpbuf*p,structnetif*inp)说明:处理接收到的udp数据包。参数:p数据包缓存区;inp网络接口。&nbsp;&nbsp;&nbsp;2、err_t&nbsp;udp_send(structudp_pc…

发表回复

您的电子邮箱地址不会被公开。

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