文章目录
一、前言
众所周知,常见的如NIO、Netty、Kafka、RocketMQ这些框架保持高效率读写的一个原因就是使用了零拷贝技术。如果想要深入研究这些框架,就需要先掌握零拷贝的原理。
比如kafka为什么可以如此高效的读写数据,主要有如下三个原因:
-
kafka本身是分布式集群,同时又采用了分区技术,具有较高的并发度。
-
数据可以顺序写入磁盘,Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。
-
使用了零拷贝技术。
这三个原因里,前两个比较好理解,一方面因为分布式集群模式同时又采用了分区技术,可以有很好的并发读写数据能力;另一方面在kafka官网也提供了数据表明在同样的磁盘下顺序写能到 600M/s,而随机写只有 100K/s,这 与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。
但是最后一个零拷贝技术就不是这么容易理解了,下面让我们一起追本溯源,从操作系统底层开始探究零拷贝的奥秘!
二、纠正一些网络上流传的错误说法
2.1、错误说法一:零拷贝就是零复制或者零拷贝技术没有进行数据的复制操作,所以比较快。
从拷贝这个音译词汇的翻译来看,拷贝确实就是复制的意思,但是零拷贝绝对不是零复制,零复制很容易让人以为它进行了0次复制,其实是不对的。下面让我们看下维基百科的解释:
"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.
翻译过来就是说“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源,这个时候cpu可以干别的事情,至于数据的复制次数只能降低,而不会减少到0(后面会用例子说明)。
到这里第一个错误说法就更正了:零拷贝不是指0次复制而是指0次调用CPU消耗资源。
2.2、错误说法二:DMA技术诞生后,零拷贝基于DMA,实现了绝对的零复制…
首先这个观点直白来讲并没有错误,零拷贝技术确实基于DMA才能实现。但是很多文章讲零拷贝都会先讲传统的文件输入输出,然后引出DMA,最后得出类似的结论。有两个容易让人弄混的点需要强调一下:
- 即使是传统的read和write也会用到DMA,DMA并不神秘;
- 和错误说法一一样,零拷贝不是0次复制。
三、并不神秘的DMA
DMA全称是Direct Memory Access,也就是直接存储器访问。它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。通俗点理解,就是让硬件可以跳过CPU的调度,直接访问主内存。
比如我们常见的磁盘控制器、显卡、网卡、声卡都是支持DMA的,可以说DMA已经彻底融入我们的计算机世界了。