zoukankan      html  css  js  c++  java
  • 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 中写入服务器客户请求的结果
  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/sanerer/p/10704773.html
Copyright © 2011-2022 走看看