美文网首页
白话NIO(一):从零拷贝说起

白话NIO(一):从零拷贝说起

作者: Top2_头秃 | 来源:发表于2019-05-14 10:39 被阅读0次

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

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

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

缓存I/O

缓存I/O,即标准I/O也就是传统I/O;传统IO在read时先把IO的数据拷贝到内核缓冲区,在拷贝到(用户空间)应用程序缓冲区;write时再把用户缓冲区的数据拷贝的内核缓冲区,如果数据是要通过网卡发送出去,数据还要从内核缓冲区再拷贝到网卡设备的缓冲区。一共经过了4次数据的拷贝


传统I/O原理
  • 那么传统I/O好处
    1 内核缓冲区,在一定程度上将应用程序地址空间与时间物理设备隔离
    2 可以减少读磁盘的次数,当数据已经在缓冲区时,不需要进行实际的物理读盘操作

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

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

直接I/O

直接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数据收集技术已经实现了。

相关文章

  • 白话NIO(一):从零拷贝说起

    sendfile()这个系统调用 是在两个文件描述符之间直接传递数据(这个操作是完全在内核态进行),从而避免了数据...

  • Nio中文件映射和零拷贝

    NIO中文件映射和零拷贝 Zero-Copy DMA从拷贝至内核缓冲区 cpu将数据从内核缓冲区拷贝至内核空间(s...

  • NIO零拷贝

    先来偷个图,然后扶好小板凳,别摔着了。这是传统IO的文件操作 假设有以下场景,浏览器请求磁盘上的文件a.txt,那...

  • NIO & 零拷贝

    DMA:direct memory access,直接内存拷贝,不使用CPU

  • JVM

    直接内存 使用场景:Unsafe类、NIO零拷贝、Netty的零拷贝、JNI 优点:性能更高 缺点:内存泄漏难排查...

  • NIO与零拷贝

    一、是什么 先来看如下一段代码: 这段代码就是读取一个文件,然后再把它写出去,看起来就几行代码,其实涉及到多次拷贝...

  • NIO-零拷贝

    首先,调用read时,数据文件A拷贝到了kernel模式; 之后,CPU控制将kernel模式数据复制到user模...

  • NIO与零拷贝

    1 零拷贝原理 1.1 传统IO4次拷贝3次切换 2.1优化后3次拷贝2次切换 零拷贝是从操作系统角度看的,是没有...

  • 零拷贝

    我们在Java NIO,Netty,Kafka等框架中经常见到零拷贝,通常作为其性能优异的一个重要表现。 下面从 ...

  • 什么是 NIO?

    1、前言 想必大家肯定被什么公众号什么非阻塞、零拷贝、NIO 之类的搞的头了吧,但其实 Java 的 NIO 概念...

网友评论

      本文标题:白话NIO(一):从零拷贝说起

      本文链接:https://www.haomeiwen.com/subject/eowjaqtx.html