悟空学Linux专栏----第20篇

来源:互联网 发布:帝国cms tags自动生成 编辑:程序博客网 时间:2024/05/22 13:32

  自从悟空发现高精度定时器的精度很高之后,悟空就决定开始研究高分辨率的定时器。有了低分辨率定时器的基础之后,悟空想内核表示高分辨率定时器的结构中应该至少包括三个成员。

  一个表示到期时间的成员,而且这个成员肯定不是unsigned long类型的成员,因为内核表示时间的方法主要有两种,一个jiffies,一个是ktime_t,而要实现ns级别的精度,内核必须采用ktime_t类型。

  第二个成员是高精度定时器执行的挂钩函数,这个函数主要用于执行到期之后需要执行的任务。

  第三个成员就是内核管理高精度定时器的管理数据结构,低分辨率的定时器采用了五个双向链表来管理这些定时器,而高精度定时器应该也有一种管理方式,悟空想应该是红黑树吧。

  悟空想验证一下自己的想法,于是悟空找到了内核高精度定时器的结构体:

  struct hrtimer {

  struct timerqueue_node node;

  ktime_t _softexpires;

  enum hrtimer_restart (*function)(struct hrtimer *);

  struct hrtimer_clock_base *base;

  unsigned long state;

  ......

  };

  看完这个结构体悟空感觉有点小激动,因为悟空发现他的猜想是对的,struct hrtimer中的确包含了这三个成员。但是悟空不太明白的是,为什么管理数据结构的红黑树的成员,没有采用红黑树的struct rb_node的结构体,而是采用了struct timerqueue_node成员,该结构体中包含一个expires成员,具体的结构体如下:

  Struct timerqueue_node{

  Struct rb_node node;

  Ktime_t expires;

  };

  悟空想了很久也没有想明白,悟空决定再次夜访达人先生。

  悟空:老师,为什么Linux内核的struct hrtimer结构体中包含的不是struct rb_node结构体,而是Struct timerqueue_node结构体?这样不是增加了管理的复杂度吗?

  达人:红黑树是一种有序的二叉树,而我们这里对红黑树的排序方法,就是采用了expires时间,这个成员是红黑树的排序准则。

  悟空:那么为什么struct hrtimer中还有_softexpires成员,这个成员不是就表示了到期时间吗?

  达人:这两个成员通常是相等,但是有些时候,用户希望到期时间是一个区间的时候,而不是一点的时候,这两个成员就不相等了,_softexpires成员保存的是这个区间的开始时间,expires成员保存的是这个区间的结束时间。

  悟空:哦,原来是这样啊。

0 0