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

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





