• <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)

            搜索

            •  

            最新評論

            閱讀排行榜

             libevent的初衷就是設計一個跨平臺的輕量級I/0框架,由于歷史問題,各平臺的I/O復用機制難以統一。因此,這部分處理跨平臺的方法值得重點關注。

             eventop在源碼中定義如下:

            static const struct eventop *eventops[]={

            #ifdef HAVE_EVENT_PORTS

                     
            &evportops,

            #endif 

            ….

            }

                由此可見libevent通過宏來在編譯期找出可用的復用機制。

            其中的順序也是大文章的。官方的文檔中說明libevent中支持的復用機制 /dev/poll, kqueue(2), event ports, select(2), poll(2) and epoll(4).

                libevent開發人員通過對各種機制的基準測試,根據性能高到低選擇復用機制優先順序如圖所示:

             

                從中也可以了解到不同平臺機制的不統一。標準的 poll select卻難以滿足大規模架構的需要,具體可以參考Dan Kegel "The C10K problem"文檔。

            關于機制的采用,libevent采用的是函數指針的方法。

             

             

            struct eventop {
                
            const char *name; /*機制名稱*/
                
            void *(*init)(struct event_base *); /*初始化事件*/
                
            int (*add)(void *struct event *);    /*添加事件*/
                
            int (*del)(void *struct event *);    /* 刪除事件*/
                
            int (*dispatch)(struct event_base *void *struct timeval */* 調度事件 */
                
            void (*dealloc)(struct event_base *void *);/* 釋放資源*/
                
            int need_reinit;
            }
            ;

             

            每個eventop即對應一種IO復用機制,其中的每個函數指針都指向使用該機制對事件進行操作的方法。

            比如對應epolleventop結構中:
            1.void *(*init)(…)函數指針對應的是static void * epoll_init(…)
            2.在epoll_init()里,首先對環境變量進行檢測,發現沒有epoll機制時立即返回NULL
            3.使用epoll_create(32000)指定了連接數目的上限為32000個,然后對epollop的各個成員所需資源進行分配。
            4.最后調用libevent自身的信號初始化函數。

            選擇機制并將其初始化的過程十分簡單:

             

                for (i = 0; eventops[i] && !base->evbase; i++{

                   
            base->evsel = eventops[i];

                   
            base->evbase = base->evsel->init(base);

                }

                遍歷存儲機制的eventops數組,按順序依次嘗試初始化,一種機制被成功初始化則立即跳出循環。當然,檢測系統環境可用機制,選擇哪種機制更合適,具體的復用機制如何使用,這一切的瑣碎細節你都無需關心,使用時,只要調用event_init()函數即可。Libevent對各種復用機制的巧妙封裝避免了開發者開發大規模架構時,處理跨平臺時機制選擇的苦惱。

            posted on 2010-06-25 16:30 XGuru 閱讀(1733) 評論(0)  編輯 收藏 引用
            国内精品综合久久久40p| 久久中文字幕一区二区| 久久99中文字幕久久| 国产人久久人人人人爽| 国产成人香蕉久久久久| 一本久久免费视频| 久久久精品国产sm调教网站| 精品一久久香蕉国产线看播放 | 久久久久亚洲av无码专区 | 亚洲精品无码久久不卡| 欧美精品福利视频一区二区三区久久久精品 | 国产精品久久久久久久| 亚洲国产成人久久综合碰碰动漫3d| 亚洲午夜精品久久久久久人妖| 国产免费久久精品99久久| 亚洲欧洲中文日韩久久AV乱码| 亚洲中文字幕无码久久2017| 国内精品久久久久影院免费| 一级做a爰片久久毛片看看| 久久精品国产精品亚洲精品| 亚洲午夜久久久久久噜噜噜| 国产亚洲婷婷香蕉久久精品| 日本五月天婷久久网站| 国产免费久久精品99久久| 中文字幕久久欲求不满| 77777亚洲午夜久久多喷| 天天做夜夜做久久做狠狠| 91久久成人免费| 国产午夜精品理论片久久影视| 欧美黑人激情性久久| 亚洲欧洲中文日韩久久AV乱码| 久久免费小视频| 97久久精品国产精品青草| 亚洲国产香蕉人人爽成AV片久久| 国产精品日韩深夜福利久久| 久久综合香蕉国产蜜臀AV| 国产A级毛片久久久精品毛片| 色综合合久久天天给综看| 日韩影院久久| 久久久国产视频| 久久亚洲精精品中文字幕|