skynet記錄6:定時器

 

稍後填坑數據結構

 

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]隊列

相關文章
相關標籤/搜索