定时器的几种实现

本文探讨了服务器编程中的定时器实现,包括Linux中alarm和setitimer函数的使用,以及不同类型的定时器实现,如双向链表、排序双向链表、最小堆和红黑树。特别强调了每种实现的插入、删除和触发操作的时间复杂度,并引用了相关参考资料。
摘要由CSDN通过智能技术生成

前言

此篇文章为自己总结,若有错麻烦指出,感谢

引言

服务器编程中一块是定时器,影响着服务器性能

定时器一个作用是用于定时检测客户端连接,并踢掉非活动连接;

定时器一般会把定时事件封装成定时器,并进行组织以方便管理

计时

在linux中,一般由<unistd.h>文件下的alarm函数和setitimer来设置定时器,到时间则发出SIGALARM,并调用指定的到期信号处理函数,

signal(SIGALRM, handler);函数来设置到期事件处理函数,而这个到期事件处理函数在游双的书例子里可以看到,是定时器类里的tick函数,即每隔一个周期调用tick()一次,注意要区分timer到期的回调函数和SIGALARM的回调函数

封装timer

在服务器编程里,要处理定时事件,会封装个定时器timer类,其中一般会包含到期时间和回调函数,如muduo中timer.h的实现,和l游双书中的定时器那一章的种种例子,并根据不同实现方式增加额外的数据如链表的节点

而定时器应该给出的用户接口有注册定时器,注销定时器;注册定时器应增加区分重复定时器和一次性定时器

还应该给出定期触发的函数,即上面提到的tick(),在tick函数里判断timer里哪些是已经过期的,触发定时事件,根据定时器是否是重复的删除或者重新设置此定时器

定时器实现类型

定时器会用到什么操作呢?它的插入,指定注销,注销到期的定时器,根据这几点看一下如何设计定时器,ps.注意区分指定注销和注销到期,因为以下的实现大多是已经排序好的,注销到期的一般是从头开始往下找,而指定注销是注销当中某个节点的定时器

先说明libevent中的实现是最小堆,muduo是采用了红黑树来实现,以下列出几种类型的定时器实现

最简单的实现:双向链表

直接利用链表实现,每一个定时器作为一个链表的节点,这样做最直观,而几种操作的复杂度是:

添加的时候就直接插入到链表末端,时间复杂度O(1)<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值