qileilove

          blog已經(jīng)轉移至github,大家請訪問 http://qaseven.github.io/

          Linux的動態(tài)定時器-時間輪

           定時器—有時也稱為動態(tài)定時器或內核定時器—是管理內核時間的基礎。定時器是一種軟件功能,即允許在將來的某個時刻,函數(shù)在給定的時間間隔用完時被調用。注意的是定時器并不會周期運行,它在超時后就自行銷毀,這也是定時器被稱為動態(tài)定時器的一個原因。動態(tài)定時器不斷地創(chuàng)建和銷毀,而且它的運行次數(shù)也不受限制。
            定時器在內核代碼中屬于一個基礎組件。要想完全弄清楚linux2.6中內核定時器的實現(xiàn),得先從初始化開始。
            在start_kernel(void)-->init_timers(void)
          void __init init_timers(void)
          {
          int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE,
          (void *)(long)smp_processor_id());
          init_timer_stats();
          BUG_ON(err == NOTIFY_BAD);
          register_cpu_notifier(&timers_nb);
          open_softirq(TIMER_SOFTIRQ, run_timer_softirq);
          }
          在timer_cpu_notify(&timers_nb,(unsigned long)CPU_UP_PREPARE,
          (void*)(long)smp_processor_id());
            中執(zhí)行
            init_timers_cpu(cpu) //初始化本cpu中的timers
            初始化的主要代碼是:
          spin_lock_init(&base->lock);
          for (j = 0; j < TVN_SIZE; j++) {
          INIT_LIST_HEAD(base->tv5.vec + j);
          INIT_LIST_HEAD(base->tv4.vec + j);
          INIT_LIST_HEAD(base->tv3.vec + j);
          INIT_LIST_HEAD(base->tv2.vec + j);
          }
          for (j = 0; j < TVR_SIZE; j++)
          INIT_LIST_HEAD(base->tv1.vec + j);
          base->timer_jiffies = jiffies;
          base->next_timer = base->timer_jiffies;
            這段代碼的主體是base,base的定義是:structtvec_base *base;
            這個tvec_base是動態(tài)定時器的主要數(shù)據(jù)結構,每個cpu上有一個,它包含相應cpu中處理動態(tài)定時器需要的所有數(shù)據(jù)。為簡化分析僅考慮單cpu。給出這個數(shù)據(jù)機構:
          struct tvec_base {
          spinlock_t lock;
          struct timer_list *running_timer;
          unsigned long timer_jiffies;
          unsigned long next_timer;
          struct tvec_root tv1;
          struct tvec tv2;
          struct tvec tv3;
          struct tvec tv4;
          struct tvec tv5;
          } ____cacheline_aligned;

          posted on 2014-08-25 10:13 順其自然EVO 閱讀(529) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄linux

          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統(tǒng)計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 克东县| 阿拉善左旗| 镇巴县| 邛崃市| 永仁县| 包头市| 惠来县| 洱源县| 会宁县| 德清县| 政和县| 慈利县| 谢通门县| 玉田县| 井冈山市| 南宁市| 秭归县| 富阳市| 泰兴市| 额济纳旗| 襄汾县| 玉门市| 龙山县| 漳浦县| 宁德市| 湟中县| 临澧县| 伊通| 会同县| 安康市| 石狮市| 长宁县| 馆陶县| 咸丰县| 南宁市| 富宁县| 临夏市| 谢通门县| 怀安县| 南开区| 中阳县|