定時器管理:nginx的紅黑樹和libevent的堆


libevent 發生超時后,

while循環一次從堆頂del timer——直到最新調整的最小堆頂不是超時事件為止,(實際是del event),但是會稍后把這個timeout的 event放到active 任務list里,

等待處理,event標記為timeout,等處理actvie隊列時再由應用層callback函數決定怎么處理標記為timeout的事件。

 

nginx處理超時時,直接刪除紅黑樹中( event結構體里的 )rb node成員,同時調用應用層早已通過add timer注冊好的超時handler函數。之所以沒有用堆,

因為每次直接從內部刪除節點,而不是堆頂部。

 

關鍵點,采用堆,刪除時間是O(1),但是要調整堆,logn。插入時間基本是lgn。

采用紅黑樹,刪除節點是3次旋轉,但是,找到最小節點要logn。插入時間基本是lgn。

 

總體看,都差不多。

堆排序和紅黑樹性能比較 :http://blog.sina.com.cn/s/blog_56e6a0750101b0fo.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM