Java IO

五、BIO、NIO、AIO面试题

2018-10-10  本文已影响18人  城市里永远的学习者

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

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

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

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

五.五种IO模型

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

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

八、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
上一篇下一篇

猜你喜欢

热点阅读