IO知识Java篇(6) -NIO、异步IO、Reactor、Proactor

本篇主要介绍以下内容:

一 NIO与传统IO的比较

二 Reactor、Proactor设计模式

三 epoll VS select

四 异步IO

 

 一 NIO与传统IO的比较

1 传统的流式IO:所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。

2 ■NIO 与原来的 I/O 有同样的作用和目的,但是它使用不同的方式-块 I/O。

3 NIO可以是非阻塞式的,在选择处阻塞,而把监听IO就绪的操作交给操作系统处理.

4 ■可以将最耗时的 I/O 操作(即使用内存映射技术填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。

 

二 Reactor、Proactor设计模式

 

1 Reactor设计模式(反应堆)

 

(1)该设计模式用于派发/分离IO操作事件的,这里所谓的IO事件也就是诸如read/write 的IO操作,“派发\分离”就是将单独的IO事件通知到上层模块,Reactor基于IO多路复用模型,用于同步IO.在面向对象层次对IO多路复用的功能进行封装,使得应用可以分离不同连接不同事件的处理代码,可以方便地注册与管理socket连接感兴起的事件,让程序员关注于业务逻辑的实现,而不用关心底层的实现细节.

 

(2)涉及角色:

        事件源Handles: 如也就是网络连接,文件句柄等

        事件多路派发/分离器(Event Demultiplexer): 比如select调用。比select更加高效的有linux下的epoll,freebsd下的kqueue以及windows下的iocp(IO Completion port)

        Initiation Dispatcher: 注册、移除和分派事件处理句柄。

        事件处理器(Event Handler)

        就绪事件Event

 

(3)模型


 

原理:

        先需要将就绪事件和相应的事件处理器通过Initiation Dispatcher注册到分离器当中,分离器负责检查对应IO源上是否有对应的IO就绪事件. 当分离器检查到有IO就绪事件时,将来自事件源的I/O就绪事件分离出来并分发到对应的read/write事件处理器,再由事件处理器对该事件做相应的具体工作.

        注意,分离器检查的工作是阻塞式的,将阻塞对应的线程; 事件处理器的IO请求不会导致去等待IO就绪,因为IO已是就绪的,但是IO过程还是会导致请求线程阻塞,因为IO过程仍然涉及到系统调用,系统需要将内核区的数据搬到用户区.

 

2 Proactor设计模式

 (1)原理与Reactor设计模式差不多,只不过分离器检查的工作是I/O完成事件,并且是非阻塞式的,即调用是异步的

(2)实际过程:

处理器发起异步读操作(注意:操作系统必须支持异步IO)。在这种情况下,处理器无视IO就绪事件,它关注的是完成事件。
 - 事件分离器等待操作完成事件
 - 在分离器等待过程中,操作系统利用并行的内核线程执行实际的读操作,并将结果数据存入用户自定义缓冲区,最后通知事件分离器读操作完成。
 - 事件分离器呼唤处理器。
 - 事件处理器处理用户自定义缓冲区中的数据,然后启动一个新的异步操作,并将控制权返回事件分离器。

 

3 两种设计模式的比较与联系

        将Reactor原来位于事件处理器内的read/write操作移至分离器(不妨将这个思路称为“模拟异步”),以此寻求将Reactor多路同步IO转化为模拟异步IO。

 

三 epoll VS select 

 

1 select工作方式:

(1)返回的活跃连接 ==select(全部待监控的连接)

(2)传统的select/poll每次调用都会线性扫描全部的集合,导致效率呈现线性下降。

 

2 epoll工作方式:

(1)epoll只会对“活跃”的socket进行操作(选取感兴趣的事件对应的连接),这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数,其他idle状态socket则不会,在这点上,epoll实现了一个"伪"AIO,因为这时候推动力在os内核。

 

(2)也就是说,epoll借助内核活跃FD的回调方式,避免了对不活跃FD的检测,从而避免了cpu资源在这方面的浪费

 

3 性能比较:

        在FD数量在1k及1k以下时,使用select方式,在FD数量很大但活跃数量相对较少时,使用epoll方式,当FD数量与活跃数量相当时,还是使用select方式

 

四 异步IO

(1)jdk7 推出了 NIO2.0, 而 NIO2.0 引入了 AIO

(2)非阻塞nio框架的设计是采用Reactor模式,而异步IO设计属于Proactor设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值