计时器总结 第1篇
接口设计是为了让用户方便的使用定时器。最基础的接口有:(1)定时器初始化。(2)添加定时器。(3)删除定时器。示例:
数据结构去组织定时任务的时候,其本质就是按照定时任务的优先级进行组织数据。所谓优先级,就是先触发的定时任务放在最前面。组织方式:
其他数据数据结构:
(2)完全二叉树:若二叉树的深度为h,去掉了h层的节点,就是一个满二叉树;并且h层都集中在最左侧排序。
最小堆是一个完全二叉树;某个节点的值总是小于等于它的子节点 的值;堆中任意一个节点的子数都是最小堆。
最小堆添加节点:为了满足完全二叉树的定义,往二叉树最高层沿着最左侧添加一个节点;然后考虑是否能上升操作。比如往上图的最小堆添加值为 4 的节点,4 节点是 5 节点的左子树;4 比 5 小,4 和 5 需要交换值。
最小堆删除节点:删除操作需要先查找是否包含这个节点;确定存在后,交换最后一个节点,先考虑能否执行下降操作,否则执行上升操作;最后删除最后一个节点。例如:上图中删除 1 号节点,需要下沉操作;
上图删除 9 号节点,需要上升操作;
时间轮是根据时钟运行规律而来的。
原理图:
实现原理:时间精度为1s,时间范围为12H,定义三个指针数组分别指向 秒、分、时;利用一个移动指针一秒钟移动一次,只需关注最近一分钟内要触发的定时任务。
如果要加入超过一分钟的定时任务,需要将指针指向的时间加上需要定时的任务时间对60求余,向下取整。比如要加入72s的定时任务,当前指针指向0,则插入的位置是分钟数组的(0+72)%60=1位置。
也就是说,一分钟以内的任务放在秒针层,大于一分钟小于一小时的定时任务放在分针层级,大于一小时小于12小时的定时任务放在时针层级。
tick的取值范围为时间范围,只需要一个指针记录。因为通过时间可以计算出秒针层的位置、分钟层位置以及小时层的位置;比如121s的秒针是1、分针是2,时针是0。当秒针移动一圈,说明下一分钟的任务快执行了。
(1)减少空间占用。比如要表示12H的数组需要126060=43200个元素大小,分成三层只需要60+60+12=132个元素大小。(2)只需关注最近一分钟内要触发的定时任务。(3)按照任务的轻重缓急进行组织。时间在前的先处理。(4)减少任务的检测。相同时间的定时任务放在一个链表中。
任务节点应该包含定时时间expire、回调函数callback以及任务链表next。任务链表主要解决相同触发时间的定时任务。
添加定时任务时,需要根据time判断将其放在哪一层。然后任务节点中的expire就等于当前的tick加上time,即expire=tick+time。
时间轮的时间进度是秒,只执行秒层的任务,所以需要将快到达的分钟层任务重新映射到秒层。根据tick计算出分钟指针位置【分钟层指针位置=(tick/60)%60】,取出该指针指向槽位的所有任务(任务链表);重新计算时间 time=expire-tick;然后指向添加节点的业务逻辑。
时间轮删除节点不方便,一般节点不能删除,因为tick一直在移动,会出现重新映射,节点位置可能改变。那么可以添加一个标记字段cancel,当任务触发时检查这个字段,如果cancel=true则不执行具体任务。
计时器总结 第2篇
游戏服务器框架,skynet。
skynet使用单reactor,应用于CPU密集型场景;skynet封装有actor的抽象进程,里面有消息对立;skynet有自己的线程池,线程池从actor中取出就绪的定时任务,多线程执行定时任务业务逻辑。
skynet的时间轮采用五层结构,时间精度为10ms(由gettime()函数确定)。每10ms时间指针移动一次。
时间精度:
skynet是在多线程下运行,需要数据操作加锁。skynet对整个结构加锁,但时间轮的时间复杂度为O(1),可以使用自旋锁,在效率上不会产生影响。skynet在添加节点和取出任务时需要加锁。
修改skynet的时间精度可以修改gettime()函数以及usleep(2500)。
红黑树和最小表需要对整个结构加锁。锁的粒度较大。如
跳表粒度很小,基本上是原子操作。数据结构的选择时,少量定时任务的情况下,可以选择红黑树或最小堆;大量定时任务情况下,选择时间轮。操作时间复杂度小,为O(1)时,或者仅需要局部加锁,可以降低锁的粒度。
计时器总结 第3篇
【例题1】( 2008 年安徽卷第 23 题, 14 分 )已知 O、A、B、C 为同一直线上的四点, AB 间的距离为 l_1 , BC 间的距离为 l_2 ,一物体自 O 点由静止出发,沿此直线做匀速运动,依次经过 A、B、C 三点,已知物体通过 AB 段与 BC 段所用的时间相等。求滑块 O 与 A 的距离。
【思路】将等时间间隔的分段运动上面的点给看成是打点计时器中纸带上的点,那么打点计时器测量原理中的推论就可以直接使用了。(纸带法)
【解答】如上图所示,既然物体通过 AB 段与 BC 段所用的时间相等,那么我们可以运用打点计时器中的测量原理,将 A、B、C 视为一条纸带。根据我们前面推导的【中间点速度】 v_{中}=\frac{s_左+s_右}{t} 、【端点速度】v_端=\frac{3s_邻-s_隔}{2T} 和【加速度】 a=\frac{x_末-x_初}{(末-初)T^2} ,不难计算出 A 点、 B 点和 C 点的瞬时速度以及物体的加速度 a 。
端点 A 点的速度 v_A=\frac{3l_1-l_2}{2T}
中间点 B 点的速度 v_B=\frac{l_1+l_2}{2T}
端点 C 点的速度 v_C=\frac{3l_2-l_1}{2T}
物体的加速度 a=\frac{l_2-l_1}{T^2}
我们假设 OA 的距离为 x ,根据 v_t^2-v_0^2=2ax ,可得 x=\frac{v_t^2-v_0^2}{2a}=\frac{v_A^2-0^2}{2a}=\frac{v_A^2}{2a}=\frac{(\frac{3l_1-l_2}{2T})^2}{2(\frac{l_2-l_1}{T^2})}=\frac{(3l_1-l_2)^2}{8(l_2-l_1)}
茅塞顿开、拨云见日、醍醐灌顶、恍然大悟、沁人心脾、大快人心、痛快淋漓、拍手称快……爽!
【例题2】( 2023· 珠海市第一中学高一期中)某质点由 A 经 B 、 C 到 D 做匀加速直线运动,历时 6 s 。前 2 s 和后 2 s 位移分别为 AB=8 m 和 CD=12 m ,该质点的加速度及经过 B 点的瞬时速度大小分别是( )
A.1 m/s^2,5 m/s
B. m/s^2, m/s
C.1 m/s^2,10 m/s
D. m/s^2,9 m/s
【思路】第一空考察加速度的计算,第二空考察中间点的瞬时速度的计算。 a=\frac{s_3-s_1}{2T^2}=\frac{CD-AB}{2T^2}=\frac{12-8}{2×2^2}= 。根据 \Delta x=aT^2 ,所以 \Delta x=CD-BC=BC-AB ,解得 BC=10m 。 v_B=\frac{s_左+s_右}{2T}=\frac{AB+BC}{2T}\frac{8+10}{2×2}= 。
【答案】 B
【例题3】(多选)( 2022· 濮阳一高高一期中)一个从 A 点出发做匀变速直线运动的物体,在两段连续相等的时间间隔内通过的位移分别是 AB=12 m 和 BC=32 m ,已知连续相等的时间间隔为 2 s ,下列说法正确的是 ( )
A.物体的初速度为 1 m/s
B.物体的加速度为 3 m/s^2
C.物体的初速度为 3 m/s
D.物体的加速度为 5 m/s^2
【思路】本题考察的分别是端点瞬时速度计算公式和加速度计算公式。
v_0=v_端=\frac{3s_邻-s_隔}{2T}=\frac{3AB-BC}{2T}=\frac{3×12-32}{2×2}m/s=1m/s
a=\frac{s_2-s_1}{T^2}=\frac{BC-AB}{T^2}=\frac{32-12}{2^2}m/s=5m/s^2
【答案】 AD
【例4】( 2023· 黄冈中学高一上期中)如图所示,物体自O点由静止开始做匀加速直线运动, A、B、C、D 是轨迹上的四点,测得 AB=4 m , BC=6 m , CD=8 m ,且物体通过 AB、BC、CD 所用时间相等,则 O、A 之间的距离为( )
A.\frac{9}{8}m
B.\frac{9}{4}m
C.\frac{7}{4}m
D.\frac{7}{2}m
v_A^2-0=2ax_{OA} ……①
v_A=\frac{3s_邻-s_隔}{2T}=\frac{3AB-BC}{2T} ……②
a=\frac{s_3-s_1}{2T^2}=\frac{CD-AB}{2T^2} ……③
联立①②③即可解得答案
【答案】 B
【例题】( 2023 年西北大学附中高一期中)如图所示的平潭海峡公铁两用大桥是世界上最长的跨海公铁两用大桥,其中元洪航道桥的三根桥墩分别用 A、B、C 表示,间距分别为 AB=132 m 、 BC=196 m 。一列高速列车匀加速通过元洪航道桥,车头经过 AB 和 BC 的时间分别为 3 s 和 4 s ,则这列高速列车经过元洪航道桥的加速度大小约为( )
A. m/s^2
B. m/s^2
C. m/s^2
D. m/s^2
【思路】依次求出两段的平均速度,再根据匀变速直线运动中的平均速度等于瞬时速度,所以就能得到两段各自的中间时刻速度。那么,加速度就等于速度变化量除以相应的时间。( \bar{v}\rightarrow v_{\frac{t}{2}}\rightarrow a )
【解答】
高速列车在 AB 段的平均速度为 v_1=\frac{AB}{t_1}=44 m/s ,
在 BC 段的平均速度 v_2=\frac{BC}{t_2}=49 m/s ,
根据匀变速直线运动的平均速度 \bar{v} 等于中间时刻的瞬时速度 v_{\frac{t}{2}} ,可知 a=\frac{v_2-v_1}{\frac{t_1}{2}+\frac{t_2}{2}}≈ m/s^2 , B 正确。
计时器总结 第4篇
那么,如何进行协同处理呢?可以利用IO多路复用,“阻塞”收集就绪事件的接口。如上面的示例代码。
(1)redis(单reactor)(2)memcached、nginx(多reactor)
函数调用框图:
具体代码:
定时任务在通过一个单独的线程检测,利用usleep()/sleep()检测触发定时器,定时器事件的处理由其他线程或运行队列执行。这种触发方式通常用于处理大量定时任务。示例:
处理方式:使用时间轮数据结构,在一个线程中利用usleep(time)负责检测(time要小于最小时间精度),时间到达时,通过信号或插入运行队列让其他线程运行业务逻辑;时间轮只负责检测。这种方式加锁粒度小。
计时器总结 第5篇
在的源码中看到Timer的构造方法
关于(isDaemon);Java中线程分为两种类型:用户线程和守护线程。通过(false)设置为用户线程;通过(true)设置为守护线程。如果不设置次属性,默认为用户线程。
用户线程和守护线程的区别:
我们要用到的schedule()方法如下:
另外Timer调用task还有以下方法
两秒钟之后timer_tv_1开始显示当前时间并每一秒更新一次
别忘了在onDestroy()中
计时器总结 第6篇
当物体做直线运动时,其位移在不断地发生变化。物体位移变化得快慢(速度)如何?物体速度变化得快慢(加速度)又如何?要想弄清楚这些问题,就要测量物体运动的时间与位移。时间我们可以用秒表来测量,位移我们可以用刻度尺。但是,当物体速度比较大的时候,单位时间内物体运动的距离很大,掐表我们未必能够掐得准,位移也未必能够准确地定位到,这样的话误差就比较大了。
为了细致地研究物体运动状态的变化,我们需要一个能够记录很短时间间隔的计时工具——打点计时器。打点计时器是一种记录物体运动位移和时间信息的仪器。打点计时器通过在纸带上打出一些列的点来记录物体运动信息。常见的打点计时器有两种,一种是电磁打点计时器,另一种是电火花打点计时器。