Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

AMPS:定时器管理

$
0
0

  定时器模块是协议服务器的关键组件之一,几乎每个协议软件都设计有超时机制。在多线程的软件中,定时器的最大问题是去除了异步,这使得保护每个会话相关的数据结构变得不可避免。APMS提供了基本的定时器管理API,主要的设计目标如下:

  •  定时器实现必须高效,在定时器相关的任何操作中不应该有查找或排序。且启动、停止、超时处理必须的时间复杂度必须为O(1)。
  •  定时器实现必须可测量,必须支持长时间的超时(至少支持24小时或更长),且占用内存小。
  •  定时器回调函数必须串行调用,以避免维护共享会话相关的数据结构。
  •  定时器必须精确。
  AMPS的定时器实现满足了以上所有目标,下面描述它的设计:
  •   AMPS的定时器模块
  AMPS将定时器视为高优先级的事件,时钟滴答事件每k毫秒产生一次,k为定器模块的最小计时单位,默认为1毫秒。系统中有一个高优先级的线程(优先级高于主循环线程、I/O代理、CPU代理),这个线程休眠k毫秒后,会唤醒并通过IPC机制向主程序发送一个事件,然后继续休眠k毫秒。主程序的事件管理器以高于系统中其他事件的优先级来处理这一个时钟滴答事件。并且处理完任何事件后,它都会检查时钟滴答事件来判断是否此事件处理超过了k毫秒,这种方法可以保证时钟滴答事件不用等待其他事件的处理。并且可以判断系统中有哪些事件处理超过了k毫秒,这样应用程序开发者就可以发现这样的事件处理句柄,并将它拆分成多个小于k毫秒的事件,定时器提供了一个API,允许用户指定一个回调函数以及一个作为参数传入的指针。 
  • 定时器数据结构
  定时器的数据结构包含了按级别划分的数组,每一个表示一个数字时钟的记数器,这与Linux Kernel中的定时器实现概念一样,AMPS中有四个这样的数组,第一个数组表示毫秒,每一个元素代表一个tick或k毫秒,这个数组共有1000/k个元素,这也表示这个数组表示一秒的时间,也暗示了毫秒部分的超时必须是k毫秒的倍数。第二个数组表示秒,有60个元素,表示一分钟的时间。同样地,第三个数组表示分钟,也有60个元素,表示一小时的时间。最后一个数组代表小时,有24个元素,表示一天的时间。
  每个数组的每一个元素是一个由定时器回调函数组成的双链表,每产生一个tick事件,tick事件句柄会遍历当前数组元素所存储的链表,依次调用每一个回调函数,并且将数组下表加1,当毫秒数组达到结尾,事件处理句柄通过当前秒钟数组所在下标的回调函数来填充毫秒数组的所有元素,并且将秒钟数组下表加1,此时秒钟数组元素中的回调函数等等待下一秒到来时更新,事件句柄开始增加秒钟数组,同样,当秒钟数组达到结尾时,事件句柄用当前分钟数组下表所在元素的回调函数来填充秒钟数组的所有元素,其他数组原理一样。这样,毫秒数组下标每一个tick加1,秒钟数组下标每一秒加1,分钟数组下标每一分钟加1,小时数组下标每小时加1。注意,回调函数的执行都在毫秒数组中。

  定时器机制如下图所示:
    

 

作者:dyx1024 发表于2013-1-16 23:29:37 原文链接
阅读:81 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>