Welcome 微信登录

首页 / 操作系统 / Linux / Linux内核定时器的实现

由于Linux还不是一个实时的操作系统,因此如果需要更高精度,或者更精确的定时的话,可能就需要打一些实时的补丁,或者用商用版的实时Linux,.

这里内的定时器最小间隔也就是1个tick.

这里还有一个要注意的,我这里的分析并没有分析内核新的hrt 定时器.这个定时器是Monta Vista加入到内核的一个高精度的定时器的实现.

先来看几个相关的数据结构.
///这个是一个最主要的数据结构,表示一个完整的定时器级联表
Java代码
  1. struct tvec_base {   
  2. ///自旋锁   
  3. spinlock_t lock;   
  4. ///表示由本地cpu正在处理的定时器链表   
  5. struct timer_list *running_timer;   
  6. ///这个表示当前的定时器级联表中最快要超时的定时器的jiffer   
  7. unsigned long timer_jiffies;   
  8. ///下面表示了5级的定时器级联表.   
  9. struct tvec_root tv1;   
  10. struct tvec tv2;   
  11. struct tvec tv3;   
  12. struct tvec tv4;   
  13. struct tvec tv5;   
  14. } ____cacheline_aligned;  
struct tvec_base {///自旋锁spinlock_t lock;///表示由本地cpu正在处理的定时器链表struct timer_list *running_timer;///这个表示当前的定时器级联表中最快要超时的定时器的jifferunsigned long timer_jiffies;///下面表示了5级的定时器级联表.struct tvec_root tv1;struct tvec tv2;struct tvec tv3;struct tvec tv4;struct tvec tv5;} ____cacheline_aligned;

下面来看tvec和tvec_root的结构:

Java代码
  1. struct tvec {   
  2. struct list_head vec[TVN_SIZE];   
  3. };   
  4.   
  5. struct tvec_root {   
  6. struct list_head vec[TVR_SIZE];   
  7. };