Linux?C/C 定時(shí)器的實(shí)現(xiàn)原理和使用方法

定時(shí)器的實(shí)現(xiàn)原理
定時(shí)器的實(shí)現(xiàn)依賴的是CPU時(shí)鐘中斷,時(shí)鐘中斷的精度就決定定時(shí)器精度的極限.那么,一個(gè)時(shí)鐘中斷源如何實(shí)現(xiàn)多個(gè)定時(shí)器呢?
對(duì)于內(nèi)核,簡(jiǎn)單來說就是用特定的數(shù)據(jù)結(jié)構(gòu)管理眾多的定時(shí)器,在時(shí)鐘中斷處理中判斷哪些定時(shí)器超時(shí),然后執(zhí)行超時(shí)處理動(dòng)作。而用戶空間程序不直接感知CPU時(shí)鐘中斷,通過感知內(nèi)核的信號(hào)、IO事件、調(diào)度,間接依賴時(shí)鐘中斷。
用軟件來實(shí)現(xiàn)動(dòng)態(tài)定時(shí)器常用數(shù)據(jù)結(jié)構(gòu)有:時(shí)間輪、最小堆和紅黑樹。下面就是一些知名的實(shí)現(xiàn):
Linux內(nèi)核的 Hierarchy 時(shí)間輪算法Asio C Library最小堆定時(shí)器實(shí)現(xiàn)nginx 使用紅黑樹結(jié)構(gòu)管理定時(shí)器事件
Linux內(nèi)核定時(shí)器相關(guān)的一些相關(guān)代碼:
內(nèi)核啟動(dòng)注冊(cè)時(shí)鐘中斷
// @file: arch/x86/kernel/time.c - Linux 4.9.7
// 內(nèi)核init階段注冊(cè)時(shí)鐘中斷處理函數(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,