1. 程式人生 > >(十九)對libevent原始碼分析的總結

(十九)對libevent原始碼分析的總結

前言

在寫對libevent原始碼分析之前,其實已經閱讀過幾遍libevent原始碼,結果在分析的時候,還是遇到了一些障礙,不過還好都解決了。由於在真正意義上,這是我第一次分析超過萬行的原始碼,所以可能在分析的過程中,有些遺漏難免發生,後面發現的時候再補上,如果有錯誤的地方,希望大家指出。

總結

libevent將定時事件、訊號事件、I/O事件都整合到一起,並且可以支援多種多路I/O處理方法,採用了事件驅動機制來處理事件,這樣確實保證了效能的優越。之所以看libevent1.4是因為它的程式碼不是很複雜,而且邏輯比較清晰,在最新版的libevent庫中,部分的實現程式碼發生了改動,以及一些介面發生了改變,但是思想還是不變的。看了libevent1.4的原始碼,再去看最新版的,也會省很多力氣。

我們再來過一遍libevent的整個知識結構。

首先是libevent對一個事件操作的全過程。先初始化一個event_base,然後初始化一個事件,設定該事件的回撥函式等,接著將該事件新增到event_base上,然後執行主迴圈進行處理。再者就是事件是分優先順序的,低優先順序先被處理。

定時事件是通過小根堆來管理,如果激活了,則將其從小根堆上取下,移動到啟用連結串列上等待排程。

而訊號事件是通過socket pair來實現整合的,讀socket會在event_base上註冊一個讀事件,而當訊號發生時,記錄該訊號,並通過寫socket寫資料,觸發之前註冊的讀事件,這樣該事件就被觸發,於是就可以進入到啟用連結串列中等待處理了。

關於緩衝區部分,首先先構建緩衝區,並提供一些針對緩衝區的操作,接著bufferevent對其進行封裝,使用者能夠呼叫的便是bufferevent提供的介面。bufferevent設定了4個水位,用於自動管理緩衝區。當讀/寫緩衝區事件被觸發並排程之後,bufferevent首先呼叫自己內部的回撥函式,在該回調函式內部,再呼叫使用者自己設定的回撥函式。

關於libevent的一些資料結構,在文中並沒有分析,因為這些在網上可以查到很詳細的資料,比如用陣列表示堆結構,還有尾佇列等。libevent中使用了大量的巨集函式以及函式指標,這部分的內容也需要你有一定的基礎。

小結

通過寫這系列的部落格,除了分享之外也對libevent有了更深的印象,感謝大家的閱讀與支援。每一個小節的pdf我將隨後上傳到我的github中(上傳完成後再貼連結),歡迎下載。