200行代码解读Github冠军项目背后的定时器

640?wx_fmt=jpeg


作者 | 马超,CSDN博客专家,金融科技从业者 来源 | CSDN博客

最近几周笔者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章(https://blog.csdn.net/BEYONDMA/article/details/97495298和https://blog.csdn.net/BEYONDMA/article/details/96578186)出人意料的引起了巨大的反响,原以为C语言已经是昨日黄花,不过从读者的留言来看,C语言还是老当益壮,依旧有着巨大的影响力,笔者就以此为契机不断向陶老师请教,这次再给大家带来TdEngine计时器的代码解读。

其主要源码地址如下:

https://github.com/taosdata/TDengine/blob/master/src/util/src/ttimer.c

TDEngine为何要自己实现Timer

其实一开始在读到这段代码时笔者也有类似的疑问,因为操作系统的内核基本都实现了定时器的功能,可以直接调用,但是深入思考一下就会发现由于TdEginge本身是个时序数据库的应用,而由于数据库的特殊性,其对库底层的需求其实与操作系统的内核需求类似,我们知道直接调用操作系统的timer需要在到时后启动一个对应的线程去处理对应的中断请求,而这对于TdEginge这种动辙需要上万个定时器的数据库应用来说无疑是一笔巨大的开销,这显然不是陶老师这种极端要求效率的程序员能够接受的。所以TDEngine的定时器的基本思路是基于操作系统的timer,来封装自身的定时器功能,使所有的timer控制器运行在一个线程池,而在同一timer控制器下的timer则运行在同一线程内以此来达到节约资源的目的。

TDEngine Timer的基本工作原理

简单来说TDEngine Timer的工作流程如下:

一.Timer初始化

主要完成以下工作:

1.初始化Timer线程池

2.启动操作系统的Timer,并注册处理timer循环处理函数taosTimerLoopFunc。

二.Timer启动

1.计算当前需要启动timer的调起序列号(index),即taosTimerLoopFunc运行在第几个Loop时会调起当前的timer的处理函数。

2.对于调起序列号相同的timer加入双链表tmrList[当前index],其在链表中的位置依据其到期时间的先后排序,注:(由于之前启动的操作系统timer也是有循环周期的,所以TDEngine timer也可能不是要在当前周期内调起。所以调起序列号相同,但是调起周期运可能有前后次序,其在链表中的位置其实是要买调起周期的先后排序的。)

工作过程图示:由于作者美工基础较差,所以虽然花了很久但是下图的效果其实一般,请大家能够直观感受即可。

640?wx_fmt=gif 简要的讲,taosTimerLoopFunc函数循环处理tmrList,并将当前启动序列号对应的tmrList交由taosTmrProcessList处理,taosTmrProcessList调用处在当前启动序列号(index)且处在当前循环序列号(cycle)的timer的回调(handler)函数。

结合代码的解读

1.初始化函数的解读,具体代码及注释如下:

 
 

2.模块初化函数:我们看到在初始化函数中调用了模块初始化函数进行线程池及操作系统定时器的启动处理,其具体代码及注释如下:

 
 3.timer启动函数 
 
 
 可能各位读者也被以上代码中的pobj,cnode,pnode搞的晕头转向,下面我们以3个timer为例,假如他们的index和cycle都相同,那么他们分别调用完taosTmrStart之后tmrList会是什么情况,可以参考下表。 
 

640?wx_fmt=png

4.loopFunc和taosTmrProcessList 具体代码及注释如下:
最后我也想留一个开放性问题,也就是tmrList使用双链表实现的最大好处是什么,能否使用单链表实现?欢迎读者留言说出你的看法。

原文链接:

https://blog.csdn.net/BEYONDMA/article/details/98473143


(*本文为 Python大本营转载文章,转载请联系原作者


社群福利

扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周 一、三、五更新技术福利,还有不定期的抽奖活动~ 640?wx_fmt=jpeg



AI 开发者大会「七夕」特价


2019 AI开发者大会重磅嘉宾更新: 阿里、华为、Google Brain、Amazon、微软中国、百度、京东、小米、快手、科大讯飞、商汤、旷视、图森、云知声、思必驰... “硬核AI技术大会,一年参加一次就够了”。
虽然是「七夕」 活动,没有男(女)朋友可以参加吗? 当然可以啦,性别不限,两人组队购票,即享优惠~
640?wx_fmt=png 推荐阅读:


640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值