对比高性能I/O设计模式-Reactor/Proactor
通常,I/O复用机制都需要事件分享器。分享器对象可将来自事件源的I/O事件分离出来,并分发到对应的Read/Write事件处理器。开发人员预先注册需要处理的事件及该事件对应的事件处理器。 在Reactor模式中,事件分离器等待某个事件或者某个操作的状态发生,比如文件描述符可读写或是socket可读写,事件分离器就将这个时间传给事先注册的事件处理器(事件处理函数或者回调函数),由后者来做实际的读写操作。 而在Proactor模式中,事件处理器直接发起一个异步读写操作,发起时,需要提供用于存放读到数据的缓存区、读的数据大小。以及这个请求完成后的回调函数等信息。事件分离器收到请求后,默默等待这个请求的完成,然后转发完成事件给对应的事件处理器。这种异步模式的典型实现是基于操作系统底层异步API的,所以我们可以称之为“系统级别”的或者“真正意义上”的异步,因为具体的读写操作是由操作系统来代劳的。 我们用读操作来举例,更好的理解Reactor和Proactor两种模式的区别。
Proactor(系统级别异步):
然而,并不是所有的操作系统都为底层异步提供健壮的支持,比如许多Unix系统。 正如上面所提到过的,真正的异步模式需要操作系统级别的支持。由于事件处理者及操作系统交互的差异,为Reactor何Proactor设计一种通用统一的外部接口是非常困难的。因此,大多网络库或是开发框架都是在两种模式之一,唯一一个包含两者的ACE,也是为Window准备了ACE Proactor、为Unix系列提供了ACE Reactor,并且两者的代码分别独立维护。 为了解决这个情况,我们可以将Reactor稍做调整,模拟成异步的Proactor模型(主要是在事件分离器里完成本该事件处理者做的实际读写工作,我们称这种方法为“模拟异步”)。 Proactor(模拟异步):
我们看到,通过为分离者添加一些功能,就可以让Reactor模式转换为Proactor模式。所有这些被执行的操作,其实是和Reactor模式应用时完全一致的。我们只是把工作打散分配给不同的角色去完成而已。这样并不会有额外的开销,也不会有性能的损失。 Reactor:
Proactor:
在没有底层异步I/O API支持的操作系统,这种方法可以帮我们隐藏掉socket接口的差异,提供一个完全可用并且统一的“异步接口”。这样我们就可以开发真正平台独立的通用接口了。 参考博客: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |