零拷贝是什么?

发布时间 2024-01-11 21:20:12作者: 天NULL

  零拷贝,是一个出现在技术圈里面比较频繁的词。

  啥叫零拷贝呢?简单说,就是省去了数据从内核态到用户态的来回复制,从而带来了性能的提高。

  说到零拷贝,就不得不提到一个词,DMA(Direct Memory Access),DMA,其实就是一个芯片,放置于主板上。

  那么,DMA要解决的是什么问题呢?

  简单讲,CPU操作IO时,由于CPU性能远远大于硬盘(或者网络),那么,IO等待,就会浪费CPU的性能。DMA正是解决了这个问题,

比如读磁盘数据,CPU只需要操纵DMA,由DMA来将磁盘数据搬运到内核态缓冲区,CPU无需等待IO,从而避免了浪费。

  以一个例子来具体讲零拷贝,比如你做一个功能,要读磁盘,然后数据传输到网络。

  Java中第一种写法为:

  File.read(fileDesc, buf, len);

  Socket.send(socket, buf, len);

  这种写法,数据流为:   磁盘 -> 内核态缓冲区 -> 用户态内存 -> Socket 缓冲区 -> 网卡缓冲区, 共有4次数据复制。

  但是如果你用到NIO技术,这么写:

  fileChannel.transferTo(postion,count,socketChannel);

  数据流则为:磁盘 -> 内核态缓冲区 -> 网卡缓冲区, 只有2次数据复制。这,就是零拷贝技术。那么,零拷贝技术和DMA有什么关系呢?

很简单,零拷贝技术的目的是为了提高系统性能,如果不使用DMA,CPU由于IO等待,便会降低系统性能。

 那么,JAVA NIO 是怎么做到无需 内核态缓冲区 <-> 用户态内存 数据复制的呢?其实,JAVA中就是利用了直接内存。
 ByteBuffer byteBuffer = ByteBuffer.allocateDirect(BUFFER);
JAVA零拷贝的最底层,正是由于直接内存。
总结一下,说到零拷贝,我们往往会提到DMA,但是要清楚,零拷贝这个技术的核心,或者之所以叫做零拷贝,并不是因为DMA这块芯片。只能说,Linux下的大型服务器,大都有
DMA, DMA使得零拷贝技术真正能绽放光芒。