[C/C++]定时器相关

【计算机定时器相关】timer定时器的底层实现逻辑:时间轮。
在linux内部,如何得到时间节奏的呢?答案是高精度的硬件,如果有一个硬件能够保证每次过一个绝对固定的时间,一模一样的时间,触发一次中断(tick),那么其实计算机就能够实现基于这个中断作为最高精度的定时器了。所以定时器的实现实际上还是依赖于硬件。另外,linux中有几种定时器的必须实现的场景:

  • ①tick:有些tick间隔内必须要去做的事情;
  • ②获得当前的时间,这个也是很多应用层的软件的需要的,但是tick硬件怎么能够转成当前的时间呢?答案是不能够,因此还需要一个专门的硬件,这个硬件就像一个时钟一样,可以从中IO读取当前的时间,可以理解为他是一个精度恒为1秒的tick,只要输入一次当前的时间,并且他右后电,不管你计算机是开机状态还是关机状态,这个硬件恒定的运行,因此开机后,任意的时间,只需要进行一次IO就可以读取到当前的年与日时分秒的时间,但是linux并没有每次都去读取这个硬件,而是开机之后读取一次,存储在xtime结构的全局变量中,然后后面每次tick中断对这个值进行累加操作,因为IO本身耗费太多的时间,如果操作频繁,读出来的时间可能不准确了。
  • ③定时器的实现原理:时间轮算法,这里的时间可以理解我tick时间,因为知道tick时间,一定可以换算成年月日时间,而通常的定时器,都是针对一个时间段,所以用tick更加合理,一开始的想法当然是维护一个定时器的链表(因为定时器可能会数量越来越多,用链表比较好),然后将多久过期填好,挂载到链表上面,然后通过每次tick中断的时候,去遍历这个链表,看看有没有到期的,有的话,就触发对应的处理函数即可(可能是触发一个对应的中断或者新启动一个线程)显然这种方式在定时器越来越多之后,往往可能会导致效率底下,少量的问题不大,如果每次插入进行一些排序,那么这个其实也要海飞不少的时间段的,因此有了是时间轮算法:时间轮盘其实和我们的时钟运行很类似,就是60妙一圈,嘉定tick的间隔正好是1妙,那么每次秒针数组前进一格,并检查是否有挂载timer,如果有,就执行超时处理,当然,有些时候,我们定时器可能比较大的,比如一个小时,那么也简单,再维护一个分钟的数组和一个小时的数组,这样3个数组,每次60秒走完一圈,维护一下小时的数组、维护一下分钟的数组,其实就是时钟运行的逻辑,并且维护的同时看对应的数组是否挂载了timer,如果挂载了,并且也不是秒数组,那么就将timer往下一级进行一次挂载即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章