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解耦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章