开源的魅力

Netty的Timer管理–开源的魅力

隐身守侯 提交于 2019-11-28 12:23:35
这里的Timer,是指定时器,现代操作系统,定时器无处不在,以至于有些将linux kernel的书,都需要单独列出一章,来将linux是如何管理这些定时器的。管理定时器其实主要的步骤有以下3步: 1.生成定时器(这里面最终要的是给予定时器其到期时间以及到期后要产生的动作) 2.将定时器放入一个数据结构中,以便系统能够定时的扫描检查这些定时器是否到期,是否需要触发 3.定期检查定时器是否到期 一般能够想到的最直观的实现定时器的办法,就是在定时器里插入一个绝对时间,然后将定时器放入一个链表,每次轮询时,将该链表整体轮询一遍,从而检查有哪些定时器到期了。那么这样的时间复杂度为:插入定时器 o(1); 每次轮询o(n). 现在的linux内核中,对timer的管理其实是根据timer离当前时间的远近,将其存放到不同的双向队列数组中,每个队列数组长度一样,比如都是2的8次方;(具体是2的几次方,这个还要依赖其他条件,这里只是举个例子)间隔时间小于2的8次方的,存放在第一个双向队列数组里;间隔时间大于等于2的8次方但小于2的16次方的,则存放在第二个双向队列数组里,以此类推; 然后每个2的8次方个周期,对上面的双向队列数组进行重新安排,比如这个时候,需要将第二个数组里的有些队列移动到地一个数组里。这样在实现时,插入定时器o(1),其只需要计算该timer的时间和当前时间的关系