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

  悟空觉得课堂估计是去不了,所以自己打算在家里继续自学,悟空知道达人老师接下来需要讲的是低分辨率的定时器。所谓定时器就是设定一个未来的时间,让系统在这个未来的时间触发一个特定的事件,执行一些预先设定的程序。低分辨率的定时器的计时单位是jiffies的值,也就是精度只能达到1/HZ,以HZ=1000为例,意味着系统定时器的精度就是1ms。

  低分辨率的定时器用struct time_list结构体表示:

  struct timer_list {

  struct list_head entry;

  unsigned long expires;

  struct tvec_base *base;

  void (*function)(unsigned long);

  unsigned long data;

  ….

  };

  这个结构体中有两个比较重要的成员,一个是function函数,这个是一个挂钩函数,每次悟空看到挂钩函数都有一种莫名的郁闷,这就好比破案一样,一个挂钩函数意味着一条线索断了,悟空有需要寻找新的线索才能继续研究。

  第二个是expires,这个表示定时器的到期时间。然而悟空感觉很纳闷为什么时间会用一unsigned long类型的变量来表示呢,而没有采用内核表示时间的结构体struct ktime来表示呢?这让悟空感到很困惑。但是不管悟空怎么困惑,也想不出其中原因,这就像前面的图4不是树一样让悟空无法理解。

  看到了成员struct list_head entry,悟空明白,这个定时器的数据结构的管理方法肯定是双向链表。但是接着新的问题又来了,记得老师说过双向链表不适合管理数据很多的情况。如果系统的定时器很少,这个管理比较好,可是如果系统的定时器很多呢?双向链表就不合适了,Linux内核又是怎么管理这个链表的呢?

  面对这一个个问题,悟空感觉头大,悟空感到很纳闷了,为什么上课那么容易理解,而自学却这么难呢?


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章