悟空學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內核又是怎麼管理這個鏈表的呢?

  面對這一個個問題,悟空感覺頭大,悟空感到很納悶了,爲什麼上課那麼容易理解,而自學卻這麼難呢?


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