一个典型reactor网络模型实现

这些天一直在研究网络编程源码,发现很多开源项目都用到了reactor网络模式,例如libevent,skynet,muduo等等。现在对reactor模式也有了一定的认识。

Reactor模式是编写高性能网络服务器的必备技术之一,它具有如下的优点:
1)响应快,不必为单个同步时间所阻塞,虽然Reactor本身依然是同步的;
2)编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销;
3)可扩展性,可以方便的通过增加Reactor实例个数来充分利用CPU资源;

4)可复用性,reactor框架本身与具体事件处理逻辑无关,具有很高的复用性;

使用Reactor模型,必备的几个组件:事件源、Reactor框架、多路复用机制和事件处理程序,先来看看Reactor模型的整体框架,接下来再对每个组件做逐一说明。

1) 事件源

Linux上是文件描述符,Windows上就是Socket或者Handle了,这里统一称为“句柄集”;程序在指定的句柄上注册关心的事件,比如I/O事件。

2) event demultiplexer——事件多路分发机制

由操作系统提供的I/O多路复用机制,比如select和epoll。程序首先将其关心的句柄(事件源)及其事件注册到event demultiplexer上;

当有事件到达时,event demultiplexer会发出通知“在已经注册的句柄集中,一个或多个句柄的事件已经就绪”;程序收到通知后,就可以在非阻塞的情况下对事件进行处理了。

3) Reactor——反应器

扫描二维码关注公众号,回复: 2541100 查看本文章

Reactor,是事件管理的接口,内部使用event demultiplexer注册、注销事件;并运行事件循环,当有事件进入“就绪”状态时,调用注册事件的回调函数处理事件。

一个典型的Reactor声明方式如下:

class Reactor  {
public:
    Reactor()  {}
    ~Reactor(){}

    int RegisterHandler(EventHandler* handler, int event);

    int RemoveHandler(EventHandler*);

    void HandleEvents();
private:
    EventDemultiplexer*  m_demultiplexer;
};

4) Event Handler——事件处理程序

事件处理程序提供了一组接口,每个接口对应了一种类型的事件,供Reactor在相应的事件发生时调用,执行相应的事件处理。通常它会绑定一个有效的句柄。

下面是典型的Event Handler类声明方式:

class EventHandler  {
public:
    virtual void HandleRead() = 0;
    virtual void HandleWrite() = 0 ;
    virtual void HandleError() = 0;
   
};

下面是完整的实现:

https://github.com/shonm520/my-reactor

由于休陪产假在家,没有办公环境,macbook又不支持linux epoll,家里网络又不给力,费了好大力气下载了vbox,安装Linux虚拟机,整个环境搭建好都到半夜了。macbook写代码调代码还真是没有公司台式机,双显示器方便,第二天也花了很多时间才调通bug,上传至git,记录下。

猜你喜欢

转载自blog.csdn.net/zxm342698145/article/details/81073517
今日推荐