Libevent源码分析(一)——Reactor模式 - Go语言中文社区

Libevent源码分析(一)——Reactor模式


前言

Libevent 本身就是一个Reactor,所以在分析Libevent之前,搞清楚Reactor是什么就非常重要了。

Reactor的事件处理机制

在服务器这一类事件驱动的应用中,如果不采取一定的策略,就必须时刻准备着处理多个同时到来的请求,那么就会浪费Cpu资源。那么我们应该怎么做才能良好的解决这一问题呢?答案就是采用事件驱动。
我的理解就是:**程序并不需要一直轮询有没有待处理的消息,而是通过操作系统,在有需要程序处理的事件发生时,你来通知我,我再去处理。一句话总结就是:有问题联系我解决,我才不管你什么时候有问题!**这就是Reactor的核心思想,普通程序的执行过程:程序调用某函数->函数执行,程序等待->函数将
结果和控制权返回给程序->程序继续处理。

优点
  1. 提高系统的可测量性和反应时间,应用程序不能长时间阻塞在某个事件源上而 停止对其他事件的处理,这样会严重降低对客户端的响应度。
  2. 提高吞吐量,任 何没有必要的上下文切换、同步和CPU之间的数据移动都要避免。
  3. 引进新的服务或 改良已有的服务都要对既有的事件分离和调度机制带来尽可能小的影响。
  4. 应用程序代码可以隐藏在多线程和多进程之后。
结构

在Reactor模式中有5个关键的参与者组成:

  1. 描述符(handle):由操作系统提供,在Linux下是文件描述符,在Windows下是Socket或者handle也就是“句柄”,每一个handle对应一个事件,你可以把它理解为,操作系统和应用程序之间操作一个事件的桥梁。
  2. 同步事件分离器 (demultiplexer),这是官方的名称,这个到底是什么呢?其实就是一个函数,它是用来等待一个或多个事件发生的函数,可以是select,epoll,poll等,libevent为我们提供了这个统一的接口去实现了I/O多路转接技术。
  3. 事件处理器接口(event handler):这个是由一个或多个模板函数组成的,是处理事件的接口,它会绑定一个有效的句柄,也就是说会绑定一个事件。
  4. 具体事件处理器函数(event handler):就是事件处理器接口的实现,实现了应用程序的某一个服务,当事件发生时,对应的处理机制。
  5. Reactor 管理器(reactor):这是Reactor模式的核心,也就是libevent的核心,它是专门负责调度、应用
    程序的注册、删除事件处理器和相关描述符。对应于Libevent中就是event_base结构体。
    下面给出一张图帮助大家理解Reactor模式:
    在这里插入图片描述

总结:

上面就是我对Reactor反应堆模式,可能有所错误,欢迎指导与讨论,但是我想用最简洁易懂的语言和图片的方式告诉大家,慢慢学习吧,后面继续一起学习,加油。

愿每一个程序员都能被温柔相待

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Dachao0707/article/details/103468289
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢