我知道do_timer負責更新jiffies計數器。因此,我的問題是,它可以在不同的內核上執行,還是始終在發生計時器滴答的同一內核上執行?do_timer()應該只在SMP系統中的一個內核上調用嗎?
2
A
回答
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_cpu
在tick_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系統中的一個核心上完成的。
相關問題
- 1. 在Linux內核3.3中添加一個新的系統調用
- 2. 在Minix系統添加一個新的內核調用3
- 3. 冗餘的Linux內核系統調用
- 4. 做一個簡單的系統調用linux 2.6.39內核
- 5. 我們可以在內核空間中調用系統調用嗎?
- 6. 在4.x.x內核中找到64位內存的系統調用表內核
- 7. 在使用之前應該測試一個外部系統嗎?
- 8. 我該如何要求操作系統在另一個內核上運行每個線程? - Linux操作系統
- 9. 系統調用kill內核內核進程
- 10. 在系統調用中訪問Linux內核的SuperBlock對象
- 11. 接口應該是用例圖中系統的一部分嗎?
- 12. 我應該在嵌入式系統上使用ext3嗎?
- 13. 在linux 2.6.39.4內核中測試系統調用
- 14. 如何在內核模塊中安裝系統調用
- 15. 如何在嵌入式系統上調試內核oops
- 16. 緩存系統應該在Windows上使用多少內存?
- 17. 內核可以通過多線程同時處理兩個系統調用嗎?
- 18. 我應該使用內容管理系統嗎?
- 19. 在基於SMP的linux系統中訪問另一個cpu的「current_task」指針
- 20. Linux內核中的系統調用錯誤處理
- 21. 即使只有一個塊,chunking.success.endpoint應該被調用嗎?
- 22. NOHZ = On如何影響linux內核中的do_timer
- 23. 什麼應該存儲在一個登錄系統的cookie中?
- 24. 我應該在ServiceController上調用Close()嗎?
- 25. 在Linux內核尋找系統調用實現
- 26. 系統調用 - 內核使用的函數
- 27. 內核掛tty子系統
- 28. 如何使用ftrace獲取系統調用調用的內核調用圖?
- 29. FreeBSD從另一個系統調用發出系統調用
- 30. 是getaddrinfo()系統調用嗎?
根據'do_timer'的實現,它更新'jiffies_64',它是全局變量(不是每個CPU的)。所以,它對單核CPU系統沒有限制。 – Tsyvarev
事實上,它是全局的,而不是每個CPU變量,但是如果你從更廣泛的上下文來看,do_timer()總是在一個CPU上調用。它存儲在tick_do_timer_cpu變量中的哪一個。 – wrymarkX