稍後填坑數據結構
kernel中,每一次時鐘中斷會trap到kernel code,這個時間間隔稱之爲jiffies,每秒鐘發生的次數爲HZui
若是是4核,分配到每一個核就是HZ/4spa
cat /boot/config-`uname -r` | grep '^CONFIG_HZ=' 輸出:code
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 grep
LOC: 24690231 20180418 15869859 18248079 Local timer interrupts im
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]隊列