1、BIO、NIO、AIO 适用场景了解吗 ?
BI0适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择, 但程序简单易理解。
NI0适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。编程比较复杂,JDK1.4开始支持。
AI0使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
2、BIO、NIO、AIO的区别
1、BIO基于字节流和字符流对数据进行流操作,NIO和AIO基于Channel(通道)和Buffer(缓冲区)对数据
进行块操作,效率比BIO的流操作要高
2、BIO是阻塞的,NIO和AIO是非阻塞的,AIO相较于NIO具有异步特性
3、NIO需要使用选择器监听通道状态,AIO使用异步方法进行通知
3、 Buffer、Channel、Selector的关系
查看 NIO > Buffer、Channel、Selector的关系
4、零拷贝中 MMAP 和 SendFile 的区别
1、mmap适合小数据量读写,sendFile 适合大文件传输
2、mmap需要4次上下文切换,3次数据拷贝; sendFile 需要3次上下文切换,最少2次数据拷贝(Linux2.4优化后减少到2次数据拷贝)
3、sendFile可以利用DMA方式,减少CPU拷贝,mmap则不能(必须从内核拷贝到Socket缓冲区)