栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

(2)muduok库学习-reactor的关键结构

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(2)muduok库学习-reactor的关键结构

reactor的分发机制最重要的三个结构。

一、poller

Poller的存在,是为了监听事件,但具体监听什么事件呢?这就需要用到Channel类。
1、一个Channel对象绑定了一个fd(文件描述符),可以用来监听发生在fd上的事件,事件包括空事件(不监听)、可读事件、写完成事件。

2、当fd上被监听事件就绪时,对应Channel对象就会被Poller放入激活队列(activeChannels_),进而在loop循环中调用封装在Channel的相应回调来处理事件。

3、Channel可以通过EventLoop,向Poller更新自己关心的(监听)事件**(通过map Poller::channels_存储)**。具体来说,对于PollPoller对象,会同步更新(poll(2))传给内核的poll事件数组pollfds_;对于EPollPoller对象,会同步更新(epoll(7))传递给内核的epoll事件数组events_;

可以这样理解,poll/epoll监听的是fd(上指定的事件pollfd.events),Poller监听的是Channel对象(上指定的事件events_),当监听到事件就绪时,将对应通道加入激活通道队列,在EventLoop的loop循环中依次调用Channel中注册的事件回调。

以下为三者时序图:

二、channel

1、每个channel对象自始至终只属于一个eventloop。即每个channel只属于一个IO线程。
2、每个channel不拥有fd, 它只负责fd的IO事件的分发,也不会在析构的时候关闭fd. channel是由诸如TcpConnection、Acceptor、EventLoop等,这样需要监听指定文件描述符上事件的类,将fd通过构造函数传递给Channel。
3、channel会把不同的IO事件分发成不同的回调,如readcallback,writecallback等。

Channel中的几个重要函数:
1)handleEvent 处理事件
处理激活的Channel事件,由Poller更新激活的Channel列表,EventLoop::loop()根据激活Channel列表,逐个执行Channel中已注册好的相应回调。实际事件处理工作,由handleEventWithGuard完成。
2)handleEventWithGuard 识别事件并回调
根据不同的激活原因,调用不的回调函数。这些回调函数,是在持有Channel对象,需要进行事件监听的class中进行设置,比如TcpConnection,EventLoop,Acceptor,TimerQueue等。而有些回调函数,经过层层传递,会呈现可网络库的调用者,比如TcpConnection会将处理一个socket fd的读事件回调(新建连接请求),传递给TcpServer::newConnection,这样用户就能通过TcpServer::setConnectionCallback设置其回调。
3)update 更新通道
通过EventLoop对象,传递给Poller对象,然后更新其监听的通道列表中对应通道。支持ADD/MOD操作。
4)remove 移除通道
与update类似,也是通过EventLoop传递给Poller对象,将当前通道从Poller的事件列表中删除。支持DEL操作。

三、 eventloop

1、继承于boost::noncopyable,不可拷贝
2、"one loop per thread"每个线程至多有一个eventloop对象,故其构造函数会先检查当前线程是否已经创建了eventloop对象,eventloop对象会记录本对象所属线程id.
3、创建了eventloop对象的线程是IO线程,其功能是运行时间循环Eventloop::loo()
4、Eventloop的static成员函数getEventLoopOfCurrentThread()可能返回为NULL。
5、事件循环必须在IO线程里执行。

附:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/962043.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号