五、BIO、NIO、AIO面试题

一.什么是同步?什么是异步?

二.什么是阻塞?什么是非阻塞?

三.什么是阻塞IO?什么是非阻塞IO?

四.什么是同步IO?什么是异步IO?

五.五种IO模型

六.两种高性能IO设计模式(Reactor和Proactor)

七. java中的BIO、NIO、AIO分别是什么?

  • BIO
    • 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以使用线程池机制改善
    • BIO方式适用于连接数比较小且固定的架构,这种对服务器资源要求较高,JDK1.4以前的唯一选择,但程序直观易懂。
  • NIO
    • 同步非阻塞,服务器实现为一个请求一个线程,即客户端连接的请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。
    • NIO适用于连接数目多且比较短的架构,比如聊天服务器,编程复杂,JDK1.4才开始支持
  • AIO
    • 异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由OS(内核)先完成在通知到服务器应用去启动线程进行处理
    • AIO方式适用于连接数多且连接比较长的架构,比如相册服务器,充分调用OS(内核)来参与并发操作,编程复杂,JDK7才开始支持

八、NIO的了解
将多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下处理多个客户端请求。

NIO三个核心对象:通道(Channel)、缓冲区(Buffer)和选择器(Selector)

具体说就是Selector会不断轮询注册在其上的Channel,如果某个Channel上有新的TCP连接,读或者写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectorKey可以获取就绪Channel的集合,进行后续I/O操作。

NIO单线程轮询事件,找到可以进行读写的网络描述符进行读写。除了事件的轮询是阻塞的(没有可干的事情必须要阻塞),剩余的I/O操作都是纯CPU操作,没有必要开启多线程。并且由于线程的节约,连接数大的时候因为线程切换带来的问题也随之解决,进而为处理海量连接提供了可能。

单线程处理I/O的效率确实非常高,没有线程切换,只是拼命的读、写、选择事件。但现在的服务器,一般都是多核处理器,如果能够利用多核心进行I/O,无疑对效率会有更大的提高。

九、Java Reactor模式 异步非阻塞IO

下图是Reactor的多线程模型

image

其特点如下:

(1)有专门一个NIO线程-Acceptor线程用于监听服务端,接收客户端的TCP连接请求

(2)网络IO操作-读、写等由一个NIO线程池负责,线程池可以采用标准的JDK线程池实现,它包含一个任务队列和N个可用的线程,由这些NIO线程负责消息的读取、解码、编码和发送。

(3)一个NIO线程可以同时处理N条链路,但是一个链路只对应一个NIO线程,防止发生并发操作问题。

下图是主从Reactor的多线程模型。

image

由于单独一个Acceptor线程可能会存在性能不中的问题,所以需要主从Reactor模型。

服务端用于接收客户端的不再是一个单独的NIO线程,而是一个独立的NIO线程池。

十、参考资源:

  1. https://segmentfault.com/a/1190000014932357?utm_source=tag-newest
    2.https://mp.weixin.qq.com/s__biz=MzU4NDQ4MzU5OA==&mid=2247483985&idx=1&sn=38531c2cee7b87f125df7aef41637014&chksm=fd985430caefdd26b0506aa84fc26251877eccba24fac73169a4d6bd1eb5e3fbdf3c3b940261#rd
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容