reactor io的一种实现

下面是一个reactor模式下的io简单类图:

reactor::run是一个死循环,单独占用一个线程,循环体内容是:
调用load_event(),加载自上次以来变化的事件,函数会调用_dispatch的add_event()和del_event(),将要监听的fd和该fd上关心的事件告知demultiplexer;
调用_dispatch->dispatch()进入wait状态,等待事件发生或超时。

passiveio_event和activeio_event的作用是建立tcp连接,即创建streamio_event对象,然后将其加入reactor。
在已建立的连接上有事件发生时,找到其对应的streamio_event对象,根据是读还是写调用handle_read()或handle_write()。
在handle_read()或handle_write()内部,则委托给session *_ses负责具体的逻辑。

一个session对应一个连接,它的内部可能会有接收和发送缓冲,加解密等一些组件;session_manager组织了多个session,调用session_manager的send时,需要指定一个sid,send会找到对应session,session在做了一些工作后,向reactor添加可以发送的事件,这会唤醒demultiplexer::dispatch(),然后去发送数据。

reactor包含demuliplexer和多个event,但调用demuliplexer::dispatch()时又会把reactor传过去,event内部也有指向reactor的指针,这三个类耦合比较紧密,但好在它们整体对外解耦了。
session内部有指向session_manager的指针,session_manager管理着session,在我看来这样实在不好。在看wdb代码时,page类内部有指向pagecache类的指针,我通过把b树的merge、split等操作从page移到pagecache,使得page类不再需要使用pagecache的方法了,但这里却是不好将session和session_manager解耦。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值