LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制。该机制的实现位于和kernel/timer.c文件中。
被调度的函数肯定是异步执行的,它类似于一种“软件中断”,处于非进程的上下文中。因此,调度函数必须遵守以下规则:
-
没有current指针,不允许访问用户空间。由于不存在进程上下文,所以相关代码和被中断的进程没有任何联系。
-
不能执行休眠或可能引起休眠的函数和调度。
-
任何被访问的数据结构都应该针对并发访问进行保护,以防止竞争条件。
一旦内核定时器的调度函数运行过一次,就不会再被运行了(相当于自动注销)。但是,可以通过在被调度的函数中重新调度自己来周期运行。
在SMP系统中,调度函数总是在注册它的同一CPU上运行,以尽可能获得缓存的局域性。
定时器API
内核定时器的数据结构
struct timer_list {
struct list_head entry;
&nbs