Linux的動態定時器-時間輪
定時器—有時也稱為動態定時器或內核定時器—是管理內核時間的基礎。定時器是一種軟件功能,即允許在將來的某個時刻,函數在給定的時間間隔用完時被調用。注意的是定時器并不會周期運行,它在超時后就自行銷毀,這也是定時器被稱為動態定時器的一個原因。動態定時器不斷地創建和銷毀,而且它的運行次數也不受限制。
定時器在內核代碼中屬于一個基礎組件。要想完全弄清楚linux2.6中內核定時器的實現,得先從初始化開始。
在start_kernel(void)-->init_timers(void)
void __init init_timers(void) { int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); init_timer_stats(); BUG_ON(err == NOTIFY_BAD); register_cpu_notifier(&timers_nb); open_softirq(TIMER_SOFTIRQ, run_timer_softirq); } 在timer_cpu_notify(&timers_nb,(unsigned long)CPU_UP_PREPARE, (void*)(long)smp_processor_id()); |
中執行
init_timers_cpu(cpu) //初始化本cpu中的timers
初始化的主要代碼是:
spin_lock_init(&base->lock); for (j = 0; j < TVN_SIZE; j++) { INIT_LIST_HEAD(base->tv5.vec + j); INIT_LIST_HEAD(base->tv4.vec + j); INIT_LIST_HEAD(base->tv3.vec + j); INIT_LIST_HEAD(base->tv2.vec + j); } for (j = 0; j < TVR_SIZE; j++) INIT_LIST_HEAD(base->tv1.vec + j); base->timer_jiffies = jiffies; base->next_timer = base->timer_jiffies; |
這段代碼的主體是base,base的定義是:structtvec_base *base;
這個tvec_base是動態定時器的主要數據結構,每個cpu上有一個,它包含相應cpu中處理動態定時器需要的所有數據。為簡化分析僅考慮單cpu。給出這個數據機構:
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; } ____cacheline_aligned; |
posted on 2014-08-25 10:13 順其自然EVO 閱讀(529) 評論(0) 編輯 收藏 所屬分類: 測試學習專欄 、linux