muduo源码学习(一):Reactor模式与muduo

Reactor模式

reactor模式一共有5种角色构成:

  1. Handle(句柄或者描述符) : 本质上是一种资源,由操作系统提供。因为再windows中我们叫句柄handle,在linux中我们可以认为就是描述符。作为一个事件代号。举例说,网络编程中的socket描述符。事件既可以来自于外部(如:客户端的连接请求,客户端的发送的数据可读事件),也可以来自于内部(操作系统产生的定时器事件等)。它本质上是一个文件描述符,Handle是事件产生的发源地。(muduo中对应于socketfd或者timerfd,eventfd等)
  2. Synchronous Event Demultiplexer(同步事件分离器) :它本身是一个系统调用,用于等待事件的发生(事件可能是一个,也可能是多个) 。调用方在调用它的时候会被阻塞,一直阻塞到同步事件分离器上有事件产生为止。对于Linux来说,同步事件分离器指的就是常用的I/O多路复用机制,比如说select、poll、epoll等。在muduo中实现了poll和epoll两种方式,分别是pollpoller和epollpoller。
  3. Event Handler(事件处理器):本身由多个回调方法组成,这些回调方法构成了与应用相关的对于某个事件的反馈机制。在muduo中就是TcpServer TcpClient等;
  4. Concrete Event Handler(具体事件处理器):是事件处理器的具体实现。它本身实现了事件处理器所提供的各个回调方法,从而实现了特定的业务逻辑,它本质上就是我们所编写的一个个的处理器实现。在muduo中就是Tcpconnection Acceptor Connector等
  5. Initiation Dispatcher(初始分发器):实际上就是Reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式,同时又提供了应用事件进行事件处理器的注册、删除等设施。在muduo中,初始分发器可以认为是一个eventloop,一个线程只有一个eventloop,同时一个loop里面调用一个poll或者epoll,另外也做了一些别的功能,比如注册,删除channel(一个事件)。

在很多讲Reactor模式的文章里面都会提到如下一张图
这是一副什么图
对比到muduo中,作者也提供了一幅图

在这里插入图片描述
1.一个线程拥有一个EventLoop,用户调用loop启动线程中的主循环,可以调用runAfter,runAt等函数指定某个时间点执行某个任务(回调函数)。然后loop里面会调用poll/epoll
2.Channel与文件描述符是一一对应的,内含该fd对应的关系事件组与活动事件组。是一个负责注册和响应IO事件,它并不拥有事件描述符,也就是并不管理它的生存期。实际上eventloop是通过channel和事件联系起来的,通过注册,更新,删除channel来实现事件的管理。如果要注册一个事件,过程就是,再channel中将要关心的事件加入关心事件组,channel调用update函数发起更新动作,从而调用eventloop的updatechannel,进而调用poller的updatechannel从而在pollpoller中加入到lpollfds_中。

事件处理的时序图

在这里插入图片描述
这个作者提供了一张事件处理的时序图,代码中的调用流程就是,先是,loop中调用poll,poll返回活动事件组,就是活动通道组,activechannel;然后在loop中,对每个activechannels进行遍历,并调用相应的事件处理函数:

    for (Channel* channel : activeChannels_)//依次调用handleEvent回调
    {
      currentActiveChannel_ = channel;
      currentActiveChannel_->handleEvent(pollReturnTime_);//执行回调函数
    }

然后就是 channel->handleEvent ⇒ ****callbacks_ 用户注册的回调函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值