解決了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中又是存放了什麼數據呢?正當悟空打算揭開這些問題的謎底之後,接下來的事情讓悟空鬱悶了,只見課件的最後顯示着“未完,待續中”。