muduo学习(一):EventLoop与EventLoopThread

这段时间都在学习muduo网络库,这里整理一下这段时间的学习笔记

一 、Reactor模式:

muduo也是一种基于reactor模式开发的网络库,关于reactor模式网上已经有很多内容,这里不赘述,muduo使用的是主从模式的reactor,即一个mainReactor线程负责监听端口,任何连接的套接字都会被转到subReactor所属的线程中进行处理,暂时还没看到muduo的subReactor中对IO线程与计算线程进行区分处理。

二、EventLoop基础架构:

muduo库最基础的架构就是一个个EventLoop。在使用muduo的多线程服务器中,每个IO线程控制一个EventLoop,处理该线程监听的所有文件套接字的事件。一个Eventloop模式包括三个基础类:EventLoop、Poller、Channel。Poller是EventLoop的成员,包含一个poll或epoll对象。Channel中包含一个对应的文件描述符,用户可以指定该Channel会响应文件描述符的哪些IO事件。EventLoop和Channel是聚合关系,即两者都有指向对方的指针,但EventLoop不负责Channel的生存期管理。

当需要关注一个套接字事件时,用户先在Channel中指定该事件发生时执行的回调,然后Channel会把该事件注册到Eventloop的Poller中进行监听,然后对于该事件的相应流程如下

muduo学习(一):EventLoop与EventLoopThread_第1张图片

在EventLoop中有个循环,会调用Poller的poll或epoll函数,得到哪些监听的套接字有事件发生,然后调用这些套接字对应的Channel的成员函数handleEvent,在函数中调用各个事件对应的用户回调

三、EventLoopThread类:

muduo的核心思想是,每一个IO线程有且仅有一个EventLoop,处理该线程负责的所有文件描述符事件。因此很自然地就有EventLoopThread类,该类提供一个start函数,当主线程调用start函数时,就自动生成了一个新的IO线程及其对应的新EventLoop。

有了这个类之后,就能进一步得到EventLoopThreadPoll类,即一个线程池,一般一个多线程服务器会包含一个线程池,当主线程接到如新的网络套接字连接时,就从线程池中获取一个EventLoopThread,来处理新套接字的IO请求。

你可能感兴趣的:(linux后台开发)