我们的游戏后端一直以来用的都是libev,之前尝试过去读源码,因为里面用了大量宏和自己也不够耐心的原因,一直没有看懂。这次终于痛下决心,一定要啃下它,于是在这个星期调整自己的工作学习方式(在读源码的过程也发现平时一些不利于学习的习惯),结合别人的文章与源码,终于看懂了它的脉络,然后解答了一些困惑我已久的问题,其它的细节部分再看就相对简单了。

  libev是一个事件驱动库,可用select, poll, epoll等做为底层支持。关于如何选择的目前还不是很清楚,只知道它是根据对应宏是否定义来做出选择。比如epoll就要看EV_USE_EPOLL这个宏是否定义,但是EV_USE_EPOLL又依赖于宏HAVE_EPOLL_CTL和宏HAVE_SYS_EPOLL_H是否定义,这两个宏的位置我还没找到在哪里设置的,目前猜测是在生成makefile时通过检测系统环境动态生成。经过实验也知道了在linux下,libev默认使用的是epoll。

  这里说下libev的主循环,libev的主循环在函数ev_run中,大致的流程是

  检测是否有新事件加入或者老事件修改 ---> 有就通过底层调用epoll_ctl进行设置,没有则进入下一步 ---> 计算epoll_wait的time_out时间(其实里面还有个io_block时间貌似会先sleep,因为暂时涉及不到就先不关注) ---> 调用epoll_wait-->阻塞结束,处理所有发生的事件,然后回到第一步

  在知道libev的底层在linux下是使用epoll以后,对于文件描述符的读写事件的实现,其实也就大概猜得到了。一直困惑于我的是libev的记时器是如何实现的,这里详细记录一下。

  在libev中计时器的结构体是ev_timer,里面有两个比较重要的变量是after和repeat。after是指这个计时器第一次是多久之后触发;repeat是指第一次触发之后,多长周期再次触发。把定时器的回调、after、repeat设置好之后,就可以调用ev_timer_start开启计时器。libev对于一个ev_loop会维护一个包含所有计时器的最小堆,将距离此刻最近的计时器放在堆顶。在调用epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout)函数之前,算出timeout = 计时器堆顶元素到期时刻 - 当前时刻,这样一来就实现了计时器的功能。计时器触发之后会根据是否存在repeat重新设置最小堆,如存在则修改触发时间并调整最小堆,如不存在则调用ev_timer_stop。

  在了解了上面的知识后,我想到了一个问题,那要是在epoll_wait的阻塞期间我想加入一个新的ev_io或者ev_timer怎么办呢?按照上面的实现的实现方式是不可能实时检测到的。实际上这就是我想岔了,既然是事件驱动,那么在阻塞期间就说明没有事件发生,没有事件发生又怎么可能会产生新ev_io或ev_timer呢?哈哈哈哈,我老是会想到这些个奇怪的问题。

  当然看源码到现在,了解的肯定不只这么点,这里只记录了点我个人的问题。如果要把libev的整个框架说完那么估计要写很长了。我也还没有看完,继续努力,继续学习。

  最后附上我看源码时结合的文章链接:https://blog.csdn.net/drdairen/article/details/53785447

libev个人问题解惑的更多相关文章

  1. [译]libev和libevent的设计差异

    本文译自what's the difference between libev and libevent? 作者是libev作者 [问]两个库都是为异步io调度而设计,在Linux上都是使用epoll ...

  2. CentOS 6.6安装Xtrabackup RPM提示缺少libev.so.4()

    在CentOS Release 6.6安装percona-xtrabackup-2.3.4时,遇到下面错误信息 rpm -ivh percona-xtrabackup-2.3.4-1.el6.x86_ ...

  3. libev学习(一)

    一.libev简介 Libev是一个事件循环:你注册感兴趣的特定事件(比如一个文件可以读取时或者发生超时时),它将管理这些事件源,将这些事件反馈给你的程序.为了实现这些,至少要在你的进程(或线程)中执 ...

  4. libev安装与示例程序编译运行

    Linux平台C网络编程,之前总是看各大名著(如UNIX环境高级编程和UNIX网络编程,还有TCP/IP详解 卷1:协议和深入理解计算机系统(原书第2版)),同时写点小程序练习.然而还是拿不出手. 参 ...

  5. 001.libev安装及eclipse下添加libev库链接

    libev库安装: 1.下载页面:http://dist.schmorp.de/libev/ 当前版本下载: [root@mid_server ~]# cd /usr/local/src  [root ...

  6. [C#解惑] #2 对象的初始化顺序

    谜题 在上一篇C#解惑中,我们提到了对象的初始化顺序.当我们创建一个子类的实例时,总是会先执行基类的构造函数,然后再执行子类的构造函数.那么实例字段是什么时候初始化的呢?静态构造函数和静态字段呢?今天 ...

  7. [C#解惑] #1 在构造函数内调用虚方法

    谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...

  8. Python 包管理工具解惑

    Python 包管理工具解惑 本文链接:http://zengrong.net/post/2169.htm python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到 ...

  9. 《浅谈磁盘控制器驱动》,磁盘控制器驱动答疑解惑![2012.1.29完结]by skyfree

    <浅谈磁盘控制器驱动>,磁盘控制器驱动答疑解惑![2012.1.29完结]  https://www.itiankong.net/thread-178655-1-1.html Skyfre ...

随机推荐

  1. webSocket通信

    针对webSocket通信总结: 1.webSocket通信原理图: 2.webSocket通信实例 参考地址1:https://www.cnblogs.com/cjm123/p/9674506.ht ...

  2. redis学习之路

    cp /home/zzq/桌面/M+.txt /home/zzq/mySercet#将桌面文件下的M+.txt 复制到mySercetrm -rf M+.txt#强制递归删除M+.txt1.网络适配器 ...

  3. 浏览器端-W3School-JavaScript:JavaScript String 对象

    ylbtech-浏览器端-W3School-JavaScript:JavaScript String 对象 1.返回顶部 1. JavaScript String 对象 String 对象 Strin ...

  4. Android 中布局的优化措施都有哪些?

    1.尽可能减少布局的嵌套层级可以使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局.2.不用设置不必要的背景,避免过度绘制比如父控件设置了背景色,子控件完 ...

  5. nodejs 之简单web服务器

    1.service.js var http=require('http');//引入http模块 var fs=require('fs');//fs模块 var path=require('path' ...

  6. Python新手最容易犯的十大错误

    1. 忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加“:” if spam == 42 print('Hello!') 2. 误用 “=” 做等值比 ...

  7. vue2创建webpack项目build之后无法正常显示页面的问题

    最近在做vue项目的时候,项目正常运行,但是当我打包上线之后,却出现无法出现页面空白的情况,打开控制台,发现无法加载到css和js文件. 仔细观察发现路径中少了一个dis文件夹,于是我加上dist文件 ...

  8. 【LeetCode】309、最佳买卖股票时机含冷冻期

    Best Time to Buy and Sell Stock with Cooldown 题目等级:Medium 题目描述: Say you have an array for which the ...

  9. 第七周课程总结&实验报考(五)

    第七周课程总结&实验报考(五) 实验四 类的继承 实验目的: 1.理解抽象类与接口的使用: 2.了解包的作用,掌握包的设计方法. 实验要求: 1.掌握使用抽象类的方法. 2.掌握使用系统接口的 ...

  10. [转帖]数据库默认驱动、URL、端口

    超详细的各种数据库默认驱动.URL.端口总结 http://database.51cto.com/art/201906/598043.htm 学习了解一下.  概述 今天主要对各种数据库默认端口和UR ...