AMPS:定時器管理

  定時器模塊是協議服務器的關鍵組件之一,幾乎每個協議軟件都設計有超時機制。在多線程的軟件中,定時器的最大問題是去除了異步,這使得保護每個會話相關的數據結構變得不可避免。APMS提供了基本的定時器管理API,主要的設計目標如下:

  •  定時器實現必須高效,在定時器相關的任何操作中不應該有查找或排序。且啓動、停止、超時處理必須的時間複雜度必須爲O(1)。
  •  定時器實現必須可測量,必須支持長時間的超時(至少支持24小時或更長),且佔用內存小。
  •  定時器回調函數必須串行調用,以避免維護共享會話相關的數據結構。
  •  定時器必須精確。
  AMPS的定時器實現滿足了以上所有目標,下面描述它的設計:
  •   AMPS的定時器模塊
  AMPS將定時器視爲高優先級的事件,時鐘滴答事件每k毫秒產生一次,k爲定器模塊的最小計時單位,默認爲1毫秒。系統中有一個高優先級的線程(優先級高於主循環線程、I/O代理、CPU代理),這個線程休眠k毫秒後,會喚醒並通過IPC機制向主程序發送一個事件,然後繼續休眠k毫秒。主程序的事件管理器以高於系統中其他事件的優先級來處理這一個時鐘滴答事件。並且處理完任何事件後,它都會檢查時鐘滴答事件來判斷是否此事件處理超過了k毫秒,這種方法可以保證時鐘滴答事件不用等待其他事件的處理。並且可以判斷系統中有哪些事件處理超過了k毫秒,這樣應用程序開發者就可以發現這樣的事件處理句柄,並將它拆分成多個小於k毫秒的事件,定時器提供了一個API,允許用戶指定一個回調函數以及一個作爲參數傳入的指針。 
  • 定時器數據結構
  定時器的數據結構包含了按級別劃分的數組,每一個表示一個數字時鐘的記數器,這與Linux Kernel中的定時器實現概念一樣,AMPS中有四個這樣的數組,第一個數組表示毫秒,每一個元素代表一個tick或k毫秒,這個數組共有1000/k個元素,這也表示這個數組表示一秒的時間,也暗示了毫秒部分的超時必須是k毫秒的倍數。第二個數組表示秒,有60個元素,表示一分鐘的時間。同樣地,第三個數組表示分鐘,也有60個元素,表示一小時的時間。最後一個數組代表小時,有24個元素,表示一天的時間。
  每個數組的每一個元素是一個由定時器回調函數組成的雙鏈表,每產生一個tick事件,tick事件句柄會遍歷當前數組元素所存儲的鏈表,依次調用每一個回調函數,並且將數組下表加1,當毫秒數組達到結尾,事件處理句柄通過當前秒鐘數組所在下標的回調函數來填充毫秒數組的所有元素,並且將秒鐘數組下表加1,此時秒鐘數組元素中的回調函數等等待下一秒到來時更新,事件句柄開始增加秒鐘數組,同樣,當秒鐘數組達到結尾時,事件句柄用當前分鐘數組下表所在元素的回調函數來填充秒鐘數組的所有元素,其他數組原理一樣。這樣,毫秒數組下標每一個tick加1,秒鐘數組下標每一秒加1,分鐘數組下標每一分鐘加1,小時數組下標每小時加1。注意,回調函數的執行都在毫秒數組中。

  定時器機制如下圖所示:
    

 

發佈了205 篇原創文章 · 獲贊 30 · 訪問量 143萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章