java nio是一种区别BIO的新I/O模型,nio即new I/O。它应该包括我们常说的同步非阻塞模型,以及异步非阻塞模型。
一、nio的三大组件
- channel
一个channel对应一个socket连接,nio相较于bio的一个优点就是,它不用每次对每一个socket连接都新开线程,而使用一个线程完成对所有socket连接的监控,当监控到socket可读、可写才停下来进行读写操作。通道是双向的而流(inputstream outputstream)是单向的,一个channel支持同时读写操作,而一个stream,只能进行读或者写 - buffer
这里buffer实际上就是一个字节数组 - selector
选择器,判断channel的状态写就绪、读就绪、有连接到来,执行相应的事件处理。
二、线程模型的优化
nio模型中,我们可以完全使用一个线程来管理所有的socket io,没有i/o切换,只是拼命的进行读、写、选择事件.但是现在的服务器,一般都是多核处理器,我们可以充分利用多核处理的优势来提升效率
优化:
- 事件分发器:单线程选择就绪的事件,注意,select是阻塞的,无论是通过操作系统的通知(epoll)还是不停的轮询(select,poll),这个函数是阻塞的
- I/O处理器,包括connect、read、write等,这种纯cpu操作,一般开启核心个线程就可以
- 业务线程,业务一般还有自己的业务逻辑,可能包含db操作或者rpc,只要有阻塞就开启线程
三、Reactor与Proactor的模式
nio的模式主要分为两种reactor与proactor。
reactor事件分发器将事件分发给对应的函数进行处理,这个操作是一个同步i/o操作
proactor模式直接发起一个异步的读写操作,而实际的i/o操作由操作系统完成。
网友评论