libevent 源码学习二 —— reactor 模式
Posted sanerer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了libevent 源码学习二 —— reactor 模式相关的知识,希望对你有一定的参考价值。
1. 简介:Reactor : 反应堆模型, 一种事件驱动方式。 2. 优点 a 响应快,不必为单个同步时间所阻塞。(Reactor 本身是同步的) b 编程相对简单,可以最大程度的避免复杂的多线程和同步问题,避免了多线程/进程的切换开销 c 可扩展性, 可以方便的通过增加Reactor实例个数来充分利用CPU资源 d 可复用性, reactor框架本身与具体事件处理逻辑无关,具有高可复用性 3. 框架 a 事件源:Linux上是文件描述符, windows上是Socket或者Handle。统称为 句柄集;程序在指定的句柄上注册关心的事件,比如 I/O 事件。 b 事件多路分发机制 :由操作系统提供的多路复用机制, select 和 epoll。在libevent中,使用了结构体eventop进行封装,以同意的接口来支持这些I/O多路复用机制。 c 反应器:Reactor 是事件管理的接口,对应到libevent中就是 event_base 结构体 一个典型的Reactor声明: class Reactor{ public: int register_handler(Event_Handler *pHandler, int event); int remove_handler(Event_Handler *pHandler, int event); void handler_events(timeval *ptv); // ... }; d 事件处理程序:提供了一组接口,每个接口对应了一种类型的事件,供Reactor在相应的事件发生时调用,执行对应的事件处理。通常会绑定一个有效的句柄。对应到libevent中就是event结构体 两个典型的事件处理程序 class reactor{ public: virtual void handle_read() = 0; virtual void handle_write() = 0; virtual void handle_timeout() = 0; virtual void handle_close() = 0; virtual HANDLE get_handle() = 0; // ... }; class Event_Handler{ public: // events may be read/write/timeout/close.etc virtual void handle_events(int events) = 0; virtual HANDLE get_handle() = 0; //... }; 4 Rerctor 事件处理流程 a 主线程往 epoll 内核事件表中注册 socket 上的读就绪事件 b 主线程调用 epoll_wait 等待 socket 上的读就绪事件 c 当 socket 上有数据可读时,epoll_wait 通知主线程。主线程则将 socket 可读事件放入请求队列 d 睡眠在请求队列中的某个工作进被唤醒,它从socket读取数据,并处理客户请求,然后往 epoll 内核事件表中注册该 socket 上的写就绪事件 e 主线程调用 epoll_wait 等待 socket 可写 f 当socket 可写时,epoll_wait 通知主线程,主线程则将 socket 可写事件放入请求队列 g 睡眠在请求队列中的某个工作线程被唤醒,它往 socket 中写入服务器客户请求的结果以上是关于libevent 源码学习二 —— reactor 模式的主要内容,如果未能解决你的问题,请参考以下文章