悟空觉得课堂估计是去不了,所以自己打算在家里继续自学,悟空知道达人老师接下来需要讲的是低分辨率的定时器。所谓定时器就是设定一个未来的时间,让系统在这个未来的时间触发一个特定的事件,执行一些预先设定的程序。低分辨率的定时器的计时单位是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内核又是怎么管理这个链表的呢?
面对这一个个问题,悟空感觉头大,悟空感到很纳闷了,为什么上课那么容易理解,而自学却这么难呢?