• <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 @ 2010-06-24 00:23 XGuru 閱讀(1981) | 評論 (1)編輯 收藏

            Libevent簡介

            The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support callbacks due to signals or regular timeouts. 

             

            Libevent的API提供了這樣的一套機制:
            當指定文件描述符中一個特定的事件發生,或者超時時間到達后執行指定的回調函數。
            此外,libevent回調功能也支持由信號或者常規的超時觸發。
            注意其許可協議為BSD-style的協議,可以在商業級產品中采用而不必開源。

             

            1.編譯安裝


             

            ubuntu下可以使用apt的方法直接安裝:

             

             ~$  sudo apt-get install libevent

            或者使用

            ~$  wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz
            ~$  tar –xzvf  libevent-1.4.13-stable.tar.gz
            ~$  cd libevent-1.4.13-stable
            ~$  ./configure
            ~$  make
            ~$  sudo make install

            2.庫的使用
             

            可以從這幾個簡單的例子中了解到libevent的基本使用方法。編譯時需加上 "-levent"參數。

             

            2.1.I/O事件(對應EV_READ、EV_WRITE)

            下面提供了一個有所省略簡單使用libevent返回系統時間的服務端程序片段。

             1void get_time(int fd,short event,struct event *arg)  /*獲取系統時間并將其往回write*/
             2{
             3……
             4    localtime_r(&now,&t);
             5    asctime_r(&t,buf);
             6    write( fd,buf,strlen(buf) );
             7……
             8}

             9void con_accept(int fd,short event,void *arg) /*提供給事件的回調函數,接收一個連接*/
            10{
            11    struct sockaddr_in s_in;
            12    socklen_t len = sizeof(s_in);
            13    int ns = accept(fd,(struct sockaddr *&s_in,&len);
            14    struct event *ev = malloc(sizeof(struct event));
            15    event_set(ev,ns,EV_WRITE,(void *)get_time,ev);
            16    event_add(ev,NULL);
            17}

            18                
            19int main()
            20{
            21    int sockfd = socket(PF_INET,SOCK_STREAM,0);
            22    struct sockaddr_in s_in;
            23……
            24    bind(sockfd,(struct sockaddr*&s_in,sizeof(s_in));
            25    listen(sockfd,5);
            26    event_init(); //libevent初始化
            27
            28    struct event ev;
            29    event_set(&ev,sockfd,EV_READ|EV_PERSIST,con_accept,&ev);
            30//設置事件屬性為可讀、持續,回調函數為con_accept()
            31    event_add(&ev,NULL);//添加事件,未設置超時時間
            32    event_dispatch();//進入libevent主循環
            33    return 0;
            34}

            35

            2.2. 信號處理事件(對應EV_SIGNAL)

             1 static void signal_cb(int fd, short eventvoid *arg)
             2{
             3    struct event *signal = arg;
             4    printf("%s: got signal %d\n", __func__, EVENT_SIGNAL(signal));
             5    if (called >= 2)
             6        event_del(signal); //如果調用了兩次以上,就刪除這個信號
             7    called++;
             8}

             9
            10int main (int argc, char **argv)
            11{
            12    struct event signal_int;
            13    event_init();//libevent初始化
            14    event_set(&signal_int, SIGINT, EV_SIGNAL|EV_PERSIST, signal_cb, &signal_int); 
            15//設置事件屬性為信號觸發、持續,回調函數為con_accept()
            16    event_add(&signal_int, NULL); //添加事件
            17    event_dispatch();//進入libevent主循環
            18    return 0;
            19}

            20

            2.3.常規超時處理(對應EV_TIMEOUT)
             1static void timeout_cb(int fd, short eventvoid *arg)
             2{
             3    struct timeval tv;
             4    struct event *timeout = arg;
             5    int newtime = time(NULL);
             6    printf("%s: called at %d: %d\n", __func__, newtime,
             7        newtime - lasttime);
             8    lasttime = newtime;
             9    evutil_timerclear(&tv);
            10    tv.tv_sec = 2;
            11    event_add(timeout, &tv);
            12}

            13
            14int main (int argc, char **argv)
            15{
            16    struct event timeout;
            17    struct timeval tv;
            18    event_init();//libevent初始化
            19    evtimer_set(&timeout, timeout_cb, &timeout);
            20//實際上該函數對應的是event_set(timeout, -1, 0, timeout_cb,&timeout)
            21evutil_timerclear(&tv); //如果有時間清理函數則直接對應timerclear(),如果沒有則將tv_sec和tv_usec設置為0
            22
            23    tv.tv_sec = 2;
            24    event_add(&timeout, &tv);
            25    lasttime = time(NULL);
            26    event_dispatch();
            27    return 0;
            28}

            29

            posted @ 2010-06-24 00:13 XGuru 閱讀(6063) | 評論 (0)編輯 收藏

                 摘要: 很多程序員討厭去閱讀代碼,來接受它吧。就像人人都喜歡寫代碼一樣--寫代碼很有樂趣。但閱讀代碼卻是一種困難的工作。它不僅僅繁重,而且很無聊,讓我們面對這個事實,任何不是自己寫的代碼都是差勁的(嘿嘿,雖然我們沒有這樣說過,但是其實我們都是這樣想的)。甚至當你寫完代碼后的僅僅幾個小時之后,你的那些代碼就開始變得越來越爛了,時間一長,你就會把它當作看起來的那種差勁作品。為何我喜愛讀他人的代碼?閱讀代碼又有什么技巧和方法呢?而且你還需要去尋找代碼閱讀機會--而不是逃避它們  閱讀全文
            posted @ 2010-06-04 15:55 XGuru 閱讀(6514) | 評論 (10)編輯 收藏

                 摘要: 我讀了大量關于如何招募 卓越 開發者 的文章,但是如果你只對招聘蹩腳程序員感興趣,那又該怎么辦呢?也許你不愿意用錢去利滾利,或者你只覺得把工作完成就謝天謝地了。不管什么原因,這個蹩腳程序員系列文章就是玩這個把戲的。歡迎來到第一部分:如何招聘蹩腳程序員  閱讀全文
            posted @ 2010-04-26 15:43 XGuru 閱讀(2618) | 評論 (0)編輯 收藏

                 摘要: 數學對于一個開發者而言是否重要呢?一位不愿透露姓名的讀者寫道:“目前,大多數的編程工作的性質就是這樣,你并不真正需要的數學技能,甚至能做得更好,畢竟線性代數對建立數據庫驅動的網站是沒有任何幫助的。然而, Skorkin爭辯說,如果你想在軟件開發領域做真正令人興奮的工作,數學技能是必要的,而且它將會變得越來越重要!  閱讀全文
            posted @ 2010-04-02 00:18 XGuru 閱讀(4958) | 評論 (6)編輯 收藏

            這是一個非常有趣的,從計算機科學、軟件工程、程序設計、經驗、學識各方面評估程序員能力的參照表。

            如果你想看看自己的水平處在哪個層級(僅供參考),就快來看看吧~

            漢化版地址在這里


            錯誤在所難免,如果發現,請您拍磚!
            *原作者 :Sijin Joseph
            *英文原文請看 這里
            *感謝 bearice 提供修改意見和空間。
            posted @ 2010-03-12 21:33 XGuru 閱讀(4082) | 評論 (1)編輯 收藏

            Memcached是一個自由、源碼開放、高性能、分布式內存對象緩存系統,目的在于通過減輕數據庫負載來使動態Web應用程序提速。

            俗話說好記性不如爛筆頭。
            這個文檔是我用來記錄閱讀Memcached源碼過程中的一些經驗,以及分析memcached的一些內部工作機制。
            希望也能給大家帶來方便。

            PDF目錄

            1. 背景 .................................................................................................................................. 3
            2. memcached的安裝 ........................................................................................................... 4
            3. memcached的配置 ........................................................................................................... 5
            4. memcached的使用 ........................................................................................................... 6
            4.1. 存儲命令 ............................................................................................................ 7
            4.2. 讀取命令 ............................................................................................................ 8
            4.3. 刪除命令 ............................................................................................................ 8
            4.4. 高級命令 ............................................................................................................ 9
            4.5. 其他命令 .......................................................................................................... 10
            5. Memcached內部工作機制 ............................................................................................. 11
            5.1. Memcached基本的數據結構 .......................................................................... 11
            5.2. 基本設計概念和處理流程 .............................................................................. 12
            5.3. 內部Hash機制 ................................................................................................ 15
            5.3.1. Hash函數及沖突解決 ............................................................................. 15
            5.3.2. HashTable主要函數 ................................................................................ 15
            5.4. slab內存處理機制 ........................................................................................... 17
            5.4.1. slab主要函數 ........................................................................................... 17
            5.4.2. slab機制中所采用的LRU算法 ............................................................. 19
            5.5. 控制item各種函數 ......................................................................................... 20
            5.6. 守護進程機制 .................................................................................................. 22
            5.7. Socket處理機制 .............................................................................................. 23
            5.7.1. Unix域協議 .............................................................................................. 23
            5.7.2. TCP/UDP協議 ......................................................................................... 24
            5.8. 多線程處理機制 .............................................................................................. 25
            5.9. 事件處理機制 .................................................................................................. 25
            6. 未完善之處 ..................................................................................................................... 27
            7. 參考文獻 ......................................................................................................................... 28

            本人水平有限,歡迎大家拍磚!
            下載PDF

            參考文獻

            [1].Masahiro Nagano[JP] & charlee().memcached全面剖析.2008-7-2

            [2].W.Richard Stevens & 楊繼張().UNIX 網絡編程(第三版).2004

            [3]. W.Richard Stevens.UNIX環境高級編程(第二版).2005

            [4]. dsallings.Memcached FAQ.2009-9

            [5]. bachmozart .Memcached源碼分析(線程模型).

            [6]. 愛寫字開發博客.Linux下啟用Wordpressmemcached支持.


            posted @ 2010-01-23 00:39 XGuru 閱讀(7295) | 評論 (10)編輯 收藏

                 摘要: by Xguru  又說階乘,這是老生常談了吧。想都不用想,一個遞歸輕松搞定! int factorial(int n){    if( n == 1)        return 1; &n...  閱讀全文
            posted @ 2009-12-30 19:02 XGuru 閱讀(1903) | 評論 (4)編輯 收藏

             

            大家對數組的使用再熟悉不過了吧?
            來看下這個程序,挺簡單的。

            1#include<iostream>
            2int main()
            3{
            4    int a[] = {1,2,3,4,5};
            5    for(int i = 0 ; i < 5; i++)
            6        std::cout << i[a] << " ";
            7    return 0;
            8}


            現在請仔細看第6行。
            發現了什么?
            試下編譯一下看能不能通過?


            把這個程序更加簡化

            1int a[5= {1,2,3,4,5};
            2int b = 1[a];

             
            再來看下產生的匯編代碼
            4:       int a[5] = {1,2,3,4,5};
            00401568   mov         dword ptr [ebp-14h],1
            0040156F   mov         dword ptr [ebp-10h],2
            00401576   mov         dword ptr [ebp-0Ch],3
            0040157D   mov         dword ptr [ebp-8],4
            00401584   mov         dword ptr [ebp-4],5
            5:        int b = 1[a];
            0040158B   mov         eax,dword ptr [ebp-10h]
            0040158E   mov         dword ptr [ebp-18h],eax

            你沒有看錯,此刻這個數組春哥附體,a[1]的指向地址和1[a]是一樣的,都是[ebp-10h]。

            Why?

            我們回憶一下數組和指針的關系,如何用指針來表示數組?
            *a  就是 數組 a中下標為0的值的引用,即a[0],
            那么*(a+i) 呢?
            表示的就應該是數組 a中下標為i的值的引用了,即a[i],
            那么這種現象也不足為怪了:
            因為 *(a+i)  == *(i+a)
            所以 a[i] == i[a]

            是不是感到 啊哈!靈機一動(aha! Insight)了呢?

            擴展資料:《C陷阱與缺陷》p33~p38




            posted @ 2009-12-24 00:55 XGuru 閱讀(2146) | 評論 (14)編輯 收藏

                  深入學習了STL的內部構造以及一些C++深層次的機制與技巧以后,突然浮現出每個Programmer都要面對的問題。

                  Why Programming in C++?

                  比起質樸純凈的C,靈活龐大的JAVAC#,我為什么要選擇C++?

                   在各大技術BBS和牛人的BLOG里逛,大家都在為自己喜歡的語言爭論,C#/JAVA的程序員說,不要重復造車輪,擁有良好的語言平臺,有豐富全面的庫比較全,可以將注意力轉向更為重要的架構方面,軟件工程方面。又何必在語言的表層基礎苦上苦癡迷?C++標準中連最基本的GUI庫和網絡庫都沒有。包括 C++創始人BJ本人也想將C++發展成為一個平臺(palform)。

                   C++STL庫固然不錯,但是一個新手用STL時,一個小錯誤編譯就跳出上K的錯誤信息(就算有STLFilt,確實也以難安裝),最新的C++0x中 能改善這一問題的萬眾矚目的Concept已被取消,C++又該何去何從?C的程序員(包括Linus大叔)說,C++簡直就是邪惡的語言,效率底下,語言繁雜,違反KISS原則,更無法在底層如操作系統中勝任。大家說的好像都有道理,難道C++就是這樣一門高不成,低不就的語言么?

                   我也用過C語言和C#語言,而且還在大學里也拿過關于這兩種語言競賽一些小小的獎,最起碼能說對這兩種語言還有粗略的了解。

                   但是我最喜歡、花的時間最多的還是C++C++是我學的第一門語言,一路學來吃了不少苦,C++作為語言國度的一個聯邦[EFC++Item1],靈活,彈性大讓我著迷,它像一個精通太極的大師,容納百川,但卻深藏若拙。它有精妙的技法如SFINAEtag distributing (技法的復雜性這也是它被指責的重要原因)。

                   它有沉著老練的STL庫,其中有各種數據結構和常用算法的靈活精巧的實現和高度可擴充性,有銳意進取的boost庫,loki庫,有超重量級的網絡通信開發框架ACE,還有效率較高的Blitz++科學庫等。

                   C#中的各種“高階”功能C++都能實現(沒有“基本”兩字,您和我說不可能?那就去看看C#的托管機制是用什么語言寫的吧),雖然您將花費更多的時間學習與調試,但是我覺得中途的樂趣只有您自己做過才能深有體會。

                   它和C語言工作效率不分伯仲,(您說C++效率低下?請問您深入用過C++么?您看過SGI實做中內存分配的實現么?)C++也可以毫不費力的使用現有的 C代碼(所謂C-Sytle),C++STL中泛型的sort完勝C中的qsort這也是C++程序員津津樂道的話題。

                   但哪種語言不是經過無數大牛們大師們千錘百煉的產物?爭論哪種語言的好壞只是顯出您的自卑心理。當你去說一門語言好與不好的時候,你有想過,你有真正的深入的學過它么?你真正的了解這門語言的特性么?

                   請記住這句話:好手藝人從不會責怪他的工具。語言沒有好壞之分,只有在特定環境下,具備各自的優勢。

                   對于初學者而言,學通一門語言是他叩開計算機底層原理世界的大門的鑰匙。語言的好壞不重要,關鍵是看你自身從學習這門語言中得到了什么。

                   若是單單執著于語法細節,把把你的思想全部拘束在孔乙已爭論茴香豆的“茴”的幾種寫法上(像貴國的等級考試這類的考察語言偏僻細節上),你將會得不償失

                   在學習的提高階段,可以通過大體學習其他的語言,來發散自己的思維;甚至還可以幫助你更好的理解你所目前熱愛的語言。

                   還有一些人執著爭論哪門語言更有“錢途”的時候,我建議您嘞,改行吧。 (您說我裝清高,什么程序員也要吃飯,現實也很殘酷之類的。我只能說,連吃飯都成問題的,您也不適合在這個層面上討論語言的好壞,您還是繼續學吧)。

              by XGuru 09年12月

            posted @ 2009-12-20 23:10 XGuru 閱讀(2026) | 評論 (11)編輯 收藏

            僅列出標題
            共2頁: 1 2 
            综合久久国产九一剧情麻豆| 日韩欧美亚洲综合久久影院d3| 久久受www免费人成_看片中文| 免费精品99久久国产综合精品| A狠狠久久蜜臀婷色中文网| 囯产精品久久久久久久久蜜桃| 精品久久久久久中文字幕人妻最新| 日韩av无码久久精品免费| 亚洲欧洲日产国码无码久久99| 亚洲精品无码久久久久| 久久精品国产99久久久| 99久久综合狠狠综合久久| 久久亚洲AV成人无码| 久久国产精品99久久久久久老狼| 18禁黄久久久AAA片| 日日噜噜夜夜狠狠久久丁香五月 | 国产精品中文久久久久久久| 性高朝久久久久久久久久| 亚洲AV日韩精品久久久久| 久久精品国产99久久丝袜| 久久久久AV综合网成人| 久久久久av无码免费网| 精品乱码久久久久久夜夜嗨| 精品蜜臀久久久久99网站| 精品伊人久久久| 久久久久一级精品亚洲国产成人综合AV区 | 久久久久久久97| 精品久久久无码中文字幕| 99国产精品久久| 日韩精品久久无码中文字幕| 久久精品成人免费观看97| 91性高湖久久久久| 久久精品草草草| 9191精品国产免费久久| 九九99精品久久久久久| 精品国际久久久久999波多野| 亚洲精品无码久久久久sm| 久久久亚洲裙底偷窥综合| 无码8090精品久久一区| 色偷偷91久久综合噜噜噜噜| 日日狠狠久久偷偷色综合0|