白话零拷贝「建议收藏」

白话零拷贝「建议收藏」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)


相关推荐

  • String转JsonArray转List[通俗易懂]

    String转JsonArray转List[通俗易懂]场景是查看学生详情时需要展示学生学历信息比如某某年哪个学校毕业奖惩情况等等privateModelAndViewshowDetails(Stringid){//…省略业务代码ModelAndViewmodel=newModelAndView(“你的页面地址”);//源Stringmpp=”{\”start…

  • jieba库(jieba库的介绍以及分词原理,jieba的三种模式和常用函数,利用Jieba模块进行中文词语的统计)[通俗易懂]

    jieba库(jieba库的介绍以及分词原理,jieba的三种模式和常用函数,利用Jieba模块进行中文词语的统计)[通俗易懂]环境:Python3.6+windows10jieba介绍以及分词的原理1.jieba是Python中的优秀的中文分词第三方库–中文文本需要通过分词获得单个的词语2.jieba库提供三种分词模式,最简单只需要掌握一个函数3.jieba库的安装只需要在cmd中,pipinstalljieba4..jieba分……

  • 缓存

    缓存

  • mysql解锁_mysql锁表如何解锁

    mysql解锁_mysql锁表如何解锁什么是MySQL锁表?为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。MySQL有三种锁的级别:页级、表级、行级。MyISAM和MEMORY存储引擎采用的是表级锁(table-levellocking);BDB存储引擎采用的是页面锁(page-levellocking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-levellockin…

  • platform_driver_register 与 platform_device_register「建议收藏」

    platform_driver_register 与 platform_device_register「建议收藏」
    platfrom_driver_register()是在设备注册时进行绑定的.以USB为例:先插上USB设备并挂到总线上,然后在安装USB设备驱动的过程中,从总线上遍历各个设备,看是否有与驱动相匹配的设备,如果有,则两者绑定,就是platfrom_driver_register()
     
    platfrom_device_register()是在驱动注册时进行绑定的.以USB为例:先安装USB驱动程序,然后当USB设备插入时,就遍历总线上各个驱动,看两者是否匹配,如果相配则

  • 《内网安全攻防:渗透测试实战指南》读书笔记(三):隐藏通信隧道技术[通俗易懂]

    《内网安全攻防:渗透测试实战指南》读书笔记(三):隐藏通信隧道技术[通俗易懂]本篇继续阅读学习《内网安全攻防:渗透测试实战指南》,是第三章隐藏通信隧道技术,详细介绍了IPv6隧道、ICMP隧道、HTTPS隧道、SSH隧道、DNS隧道等加密隧道的使用方法,并对常见的SOCKS代理工具及内网上传/下载方法进行了解说

    2022年10月18日

发表回复

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

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