skynet记录6:定时器
?
稍后填坑
?
kernel中,每一次時(shí)鐘中斷會trap到kernel code,這個(gè)時(shí)間間隔稱之為jiffies,每秒鐘發(fā)生的次數(shù)為HZ
如果是4核,分配到每個(gè)核就是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個(gè)核的時(shí)鐘中斷次數(shù)加起來接近250(上面考慮printf略多)
?
skynet中timer數(shù)據(jù)結(jié)構(gòu):
struct timer {
? struct link_list near[TIME_NEAR];???????????? // 256個(gè)等級list,一般kernel最關(guān)注256個(gè)jiffies時(shí)間之內(nèi)的定時(shí)器
? struct link_list t[4][TIME_LEVEL]; //?大于256jiffies的定時(shí)器放這里,見后面詳述
? struct spinlock lock;
? uint32_t time; // 從系統(tǒng)啟動后經(jīng)過的滴答數(shù),即多少個(gè)1/100秒
? uint32_t starttime; // 系統(tǒng)啟動時(shí)間(絕對時(shí)間,單位為秒)
? uint64_t current; ? // 相對時(shí)間(相對于starttime)
? uint64_t current_point; // 絕對時(shí)間
};
上面的成員t:一共4個(gè)等級,64的n次方乘以256之內(nèi)的放在t[n][TIME_LEVEL],單位0.01秒
64*64*64*64*256就是2^32
比如17000秒的定時(shí)器,大于64*256*0.01?小于64*256*0.01,所以放在t[1][TIME_LEVEL]隊(duì)列
?
轉(zhuǎn)載于:https://www.cnblogs.com/wjx0912/p/7604049.html
總結(jié)
以上是生活随笔為你收集整理的skynet记录6:定时器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 冲刺第十天
- 下一篇: 快速排序算法 java 实现