libevent源码解析(七)reactor模式及proactor模式

一.前言

  在看了一部分源码之后,对reactor模式和proactor有了更详尽的了解。记录在此。网上关于这两个不同的模式有一个很经典的例子:去打印店打印材料人太多了需要排队,老板提供两种服务,一种是排队到你的时候通知你,然后你去选择如何打印,打印什么东西;另一种则是提前告诉老板要如何打印,打印什么东西,老板帮你打印好了再通知你。这两种都是异步的经典方式,可以最大程度的提高效率,至于谁优谁劣,只能说用的好的会更优了。

二.libevent和reactor

  Reactor即“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。

  libevent的事件可分为将定时事件,信号处理,I/O 事件,并可以根据当前系统采用的IO复用技术,选择select,poll,epoll,iocp等。通过注册事件以及事件的回调函数,可以实现异步复用。当事件发生时,调用回调函数,完成我们需要执行的功能。

三.proactor

  从上面 Reactor 模式中,发现服务端数据的接收和发送都占用了用户状态(还有一种内核态),这样服务器的处理操作就在数据的读写上阻塞花费了时间,节省这些时间的办法是借助操作系统的异步读写;异步读写在调用的时候可以传递回调函数或者回送信号,当异步操作完毕,内核会自动调用回调函数或者发送信号。Proactor 就是这么做的,所以很依赖操作系统。

  Proactor 的实现主要有三个部分

  • 异步操作处理器,很依赖操作系统的异步处理机制,如若操作系统没有实现,我们可以自行模拟,即开专门的数据读写线程,数据读写完毕触发相应的时间(如果有注册的话);
  • Proactor,会接收异步操作的提醒,调用相应的事件处理函数,它有自己的 event loop;
  • 事件处理函数,事件触发,执行操作;

四.总结

  本文非常粗略的总结了一下reactor和proactor。想要更深入的了解可能还要抽空去看看大神关于proactor和reactor的论文,链接在此。有空的话我也会试着去翻译再补充本文。

猜你喜欢

转载自blog.csdn.net/u013354486/article/details/81265519