• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            XGuru's Blog

            技術,是一種態度。關注:高性能后端技術/服務器架構/C++/C/LAMP

               :: 首頁 :: 聯系 :: 聚合  :: 管理
              20 Posts :: 0 Stories :: 93 Comments :: 0 Trackbacks

            公告





            twitter / xoXGuru

            feedsky
            抓虾
            google reader
            鲜果
            QQ邮箱
            九点

            常用鏈接

            留言簿(12)

            搜索

            •  

            最新評論

            閱讀排行榜

             

            2.1 event_base核心事件基類數據結構



             


                  可以看出event_base是整個libevent的核心部分,它由三種結構構成:一個時間堆 (對應EVLIST_TIMEOUT),一個已注冊隊列(對應EVLIST_INSERTE),一個活躍事件隊列(對應EVLIST_ACTIVE)。

                  時間堆采用的是min-Heap最小二叉堆,已注冊隊列和活躍事件隊列采用的都是雙向鏈表。

                  已注冊隊列對應事件基中的eventqueue,活躍事件隊列對應的是事件基中的activequeues[ev->ev_pri]結構體數組。其中的ev_pri代表的是事件的優先級,數值越小代表越高的優先級別。

                  可以通過調用event_priority_set()函數對其優先級進行設置,默認插入中等優先級(nactivequeues/2 ,即活躍隊列總數除以2)。


             

            2.2 超時隊列(min-Heap最小二叉堆)

                  在這里處理超時機制中使用了一個經典的數據結構min-Heap,源碼位于Min_heap.h

            libevent從1.4版本之后就開始采用min-Heap來代替RB-Tree。

            min-Heap(最小二叉堆)遵循的原則:

            1.它是一種完全二叉樹

            2.它最小的元素在頂端每個元素都比它的父節點大(或相等)。

            插入元素時間復雜度為O(log n),找出最小值的復雜度僅為O(1)。

            libevent實現的min-Heap變量名有點猥瑣。

            1typedef struct min_heap
            2{
            3    struct event** p;
            4    unsigned n, a;
            5}
             min_heap_t;
            6

             

             

            p可以理解成存儲事件指針的數組,n表示的是容量,a表示的是當前數。

            堆的操作函數里一般e代表事件,s代表被操縱的min-Heap。

            這個min-heap作者應該是OOP陣營的,其中出現有對應構造函數的min_heap_ctor(),和對應析構函數min_heap_dtor()。


             

            2.3事件隊列(雙向鏈表)

            libevent中的活躍事件隊列和已注冊隊列采用的數據結構都是用宏來實現的,原在freeBSD的<sys/queue.h>中已有定義,為了對Linux跨平臺支持考慮,libevent將部分代碼集中到event_internal.h里。


            1#define TAILQ_ENTRY(type)                        \
            2struct {                                         \
            3    struct type *tqe_next;    /* 下一個元素 */         \
            4    struct type **tqe_prev;    /*上一個元素的地址*/      \
            5}

            6

             

            libevent用到的宏操作

            宏名稱

            操作

            TAILQ_INIT

            初始化隊列

            TAILQ_FOREACH

            對隊列進行遍歷操作

            TAILQ_INSERT_BEFORE

            在指定元素之前插入元素

            TAILQ_INSERT_TAIL

            在隊列尾部插入元素

            TAILQ_EMPTY

            檢查隊列是否為空

            TAILQ_REMOVE

            從隊列中移除元素

            posted on 2010-06-24 00:23 XGuru 閱讀(1972) 評論(1)  編輯 收藏 引用

            Feedback

            # re: [原創]Libevent學習筆記(2)-基本數據結構 2012-06-13 11:29 Filipe
            Please translate this to english! thank you  回復  更多評論
              

            一本色道久久88综合日韩精品 | 无码人妻少妇久久中文字幕蜜桃| 久久精品国产清自在天天线| 日韩久久久久中文字幕人妻| 天天躁日日躁狠狠久久| 国产美女久久久| 一级女性全黄久久生活片免费| 色欲综合久久中文字幕网| 亚洲综合久久综合激情久久| 国产精品久久久久久久久软件 | 久久婷婷五月综合97色一本一本 | 久久亚洲AV成人无码| 国产精品免费福利久久| 日本久久中文字幕| 国产亚洲欧美成人久久片| 久久只有这里有精品4| 久久久91精品国产一区二区三区| 热久久国产欧美一区二区精品| 97久久国产亚洲精品超碰热| 久久精品日日躁夜夜躁欧美| 韩国三级中文字幕hd久久精品| 久久精品国产一区二区三区日韩| 亚洲狠狠婷婷综合久久蜜芽| 一级A毛片免费观看久久精品| 精品国产91久久久久久久a| 久久er国产精品免费观看2| 亚洲精品乱码久久久久久蜜桃不卡| 欧美久久一区二区三区| 国产成人无码精品久久久久免费 | 久久久久亚洲AV无码网站| 波多野结衣久久| 香蕉99久久国产综合精品宅男自| 久久国产精品免费一区二区三区| 日本精品久久久久中文字幕| 精品久久久久久国产潘金莲| 久久99亚洲网美利坚合众国| 久久99精品久久久久久动态图| 国产产无码乱码精品久久鸭| 久久综合香蕉国产蜜臀AV| 国内精品久久久久影院一蜜桃| 99久久无色码中文字幕|