NIO 与 零拷贝
零拷贝基本介绍
零拷贝是网络编程的关键, 很多性能优化都离不开
在Java程序中, 常用的零拷贝有mmap(内存映射) 和 sendFile....直接内存拷贝( 不使用CPU )
mmap 优化
mmap 通过内存映射, 将文件映射到内核缓冲区,同时 用户空间可以共享内核空间的数据, 这样,在进行网络传输时, 就可以减少内核空间到用户空间的拷贝次数...,同时, 由于和用户态完全无关, 就减少了一次上下文切换
示意图和小结
提示: 零拷贝从操作系统角度, 是没有CPU拷贝的
Linux 在2.4 版本中, 做了一些修改, 避免了从内核缓冲区拷贝到SocketBuffer...需要4次上下文切换, 3次数据拷贝; sendFile 需要3次上下文切换, 最少2次数据拷贝
sendFile可以利用DMA方式, 减少CPU拷贝, mmap则不能(必须从内核拷贝到Socket缓冲区...,常用到两种模式:Reactor 和 Proactor, Java 的NIO就是Reactor,,当有事件触发时,服务器端得到通知进行相应的处理
AIO 即NIO2.0, 叫异步非阻塞IO, AIO引入异步通道的概念