您的位置:首页 > 其它

Boost.Asio学习之Proactor模式简介

2017-01-05 15:58 337 查看
之前了解过的muduo、Nginx都是Reactor

最近开始学Boost.Asio使用的Proactor模式

(一)Reactor简介

1.1 Reactor模式结构



1.2 Reactor包含如下角色

1.Handle 句柄:用来标识socket连接或是打开文件;

2.Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)

3.Event Handler:事件处理接口

4.Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;

5.Reactor:反应器,定义一个接口,实现以下功能:

1)供应用程序注册和删除关注的事件句柄;

2)运行事件循环;

3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;

(二)Proactor设计模式在Boost.Asio上的实现

2.1 Proactor模式结构



1.Asynchronous Operation

异步操作,例如异步读或者异步写。

2.Asynchronous Operation Processor

异步操作处理器,负责执行异步操作,并且将事件放入完成事件队列。

3.Completion Event Queue

将完成的事件缓冲直到异步事件解复用器从中将事件取出。

4.Completion Handler

完成事件接口,处理异步事件的结果,一般由boost::bind创建的函数对象

5.Asynchronous Event Demultiplexer

阻塞等待事件完成队列中完成事件的发生,并将其返回给其调用者。

6.Proactor

调用Asynchronous Event Demultiplexer,分派与事件相关的处理程序(例如调用函数对象)。io_service就是这个抽象的一种表现形式。

7.Initiator

应用程序中启动异步操作的代码。

2.2 Proactor优点

1.可移植性

可以依赖系统的异步I/O来实现,例如Windows下有实现IOCP。如果系统不支持异步I/O也可以通过同步Reactor来实现

2.并发中解耦线程

通过异步来解决耗时操作,应用程序不必通过增加线程数目来增加并发能力。

3.性能和可扩展性

Thread-per-Connection将降低系统性能,因为它增加了上下文切换、同步和数据转移操作。

4.简化应用程序同步

异步操作完成的回调可以编写在单线程环境中,应用程序的实现几乎可以忽略同步问题。

5.异步函数组合

多个异步操作可以通过链表的形式组合在一个更高层次封装的函数中,用操作完成处理函数来启动下一个异步操作。通过组合成新的操作的方式,支持特定的协议。

2.3 Proactor缺点

设计复杂

占用内存

(三)Proactor与Reactor的对比

简单理解两者的区别:

可以看出,两个模式的相同点,都是对某个IO事件的事件通知(即告诉某个模块,这个 IO操作可以进行或已经完成)。在结构上,两者也有相同点:demultiplexor负责提交IO操作(异步)、查询设备是否可操作(同步),然后当条件满足时,就回调handler;不同点在于,异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下 (Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write)。

使用Proactor框架和Reactor框架都可以极大的简化网络应用的开发,但它们的重点却不同。

Reactor框架中用户定义的操作是在实际操作之前调用的。比如你定义了操作是要 向一个SOCKET写数据,那么当该SOCKET可以接收数据的时候,你的操作就会被调用;而Proactor框架中用户定义的操作是在实际操作之后调用 的。比如你定义了一个操作要显示从SOCKET中读入的数据,那么当读操作完成以后,你的操作才会被调用。

(四)参考

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/overview/core/async.html

https://segmentfault.com/a/1190000002715832

http://speakingbaicai.blog.51cto.com/5667326/1109406
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: