Libevent核心原理


原創,請注明出處:http://www.cnblogs.com/stonehat/p/6286235.html 
 
Libevent 是一個事件驅動框架, 不能僅說他是一個網絡庫。
notejs就是采用與libevent類似的libev來做核心驅動的。
 
Libevent支持三種事件:io事件、信號事件、時間事件,並且事件的設置和使用方式是一樣的。
libevent的核心原理是采用io多路復用的方式來單線程處理事件。至於為什么這么說,下面會分別對三種事件進行解釋。
 
io事件: io事件包含socket可讀、可寫、斷開、設備可讀、可寫等和IO相關的事件, libevent主要采用了epoll模型來進行i/o事件的多路復用(我說的是linux上,libevent也封裝了select,poll模型,下面僅說采用epoll的情況)。 一句話解釋epoll模型:就是在內核管理的設備或者資源上設置等待隊列,當資源出現的時候,系統會通知epoll_wait喚醒,進行事件的處理。 總的來說, i/o事件的事件驅動依賴於操作系統。
 
時間事件: 時間事件,可以簡單的解釋一下, 如果我們想在500ms后執行一段代碼,那么,就可以在libevent上面設置一個時間事件,代碼封裝到回調函數里面去。 如果看過epoll或者select的使用方式,你就會知道epoll_wait可以設置一個timeout,等待timeout這個時長,如果沒有事件發生,也會返回。時間事件的處理就 將所有時間事件要等待時間最少的設置為timeout時間,這樣,即使什么i/o事件也沒有發生,也能在timeout后,處理該處理的時間事件。
 
信號事件: 簡單的解釋一下, 即使和i/o無關的信號,也可以作為一個事件進行處理,信號在linux中是進程間通信方式之一, A可以發出一個信號, B可以接受信號,B接受之后可以進行一些操作,問題是, libevent想把信號事件也統一一起處理, 其原理是, 將信號事件這種和I/O無關的事件轉換為和I/O有關的,充分利用現有模型統一處理。事實上, 信號事件是采用一個client socket 和一個server socket, client socket只能寫, server socket只能讀, server sockert將recv到的client socket的文件描述符放到了epoll的事件集合中, 永遠不刪。 當收到系統信號的時候, 通過client socket進行發送, server socket收到數據,就會觸發epoll_wait喚醒,如果發現這是server socket的事件,就會對信號事件進行遍歷找到那個等待的。  
 
ps:個人覺得libevent應該添加字符串信號啥的自定義信號, 好擴展
 
 
事件的結構:
 
時間事件:采用最小堆組織, 時間最少的在頂部, 插入和刪除都是log(N),主要是方便找到最小等待時間,方便設置time_out時間。
I/O事件:雙向鏈表。
信號事件: 雙向鏈表
 
 
 
激活事件:是libevent 的epoll_wait喚醒后,得到的所有要處理的事件雙向鏈表。
 
主循環:
libevent采用一個主循環來處理所有事件處理和事件等待。
 


免責聲明!

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



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