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

  解決了struct timer_list中的expires成員爲什麼是unsigned long類型的問題之後。悟空決定自己揭開爲什麼採用雙向鏈表管理數據結構。悟空從網上下載了達人老師的課件,決定先研究定時器的軟件架構,Linux內核採用如下的結構體表示:

  struct tvec_base {

  spinlock_t lock;

  struct timer_list *running_timer;

  unsigned long timer_jiffies;

  unsigned long next_timer;

  struct tvec_root tv1;

  struct tvec tv2;

  struct tvec tv3;

  struct tvec tv4;

  struct tvec tv5;

  };

  struct tvec {

  struct list_head vec[TVN_SIZE];

  };

  struct tvec_root {

  struct list_head vec[TVR_SIZE];

  };

  從上面可以看到tvec_base中有五個數組,分別是tv1、tv2、tv3、tv4、tv5。其中tv1的大小爲TVR_SIZE,一般是256。而tv2、tv3、tv4、tv5的數組大小是TVN_SIZE,一般是64。Linux系統爲每個CPU都分配了一個struct tvec_base成員,每個CPU通過這個成員來管理本CPU上的所有的低分辨率的定時器。

  具體組織如下圖所示:

  看到這裏悟空終於對Linux內核的低分辨率的定時器的組織架構有了比較清晰的認識。但是這幅圖只是表示了Linux內核中特定時間的定時器的切片圖。而隨着時間的推移,這幅圖又是怎麼變化的呢?而且tv1、tv2、tv3、tv4、tv5中又是存放了什麼數據呢?正當悟空打算揭開這些問題的謎底之後,接下來的事情讓悟空鬱悶了,只見課件的最後顯示着“未完,待續中”。


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