悟空學Linux專欄----第20篇

  自從悟空發現高精度定時器的精度很高之後,悟空就決定開始研究高分辨率的定時器。有了低分辨率定時器的基礎之後,悟空想內核表示高分辨率定時器的結構中應該至少包括三個成員。

  一個表示到期時間的成員,而且這個成員肯定不是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成員保存的是這個區間的結束時間。

  悟空:哦,原來是這樣啊。

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