Libevent核心原理

2022-03-12 01:56:54 字數 1410 閱讀 5645

原創,請註明出處:

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採用乙個主迴圈來處理所有事件處理和事件等待。

angularJS核心原理

一 angularjs優點和缺點 優點 1.1免去重複勞動 獲取元素 給元素加事件 建立元素 1.2接管ui angularjs根據資料建立ui元素,免去手工建立ui元素。1.3自動同步 根據資料個數建立對應的html元素。缺點 二 angularjs一切皆資料 三 angularjs三要素 4.1...

redis核心原理

1 redis的單執行緒和高效能 redis 單執行緒為什麼快?因為它所有的資料都在記憶體中,所有的運算都是記憶體級別的運算 納秒 而且單執行緒避免了多執行緒的切換 上下文切換 效能損耗問題。正因為 redis 是單執行緒,所以要小心使用 redis 指令,對於那些耗時的指令 比如keys 一定要謹...

Preact(React)核心原理

在前端界,react 一定是我們耳熟能詳的前端開發框架之一,它的出現可以說是帶給了我們全的 web 開發體驗,其中也帶來了許多新的概念 jsx virtual dom 元件化 合成事件等。當我們想從原始碼層面去研究它的原理時,由於 react 的原始碼的龐大和晦澀難懂,這也會變得異常困難。但是在愛好...