深入理解零拷贝

零拷贝

Posted by TBKK on December 10, 2019

什么是零拷贝

要了解零拷贝,首先要知道,用户空间和内核空间的区别。

  • 我们一般的编写的应用程序(如java程序)都是运行在用户空间上的,安全,但是效率不高
  • 内核空间一般给操作系统使用的,不安全,随意操作会搞死系统,但是速度快。

所谓的零拷贝就是指,拷贝不经过用户空间,从一个内核空间内存,到另外一个内核空间内存

传统的拷贝是什么样子的

image 一共经历了4次拷贝

升级后的零拷贝是什么样子的

image SendFile实际上是操作系统暴露出来的,让应用程序操作内核内存的一个函数。通过这个函数可以直接操作内核内存的拷贝,

由此可见采用sendfile函数后,数据一共进行了3次拷贝。

所有所谓的零拷贝,并不是一次都不拷贝,而是,让数据不经过用户空间,直接内核空间操作。

有没有比SendFile更好的方式

通过mmap实现零拷贝

其实就是内存映射,放到java中,就是采用堆外内存。