在開發Linux網絡程序時,通常需要維護多個定時器,如維護客戶端心跳時間、檢查多個數據包的超時重傳等。如果采用Linux的SIGALARM信號實現,則會帶來較大的系統開銷,且不便於管理。
本文在應用層實現了一個基於時間堆的高性能定時器,同時考慮到定時的粒度問題,由於通過alarm系統調用設置的SIGALARM信號只能以秒為單位觸發,因此需要采用其它手段實現更細粒度的定時操作,當然,這裡不考慮使用多線程+sleep的實現方法,理由性能太低。
通常的做法還有采用基於升序的時間鏈表,但升序時間鏈表的插入操作效率較低,需要遍歷鏈表。因此本實現方案使用最小堆來維護多個定時器,插入O(logn)、刪除O(1)、查找O(1)的效率較高。
--------------------------------------分割線 --------------------------------------