什么是零拷贝
要了解零拷贝,首先要知道,用户空间和内核空间的区别。
- 我们一般的编写的应用程序(如java程序)都是运行在用户空间上的,安全,但是效率不高
- 内核空间一般给操作系统使用的,不安全,随意操作会搞死系统,但是速度快。
所谓的零拷贝就是指,拷贝不经过用户空间,从一个内核空间内存,到另外一个内核空间内存
传统的拷贝是什么样子的
一共经历了4次拷贝
升级后的零拷贝是什么样子的
SendFile实际上是操作系统暴露出来的,让应用程序操作内核内存的一个函数。通过这个函数可以直接操作内核内存的拷贝,
由此可见采用sendfile函数后,数据一共进行了3次拷贝。
所有所谓的零拷贝,并不是一次都不拷贝,而是,让数据不经过用户空间,直接内核空间操作。
有没有比SendFile更好的方式
通过mmap实现零拷贝
其实就是内存映射,放到java中,就是采用堆外内存。