2015-09-28 82 views
2

我知道do_timer負責更新jiffies計數器。因此,我的問題是,它可以在不同的內核上執行,還是始終在發生計時器滴答的同一內核上執行?do_timer()應該只在SMP系統中的一個內核上調用嗎?

+0

根據'do_timer'的實現,它更新'jiffies_64',它是全局變量(不是每個CPU的)。所以,它對單核CPU系統沒有限制。 – Tsyvarev

+0

事實上,它是全局的,而不是每個CPU變量,但是如果你從更廣泛的上下文來看,do_timer()總是在一個CPU上調用。它存儲在tick_do_timer_cpu變量中的哪一個。 – wrymarkX

回答

2

讓我回答我自己的問題後,谷歌搜索和閱讀代碼。

do_timer()應該在CPU上調用ID保持在tick_do_timer_cpu變量。

kernel/time/tick-common.c

/*
* tick_do_timer_cpu是保持CPU NR計時器芯內部變量
*這是負責調用do_timer(),即計時stuff.This
*變量有兩個功能:
*
* 1)防止一堆數量巨大的CPU嘗試一次性獲取計時鎖的雷霆羣發問題。只有分配給執行
*更新的CPU正在處理它。
*
* 2)通過將值設置爲
* TICK_DO_TIMER_NONE,即不存在的CPU,在NOHZ空閒情況下切換任務。所以看起來
*的下一個CPU將接管並保持活着的時間。移交
*程序還涵蓋了CPU熱插拔。
*/

tick_do_timer_cputick_periodic()tick_sched_do_timer()針對當前CPU ID檢查。如果當前的CPU是相同的,則調用do_timer()否則不調用。

static void tick_periodic(int cpu) 
{ 
     if (tick_do_timer_cpu == cpu) { 
       write_seqlock(&jiffies_lock); 

       /* Keep track of the next tick event */ 
       tick_next_period = ktime_add(tick_next_period, tick_period); 

       do_timer(1); 
       write_sequnlock(&jiffies_lock); 
       update_wall_time(); 
     } 

     update_process_times(user_mode(get_irq_regs())); 
     profile_tick(CPU_PROFILING); 
    }` 

這種方式jiffies管理是在SMP系統中的一個核心上完成的。

相關問題