Linux?C/C 定時器的實現(xiàn)原理和使用方法
定時器的實現(xiàn)原理
定時器的實現(xiàn)依賴的是CPU時鐘中斷,時鐘中斷的精度就決定定時器精度的極限.那么,一個時鐘中斷源如何實現(xiàn)多個定時器呢?
對于內(nèi)核,簡單來說就是用特定的數(shù)據(jù)結(jié)構(gòu)管理眾多的定時器,在時鐘中斷處理中判斷哪些定時器超時,然后執(zhí)行超時處理動作。而用戶空間程序不直接感知CPU時鐘中斷,通過感知內(nèi)核的信號、IO事件、調(diào)度,間接依賴時鐘中斷。
用軟件來實現(xiàn)動態(tài)定時器常用數(shù)據(jù)結(jié)構(gòu)有:時間輪、最小堆和紅黑樹。下面就是一些知名的實現(xiàn):
Linux內(nèi)核的 Hierarchy 時間輪算法Asio C Library最小堆定時器實現(xiàn)nginx 使用紅黑樹結(jié)構(gòu)管理定時器事件
Linux內(nèi)核定時器相關(guān)的一些相關(guān)代碼:
內(nèi)核啟動注冊時鐘中斷
// @file: arch/x86/kernel/time.c - Linux 4.9.7
// 內(nèi)核init階段注冊時鐘中斷處理函數(shù)
static struct irqaction irq0 = {
.handler = timer_interrupt,
.flags = IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
.name = "timer"
};
void __init setup_default_timer_irq(void)
{
if (!nr_legacy_irqs())
return;
setup_irq(0,