Linux核心學習筆記八——定時器和時間管理

來源:互聯網
上載者:User
一 核心中的時間觀念

       核心在硬體的協助下計算和行政時間。硬體為核心提供一個系統定時器用以計算流逝的時間。系

 統定時器以某種頻率自行觸發,產生時鐘中斷,進入核心時鐘中斷處理常式中進行處理。

       牆上時間和系統已耗用時間根據時鐘間隔來計算。

利用時間中斷周期執行的工作:

       更新系統已耗用時間;

       更新實際時間;

       在smp系統上,均衡發送器中各處理器上運行隊列;

       檢查當前進程是否用盡了時間片,重新進行調度;

       運行逾時的動態定時器;

       更新資源消耗和處理器時間的統計值;

二 節拍率

       系統定時器的頻率;通過靜態預先處理定義的——HZ;系統啟動按照HZ值對硬體進行設定。體繫結構不同,HZ值也不同;HZ可變的。

    //核心程式的時間頻率

    #define HZ 1000

提高節拍率中斷產生更加頻繁帶來的好處:

       提高時間驅動事件的解析度;

       提高時間驅動事件的準確度;

       核心定時器以更高的頻度和準確度;

       依賴頂上執行的系統調用poll()和select()能更高的精度運行;

       系統時間測量更精細;

       提高進程搶佔的準確度;

提高節拍率帶來的副作用:

       中斷頻率增高系統負擔增加;

       中斷處理常式佔用處理器時間增多;

       頻繁打斷處理器快取;

節拍率HZ值需要在其中進行平衡。

 

三 jiffies

  jiffies:全域變數,用來記錄自系統啟動以來產生的節拍總數。啟動時核心將該變數初始化為0;

此後每次時鐘中斷處理常式增加該變數的值。每一秒鐘中斷次數HZ,jiffies一秒內增加HZ。系統已耗用時間 = jiffie/HZ.

jiffies用途:計算流逝時間和時間管理

jiffies內部表示:

              extern u64 jiffies_64;

              extern unsigned long volatile jiffies;     //位長更系統有關32/64

  32位:497天后溢出

  64位:……

      

//0.5秒後逾時unsigned long timeout = jiffies + HZ/2;……//注意jiffies值溢出迴繞用宏time_before 而非 直timeout > jiffiesif(time_before(jiffies,timeout)){       //沒有逾時}else{       //逾時}

 

四 硬時鐘和定時器

  兩種裝置進行計時:系統定時器和系統時鐘。

系統時鐘(RTC):用來持久存放系統時間的裝置,即便系統關閉後,靠主板上的微型電池提供電力保持系統的計時。

    系統啟動核心通過讀取RTC來初始化牆上時間,改時間存放在xtime變數中。

系統定時器:核心定時機制,註冊中斷處理常式,周期性觸發中斷,響應中斷處理常式,進行處理執行以下工作:

  l  獲得xtime_lock鎖,訪問jiffies和更新牆上時間xtime;

  l  更新系統時鐘;

  l  更新資源統計值:當前進程耗時,系統時間等;

  l  執行已到期的動態定時器;

  l  執行scheduler_tick()

 

//中斷處理常式    irqreturn_t timer_interrupt(int irq, void *dev){    //ticks have passed    long nticks;    xtime_update(nticks);    while (nticks--)           update_process_times(user_mode(get_irq_regs()));    return IRQ_HANDLED;} void xtime_update(unsigned long ticks){    //seq鎖    write_seqlock(&xtime_lock);    do_timer(ticks);    write_sequnlock(&xtime_lock);}void do_timer(unsigned long ticks){    jiffies_64 += ticks;    //更新牆上時間 ——實際時間    update_wall_time();    calc_global_load(ticks);} void update_process_times(int user_tick){    struct task_struct *p = current;    //計算當前進程執行時間    account_process_tick(p, user_tick);    //觸發非強制中斷TIMER_SOFTIRQ 逾時的timer    run_local_timers();    //計算進程時間片    scheduler_tick();}

 

五 定時器

       定時器:管理核心程式的時間的基礎,推後或執行時間執行某些代碼。

定時器資料結構:

struct timer_list {              struct list_head entry;              //定時值基於jiffies              unsigned long expires;              //定時器內部值              struct tvec_base *base;              //定時器處理函數              void (*function)(unsigned long);              //定時器處理函數參數              unsigned long data;              ……       };

 

定時器使用:

    struct timer_list my_timer;       //初始化定時器       init_timer(&my_timer);       ……             //啟用定時器       add_timer(&my_timer);       //刪除定時器       del_timer(my_timer);       ……

 

六 順延強制

       使用定時器和下半部機制延遲執行任務。還有其他順延強制的機制:

忙等待:

       利用節拍,精確率不高

       unsigned long delay = jiffies + 2*HZ ; //2秒 節拍整數倍才行;

       while(time_before(jiffies,delay))

              ;

短延遲:延遲時間精確到毫秒,微妙;短暫等待某個動作完成時,比時鐘節拍更短;依靠數次迴圈達到延遲效果。

       void udelay(unsigned long usecs)

       void mdelay(unsigned long msecs)

 

schedule_timeout()延遲:使執行的任務睡眠指定時間,達到延遲

 

signed long __sched schedule_timeout(signed long timeout){       struct timer_list timer;       unsigned long expire;       switch (timeout)       {         case MAX_SCHEDULE_TIMEOUT:              //無限期睡眠              schedule();              goto out;         default:              if (timeout < 0) {                     current->state = TASK_RUNNING;                     goto out;              }       }       //逾時時間       expire = timeout + jiffies;       //初始化一個timer定時器 參數current task       setup_timer_on_stack(&timer, process_timeout, (unsigned long)current);       __mod_timer(&timer, expire, false, TIMER_NOT_PINNED);       schedule();       del_singleshot_timer_sync(&timer);        /* Remove the timer from the object tracker */       destroy_timer_on_stack(&timer);       timeout = expire - jiffies;  out:       return timeout < 0 ? 0 : timeout;}static void process_timeout(unsigned long __data){       //喚醒被睡眠的任務       wake_up_process((struct task_struct *)__data);}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.