1. 程式人生 > >libevent原始碼解讀(一)--總體閱讀

libevent原始碼解讀(一)--總體閱讀

    我學習新東西的方法是對新東西有個大概的瞭解,然後在逐步深入。我不知道這種方法好不好,如果有什麼好的學習方法,望推薦!

    廢話少說,先下載原始碼然後安裝。本人使用的原始碼是穩定版的libevent-2.0.6。至於他的詳細更新,可以到他的程式碼庫去看。https://github.com/nmathewson/Libevent

    在Linux下的安裝步驟:

 $ tar -xvf libevent-2.0.6-rc.tar.gz
 $ cd libevent-2.0.6-rc
 $ ./configure
 $ make
 $ make verify   # (optional)
 $ sudo make install

   安裝成功後,可以先到libevent-2.0.6-rc的目錄下,裡面有兩個很重要的資料夾,test和sample。也就是測試和樣例。二話不說,執行一個樣例,OK能執行起來了,這很好。以後就可能立杆見影的知道程式碼的效果。覺得特別適合我學習,哈哈開心!

   總觀libevent,他的資料結構主要是list和tree:在compat/sys/queue.h可以看到。這裡的結構,方法的定義十分簡潔。常見的連結串列的新增,修改,刪除某節點等等,這些程式碼可以鞏固大學裡學的《資料結構》的知識,並且在程式碼的質量上得到一個更好的效仿。

稍後再仔細閱讀。他的設計模式主要是事件驅動模式:這是高效的網路的基礎。

首先來理解下事件驅動模式(reactor):

       什麼叫驅動,從字面上就能理解,驅動就是有個神祕的力量推動著他前進,如果沒有外力推動它,它就停止不動。傳統的模式是死等,打個比方:每個人都在網上購物過,購物的流程是,你在某網站上買東西,下單然後等待東西的到來。這個前提是你必須在網站上註冊,留下你的電話和地址。假設,你沒有留電話,只留了地址,這種情況下,你購完物後,必須在家一直等東西的到來,不能離開家,因為你不知道東西什麼時候到來。這樣的話,你自己就受限制了,效率就很低下,不能離開家做其他的事。如果你留了電話,你就不用一直在家等待了,你可以在這期間在任何地方幹任何事,當有東西要到的時候,快遞員會提前打電話通知你的。拿包裹是我要做的事情,事件驅動模式就是,當你街道電話後再去拿包裹,如果沒有接到電話就不用拿。那個神祕的力量就是電話。

      在回到專業上:普通函式呼叫的機制是程式呼叫某函式,函式執行,程式等待,函式將結果和控制權返回給程式,程式繼續處理。和普通函式呼叫的不同之處在於:應用程式不是一直等待呼叫某個API完成處理,應用程式需要提供相應的介面(留了個電話)並註冊到Reactor上,如果相應的時間發生,Reactor將主動呼叫應用程式註冊的介面,這些介面又稱為“回撥函式”。使用Libevent也是想Libevent框架註冊相應的事件和回撥函式;當這些時間發聲時,Libevent會呼叫這些回撥函式處理相應的事件(I/O讀寫、定時和訊號)。

Reactor模式是編寫高效能網路伺服器的必備技術之一,它具有如下的優點:
    1)響應快,不必為單個同步時間所阻塞,雖然Reactor本身依然是同步的;
    2)程式設計相對簡單,可以最大程度的避免複雜的多執行緒及同步問題,並且避免了多執行緒/程序的切換開銷;
    3)可擴充套件性,可以方便的通過增加Reactor例項個數來充分利用CPU資源;
    4)可複用性,reactor框架本身與具體事件處理邏輯無關,具有很高的複用性

                                                                                                                                                                                                                                                                                                                                                                2014/08/01 中午