?
稍后填坑
?
kernel中,每一次時鐘中斷會trap到kernel code,這個時間間隔稱之為jiffies,每秒鐘發生的次數為HZ
如果是4核,分配到每個核就是HZ/4
cat /boot/config-`uname -r` | grep '^CONFIG_HZ=' 輸出:
CONFIG_HZ=250
cat /proc/interrupts | grep timer && sleep 1 && cat /proc/interrupts | grep timer 輸出:
? 0:???????? 16????????? 0????????? 0????????? 0?? IO-APIC?? 2-edge????? timer
LOC:?? 24690231?? 20180418?? 15869859?? 18248079?? Local timer interrupts
? 0:???????? 16????????? 0????????? 0????????? 0?? IO-APIC?? 2-edge????? timer
LOC:?? 24690269?? 20180590?? 15869980?? 18248114?? Local timer interrupts
上面休眠了1秒,這4個核的時鐘中斷次數加起來接近250(上面考慮printf略多)
?
skynet中timer數據結構:
struct timer {
? struct link_list near[TIME_NEAR];???????????? // 256個等級list,一般kernel最關注256個jiffies時間之內的定時器
? struct link_list t[4][TIME_LEVEL]; //?大于256jiffies的定時器放這里,見后面詳述
? struct spinlock lock;
? uint32_t time; // 從系統啟動后經過的滴答數,即多少個1/100秒
? uint32_t starttime; // 系統啟動時間(絕對時間,單位為秒)
? uint64_t current; ? // 相對時間(相對于starttime)
? uint64_t current_point; // 絕對時間
};
上面的成員t:一共4個等級,64的n次方乘以256之內的放在t[n][TIME_LEVEL],單位0.01秒
64*64*64*64*256就是2^32
比如17000秒的定時器,大于64*256*0.01?小于64*256*0.01,所以放在t[1][TIME_LEVEL]隊列
?