美文网首页
C++ reactor模型与epoll 的源码实现框架

C++ reactor模型与epoll 的源码实现框架

作者: 365_9163 | 来源:发表于2020-07-15 11:39 被阅读0次

    reactor模型:一种事件驱动模型,应用程序不主动调用某个API,而是提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor主动调用程序的接口,这些接口又称为回调函数。

    reactor模型有三个重要的组件:

     多路复用器:由操作系统提供,linux下一般都是select,poll,epoll等系统函数。

     事件分发器:将多路复用器中返回的就绪事件分发到对应的处理函数中。

    事件处理器:负责处理特定事件的处理函数。

    处理流程: 初始化,首先注册读就绪事件和相应的事件处理器,事件分离器等待事件,事件到来,激活分离器,分离器调用事件对应的处理器;

    IO多路复用程序负责监听多个套接字,并向文件时间分发器传送那些产生事件的套接字;

    尽管多个文件事件(网络IO)可能会并发地出现,但是IO多路复用程序总是将所有产生事件的套接字都放在一个队列里面,然后通过这个队列,以有序,同步,每次一个套接字的方式向文件事件分发器传送套接字,当一个套接字产生的事件被处理之后,IO多路复用才会向文件事件分发器传送下一个套接字。

    事件分发器收到IO多路复用传来的套接字,根据套接字产生的事件的类型,调用相应的事件处理器。

    对应源码中逻辑就是:epoll_ctl进行注册与socket相关fd的读事件,epoll_wait等待事件,事件到来,分发器(EPOLLIN&fd)调用相应的函数(EventAccept)。

    reactor优点:

        响应快,不必为单个同步时间阻塞,虽然Reactor是同步的

    编程简单;可扩展性,通过增加Reactor实例充分利用CPU资源。

    可复用性:Reactor框架本身与具体事件处理逻辑无关。

    epoll:具体不再详述,参考其他文档。

    源码分析:实现了Reactor类,负责事件EventHandle的存储,以及多路复用器EventDemultiplex类;

    Reactor类实现了事件的注册删除函数,EventHandle主要实现事件的处理函数,EventDemultiplex实现注册等待事件等功能。

    流程:

     多路复用使用的是epoll,初始化 EventDemultiplex(epoll_create),初始化Reactor(保存epfd,),创建socket,bind,listen等,将listenfd注册到Reactor(map保存)以及EventDemultiplex(epoll_ctl),进行等待客户端事件到来(epoll_wait);

    事件到来后,判断进行分发(accept or recv or send ),accept时重新注册一个新的EventHandle事件(EPOLLIN),recv使用;合适时候注册(EPOLLOUT),send数据使用。

    源码地址:C++封装Reactor与epoll框架

    相关文章

      网友评论

          本文标题:C++ reactor模型与epoll 的源码实现框架

          本文链接:https://www.haomeiwen.com/subject/jthdhktx.html