加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactor模式和Proactor模式

发布时间:2020-12-15 05:18:34 所属栏目:百科 来源:网络整理
导读:最近在研究boost异步io,但是具体原理还是很混乱,现在理清一下思路,对普通函数和reactor模式和proactor模式进行比较 普通函数处理机制: 程序调用接口函数 - 函数执行,程序等待 - 函数执行完将结果和控制权返回给程序 -程序继续执行 下面具体来分析下reac

最近在研究boost异步io,但是具体原理还是很混乱,现在理清一下思路,对普通函数和reactor模式和proactor模式进行比较

普通函数处理机制:

程序调用接口函数 -> 函数执行,程序等待 -> 函数执行完将结果和控制权返回给程序 ->程序继续执行

下面具体来分析下reactor模式和proactor模式

reactor模式(反应堆模式):

reactor模式是事件驱动模式,应用程序不主动调用某个API完成处理,而是应用程序需要提供相应的接口函数(回调函数)并注册接口函数和事件(io/read/write)到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口函数(回调函数)

在Reactor中,事件分离器负责等待文件描述符或socket为读写操作准备就绪,然后将就绪事件传递给对应的处理器,最后由处理器负责完成实际的读写工作。


proactor模式(前摄式模式):

Proactor模式和reactor模式的都是事件驱动的,不同之处在于:

异步情况下(Proactor),当回调handler时,表示IO操作已经完成;同步情况下(Reactor),回调handler时,表示IO设备可以进行某个操作(can read or can write)。

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

以读操作为例:

在Reactor中实现读:

- 注册读就绪事件和相应的事件处理器
- 事件分离器等待事件
- 事件到来,激活分离器,分离器调用事件对应的处理器。
- 事件处理器完成实际的读操作,处理读到的数据,注册新的事件,然后返还控制权。

在Proactor中实现读:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读