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

            搜索

            •  

            最新評論

            閱讀排行榜

            2011年7月21日 #

            最近重溫《Python源碼剖析》一書,將python基本對象的要點記錄如下
            python 整數對象
            1.python中的整數使用c語言中的long類型存儲
            2.python int進行加法會檢查結果是否溢出,如果溢出則自動轉換為pyLongObject對象
            3.python中的文檔無縫集成在語言實現中
            1 = 11
            2 print a.__doc__

            4.小整數對象完全緩存在內存中,其他整數對象輪流使用一塊內存空間
            5.小整數對象在python初始化中調用的_PyInt_Init中創建,然后就一直存在著, 直到python虛擬機退出

            python String對象
            1.pyStringObject在創建之后,內部維護的字符串不能再改變
            2.intern機制是否只在字符數組長度0或者1的時候使用? 書中提供的代碼太過于精簡了,沒講清楚,但是看后面的演示結果,應該是所有的字符串都實現了intern機制
            3.字符串連接操作嚴重影響python程序執行效率,使用join只需分配一次內存,能夠大大提高效率.用法舉例
            "".join(['s1','s2','s3'])

            Python Dict對象
            1.Python中的dict采用hashtable而不是R-B Tree。
            2.采用開放定址法解決沖突。
            3.為保證沖突探測鏈的連續性,采用偽刪除技術,active對象刪除則設置為dummy態
            4.為減少沖突,轉載率大于2/3時則改變table的大小,每次增大4倍,如果table中的active態的元素個數大于50000時(巨型表),
            則放慢增長速度,每次增長2倍??梢钥闯鯬ython中dict的查找效率較高,而對于內存的使用是省了又省,還考慮了巨型表增長減少倍數。

            Python List對象
            1.PyListObject類似STL中的Vector。
            2.Python對內存的使用十分節儉,如果list改變的新尺寸不到分配內存的1/2,則收縮內存.
            3.在Pylist中建插入元素需要逐個移動后面的元素,類似C中的數組,因此需要盡量避免對中間元素的插入和刪除操作。
            4.STL和PyListObject自動擴容算法對比:個人覺得list改名為array比較恰當一些,嘿嘿
            //sgi STL:
            len 
            = (old_size != 0 )?2*oldsize:1
            //(不夠用則擴充兩倍,如果開始為空則設置為1)
            //Python:
            new_allocated
            =(newsize>>3)+(newsize<9?3:6)
            //(???)
            5.對于增長倍數的選擇,這里有討論
            http://en.w3support.net/index.php?db=so&id=1100311

            p70書中筆誤 :"allcated/2"應改為"allocated/2"

            posted @ 2011-07-21 23:16 XGuru 閱讀(2527) | 評論 (1)編輯 收藏

            2010年12月22日 #

            via :Kevin Watters's blog
            譯:XGuru

            原始狀態

                我曾經觀看過小提琴家非常有激情地拉弦演奏,我有了這種想法:也許我投入到文本編輯器中的腦細胞數量和他為投入所喜好的樂器的演奏中差不多吧。我還有種奇異的想象,當他獨奏的時候,腦中的核磁共振圖和我在使用VIM中操控代碼的的圖像也許不會相差太大吧?





                如果你愿意的話請你仔細思考下,以下是一個vimmer的學習旅程的剪輯




            Vim涅磐所經歷的漫長而艱苦的道路


            星期一

                “Eclipse當然是簡潔實用的”

                “但是一些滿臉落腮胡的奇怪家伙在工作中似乎使用vim確實非???我應該試一下。”

                “好吧!我弄了個Gvim,這看起來不是很糟糕,這里甚至還有菜單界面!”

                “等什么?我的文本去哪了?等一下,撤銷,不要啊!”

                “:help”

                “:q!!!!!”

                今天剩下的時間還是回到擁有讓人上癮的自動補全樣板功能的Eclipse中獲得解脫吧


            星期二

                 “好吧 vim,這是新的一天了,這是個磨礪自己學習新東西的一個嶄新的機會,我不是那么容易放棄的人!”

                “為什么我就不能一直呆在插入模式里面呢?FJDSAKLFJDALSKJKLDF(發狂的敲擊鍵盤)”

                “等一下,你在告訴我保存的時候必須按ESC-shift-冒號-w-回車?這簡直就是狗屁啊”

                “在花了2個小時學習教程以后,我基本上懂的就是ddp命令可以交換兩行的內容,真是蛋疼啊”




            一個禮拜以后

                 “哇噢,任何地方都有vim阿,這意味著這付出的所有的努力將不會白費,比如當我用ssh遠程登入主機修改一些配置的時候”

                 “太爽了,嘿,朋友們來看看這個全暗色的配色主題,我新的工具鏈表面上看起來非常安逸了”

                 “噢,真是扯蛋,我的.vimrc沒有在我的遠程主機里,當我ssh登入編輯一些配置的時候,所有我的酷玩意都沒了”




            兩個月以后

                 HJKL的移動方式習慣成自然,你神秘的失去了使用鼠標的能力。

                “我將始終使用我剛下載的這400個插件!尤其是這個折疊latex語法的插件,噢,哥們”

                “使用小箭頭方向鍵簡直是自我折磨阿”

                “再見,Caps Lock鍵”

                “就這樣吧,這是忍耐的極限,vim甚至不能讓文本合適的自動換行,我準備回到edit.com了”



            一年后

                更少的大聲說話了。

                安裝command-T插件,每天節約成百上千次的鍵盤敲擊。

                用宏試著讓你肩膀后的某個人感到印象深刻,通過在整個文件里混合大小寫和參雜ROT13暗碼(回轉十三位加密)。

                最終在某個奇跡般的一天學會在肌肉記憶里用ctrl+[來延緩了腕關節炎癥降臨。

                學會了移動光標,使用visual模式和*鍵----這意味著已經沒有退路了。

                “vim不支持交互性緩存?都20年了?好吧,作為一名黑客,我決定給它添加這項支持。”

                查看vim代碼庫,瘋狂地讓它向相反的方向運行。

                “誰無論如何也需要在編輯器里弄個控制臺?我就是所有的unix哲學。”

                對周圍的”vim只是將一個編輯模式合并到真正的編輯器中“觀念感到無可忍耐。

                因為你老是在房間里令人討厭地回復”:w”,IRC的朋友們最后將你孤立
            。


            兩年以后

                vim腳本就是一種對上帝的深惡痛絕。

                有點覺得emacs的從始至終的指令模式相對有點像在天堂一樣。

                我昨晚做了一個噩夢,夢到我始終沒有學會在寬屏顯示器中垂直切分窗口,這樣提心吊膽真是夠混帳阿。

                偷偷地瞄一下周圍,綁定ctrl+s到保存,允許自己悄悄地松一口氣。

                意識到hjkl搜索定位不足以成為終極時間節約工具,發現:python腳本,所建立的大量定制功能達到鼎盛期,對<Leader>key綁定直到你的鍵盤類似于NASA指揮中心控制面板一樣有點繁多到荒謬的功能感覺有一點糟糕。

               “嘿,每個聽的到我聲音的家伙過來看看,我現在控制電腦,寫博客,檢查郵件,運行測試,調試程序,瀏覽黑客新聞
                       所有的一切都能在vim溫暖舒適,超級可以定制化的母體中進行”

                為什么你這小子不做幾個后空翻來慶祝一下呢?



            模糊又很長某段時間之后

                在“文本編輯中模態的明顯的優勢”演講結束后失去了幾個朋友。


                盡情享受在github.com/me/vimfiles中分享自己配置的快樂中,有義務完成關于如何特立獨行地安裝語法檢查,lint工具,自動補全,快速文檔查看,成噸的殺手級縮寫,世界上所有文件類型對應的插件,使vim在每種功能的高效性上接近真正的IDE的博客帖子。開機時間日志寫入服務器,下意識地使用nano來編輯配置文件。不會為沒有使用插件和vimrc中的更多語法而更新所有的配置文件而感到深深的羞愧。

                變得十分淡定,重復性的編輯任務再也難不住你,不再去參加emacs與vim誰好誰壞的爭論


            ...這就是你用vim時大腦的終級形態






             --EOF--
            Creative commons license
            by XGuru is licensed under a Creative Commons 署名-非商業性使用-相同方式共享 2.5 中國大陸 License.

            posted @ 2010-12-22 23:05 XGuru 閱讀(13318) | 評論 (11)編輯 收藏

            2010年12月1日 #

            via:git.or.cz


            posted @ 2010-12-01 11:54 XGuru 閱讀(1063) | 評論 (3)編輯 收藏

            2010年10月24日 #

            2010 developer’s problem solving sequence:

            from: 


            1.Google
                技術上的問題多去google,wikipedia上看看絕對沒錯,想看性用品廣告就多上上Baidu。

            2.Coworkers
                找同事幫忙,如果你的同事熱心腸而且技術不錯,而且遇到過類似的問題,他的建議就會很顯得非常寶貴,也許就能一針見效。

            3.StackOverflow
                去編程互助網站搜索下答案,不行就上去發帖提提問,熱心人還是蠻多的,但是感覺這個網站上的Java/.Net的問題比較多。

            4.RTFM
                讀下令人郁悶的幫助文檔(Read the f*cking manual),在linux下man一下或者查看下MSDN文檔,mannual文檔一般會組織得很好,很清晰。但是語言表達得太專業化了,有時候會讓人很郁悶。

            5.Think
                最后不行了,還是自己想下怎么解決問題吧,求人不如求己。

            posted @ 2010-10-24 15:18 XGuru 閱讀(10657) | 評論 (8)編輯 收藏

            2010年10月7日 #

            大家都為linux下壓縮格式繁多,而且每種格式都對應不同的命令,這是個很讓人頭疼的問題。
            我就介紹個方法給大家:
            在bashrc里加入

            ex () {
              
            if [ -f $1 ] ; then
                
            case $1 in
                  
            *.tar.bz2)   tar xjf $1        ;;
                  
            *.tar.gz)    tar xzf $1     ;;
                  
            *.bz2)       bunzip2 $1       ;;
                  
            *.rar)       rar x $1     ;;
                  
            *.gz)        gunzip $1     ;;
                  
            *.tar)       tar xf $1        ;;
                  
            *.tbz2)      tar xjf $1      ;;
                  
            *.tgz)       tar xzf $1       ;;
                  
            *.zip)       unzip $1     ;;
                  
            *.Z)         uncompress $1  ;;
                  
            *.7z)        7z x $1    ;;
                  
            *)           echo "無法解壓'$1'文件!!" ;;
                esac
              
            else
                echo 
            "'$1' 不是一個合法的文件!"
              fi
            }



            解壓文件的的話只需要簡單輸入"ex [壓縮文檔]"就可以了,如果你有其他格式的壓縮文檔格式也可以自己加入進來。
            從此告別煩人的各種解壓縮命令。
            posted @ 2010-10-07 21:54 XGuru 閱讀(3138) | 評論 (5)編輯 收藏

            2010年7月27日 #


                               Emacs是否真的能煮咖啡?        by XGuru









                坊間有傳言曰:“emacs無所不能,甚至能夠用來煮咖啡!”

                煮咖啡何解?勾起了我的考究欲望。

                上網搜索之,得出幾種初步結論如下:

                1.這只是一種好玩的說法,只是用來形容emacs功能無所不包而已。

                2.Java的標志就一杯咖啡,用來形象的表示寫代碼

                      

                3.emacs的確具有煮咖啡的功能,有腳本能夠控制自動咖啡機運行。


                覺得第一種說法比較符合邏輯;第二種說法感覺有點唐突,畢竟Emacs是Richard Stallman(GNU創始人)所寫,而Java是Bill Joy(vi作者)等人完成的,這兩派都差點上升到宗教沖突了,這種解釋有點差強人意;第三種的如果是真的話就會變得很有趣。


                于是就開始了探究,首先追本溯源,找到這段腳本代碼的源頭。發現已經地址已經失效,終于在在debian的一個軟件包里找到了副本這是emacs常用腳本的一個打包。

            代碼如下
              1 ;;; coffee.el --- Submit a BREW request to an RFC2324-compliant coffee device
              2 ;;;
              3 ;;; Author: Eric Marsden <emarsden@laas.fr>
              4 ;;; Version: 0.2
              5 ;;; Copyright: (C) 1999 Eric Marsden
              6 ;;; Keywords: coffee, brew, kitchen-sink, can't
              7 ;;
              8 ;;     This program is free software; you can redistribute it and/or
              9 ;;     modify it under the terms of the GNU General Public License as
             10 ;;     published by the Free Software Foundation; either version 2 of
             11 ;;     the License, or (at your option) any later version.
             12 ;;    
             13 ;;     This program is distributed in the hope that it will be useful,
             14 ;;     but WITHOUT ANY WARRANTY; without even the implied warranty of
             15 ;;     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
             16 ;;     GNU General Public License for more details.
             17 ;;    
             18 ;;     You should have received a copy of the GNU General Public
             19 ;;     License along with this program; if not, write to the Free
             20 ;;     Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
             21 ;;     MA 02111-1307, USA.
             22 ;;
             23 ;; Please send suggestions and bug reports to <emarsden@laas.fr>.
             24 ;; The latest version of this package should be available at
             25 ;;
             26 ;;     <URL:http://purl.org/net/emarsden/home/downloads/>
             27  
             28 ;;; Commentary:
             29 ;;
             30 ;; This module provides an Emacs interface to RFC2324-compliant coffee
             31 ;; devices (Hyper Text Coffee Pot Control Protocol, or HTCPCP). It
             32 ;; prompts the user for the different additives, then issues a BREW
             33 ;; request to the coffee device.
             34 ;;
             35 ;; coffee.el requires a special BREW-capable version of Emacs/W3 to be
             36 ;; installed.
             37 ;;
             38 ;; Reference: <URL:ftp://ftp.isi.edu/in-notes/rfc2324.txt>
             39 ;;
             40 ;;
             41 ;; Thanks to Giacomo Boffi <giacomo.boffi@polimi.it> for some typos
             42 ;; and the addition of the "Brown-Coffee" sweetener type.
             43  
             44 ;;; Code:
             45  
             46 (require 'cl)
             47  
             48 (defvar coffee-host "coffee"
             49   "*The host which provides the coffee service.")
             50  
             51 (defvar coffee-pot-designator 1
             52   "*On machines with multiple pots, the number of the pot to brew in")
             53  
             54 (defvar coffee-brew-hook nil
             55   "*Hook executed before issuing a BREW request")
             56  
             57 (defconst coffee-milk-types
             58   '("Cream" "Half-and-Half" "Whole-Milk" "Part-Skim" "Skim" "Non-Dairy"))
             59  
             60 (defconst coffee-syrup-types '("Vanilla" "Almond" "Raspberry" "Chocolate"))
             61  
             62 (defconst coffee-sweetener-types '("White-Sugar" "Brown-Sugar" "Artificial-Sweetener"))
             63  
             64 (defconst coffee-alcohol-types '("Whiskey" "Rum" "Kahula" "Aquavit"))
             65  
             66 (defconst coffee-addition-types
             67   `(("Milk"      . ,coffee-milk-types)
             68     ("Syrup"     . ,coffee-syrup-types)
             69     ("Sweetener" . ,coffee-sweetener-types)
             70     ("Alcohol"   . ,coffee-alcohol-types)))
             71  
             72 ;;;###autoload
             73 (defun coffee ()
             74   "Submit a BREW request to an RFC2324-compliant coffee device"
             75   (interactive)
             76   (require 'url)
             77   (let* ((additions-list
             78           (append coffee-milk-types
             79                   coffee-syrup-types
             80                   coffee-sweetener-types
             81                   coffee-alcohol-types))
             82          (additions-string
             83           (mapconcat #'identity additions-list ","))
             84          (url (coffee-url))
             85          (url-request-method "BREW")
             86          (url-request-extra-headers
             87           `(("Content-type"     . "message-coffeepot")
             88             ("Accept-Additions" . ,additions-string)))         
             89          (url-request-data "START"))
             90     (run-hooks 'coffee-brew-hook)
             91     (url-retrieve url)))
             92  
             93 (defun coffee-additions ()
             94   (let* ((type-name
             95           (completing-read "Coffee addition: " coffee-addition-types nil t))
             96          (type (cdr (assoc type-name coffee-addition-types)))
             97          (ingredients (mapcar #'(lambda (a) (cons a a)) type))
             98          (ingredient
             99           (completing-read "Addition type: " ingredients nil t)))
            100     ingredient))
            101           
            102 (defun coffee-url ()
            103   (require 'w3-forms)
            104   (concat "coffee://" coffee-host "/"
            105           (int-to-string coffee-pot-designator)
            106           "?" (w3-form-encode-xwfu (coffee-additions))))
            107  
            108  
            109 (provide 'coffee)
            110  
            111 ;; coffee.el ends here

                這個腳本看起來還是煞有其事的,文中提到"Submit a BREW request to an RFC2324-compliant coffee device"

                能夠向與RFC2324協議兼容的咖啡設備提交BREW請求
            ,即兼容Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0)協議。超文本咖啡壺協議,光看這名字就夠喜慶了,但這份協議寫得很規范,看不出一絲破綻。有細心的朋友shrek.wang提醒了我,注意看日期:

            Network Working Group                                       L. Masinter
            Request for Comments: 2324                                 1 April 1998

                1998年4月1號,愚人節!這個就讓人產生了疑問。
                通過查wiki發現,原來互聯網國際標準機構也是很有才的惡搞高手。

            這里列舉其中幾個好玩的
              • 2001年,RFC 1149由一班挪威Linux使用者協會的成員實現了。他們傳送了9個封包到約5公里外的地方,每個封包由不同的鴿子攜帶,并有一個ICMP應答要求封包(ping)。他們收到4個回應,封包流失率是55%,回應時間是3000至6000秒。[1]
              • RFC 1607 來自21世紀的觀點 Vint Cerf 1994
              • RFC 3091 圓周率數字產生協定 . H. Kennedy 2001年
            更多的可以看這里wiki。

              
                 這里可以大膽地作出推斷,這個協議只是 IETF 開的一個善意的joke,而coffee.el的作者Eric Marsden也是一個幽默的程序員,于是就做了一個兼容RFC2324的腳本,他也沒想過要真正的控制咖啡機,所以這整個事情都源于程序員的冷幽默。
                                      
                 然而遠程控制咖啡機還是有可能的,這里有一個開源咖啡機;這里還有一個允許網絡控制的咖啡機(據說還是兼容RFC2324的)。
                 估計IETF應該做夢也沒想到自己開的一個玩笑竟然還真的有人做出了實物。 國外的牛人們還真是閑得蛋疼阿。可見geek們還是極富幽默感的。
            朋友們,你的心中已經有答案了么?你們想要一臺這樣的咖啡機不?







            PS.在這里BS下CPPBLOG的編輯器,真的很爛啊,文章寫到一半時點保存,竟然給發布了!

             Creative commons license

            by XGuru is licensed under a Creative Commons 署名-非商業性使用-相同方式共享 2.5 中國大陸 License.


            posted @ 2010-07-27 21:15 XGuru 閱讀(12967) | 評論 (5)編輯 收藏

            2010年6月28日 #

            豆瓣火狐小組是這樣說的:


            Firefox不是完美的,不是最穩定的,不是沒有漏洞的,也不是最快的,但它可以是自己的。



            很喜歡這句話,就是因為有了豐富多彩的插件,火狐才能如此的受歡迎.
            下面的這幾個插件是我個人最喜歡的,推薦給大家!


            1.ColorfulTabs

            人對顏色的分辨別速度大大超出文字,根據頁面的主色調生成標簽顏色,讓你的標簽變得色彩斑斕.不僅賞心悅目,更讓你方便地切換到想要的標簽.



            插件地址


            2.All-in-One Gestures

            這年頭,沒有鼠標手勢還能活么?該插件操作快捷,定制性強!
            插件地址


            3.AutoProxy

            非常智能好用的Fuck GF.W的插件,tor,proxy,ssh都能很好的支持,最爽的是可以訂閱規則,決定那些頁面使用代理,哪些無須使用.和諧社會,和諧你我他!




            插件地址


            4.Readability

            當頁面繁雜不堪,難以閱讀時,輕輕一點,魔法立現.整頁面變得美觀大方,甚至感覺像是在看一份精美排版報紙/小說.

            整容前:



            整容后:



            插件地址



            5.Tab Popup

            當你鼠標放在不同的標簽頁上,就會顯示出該頁的縮略圖.
            插件地址


            6.Adblock Plus

            廣告已經成往事!告別各種煩人的彈窗.
            插件地址


            7.Vimperator

            讓你的firefox變得像vim一樣舒服,適合骨灰級vimer!


            (圖from linuxtoy)

            插件地址 在線幫助


            8.Personas Plus

            firefox皮膚想換就換!打造個性的firefox
            插件地址


            9.Integrated Gmail



            google發燒友必備,將google其他的功能都集中到gmail里.All your Google Needs in One Place!
            插件地址

            相似的有另外一個優化 greader的插件,一個google產品大全的shortcuts插件



            PS:
            插件多了會當然會使firefox變慢,大家根據需要禁用一些
            自己平時不常用的插件.
            另外Firefox 3.6.6主要是改進了插件崩潰或者停止響應之后終止該插件的時間.喜歡裝插件的朋友趕快更新吧!
            win 32位版本下載
            linux 32位版本下載

            --EOF--
            posted @ 2010-06-28 23:29 XGuru 閱讀(4807) | 評論 (2)編輯 收藏

            2010-12-29-update:找到一個最新的版本,由jason提供,地址在這


            上網找了幾個版本在ubuntu下都用不了
            于是就自己重新修改了jackbillow的版本,用起來感覺還不錯.



            Usage: nginx.sh {start|stop|conf|restart}
            //開始|停止|配置|重啟

            注:需要以管理員身份運行


            ################################################
            #!/bin/bash
            # v.0.0.3
            # create by jackbillow at 2007.10.15
            # redevelop by XGuru at 2010.6.28
            # On Ubuntu 10.04
            # nginx - This shell script takes care of starting and stopping nginx.
            #
            # description: nginx [engine x] is light http web/proxy server
            # that answers incoming ftp service requests.
            ###############################################


            nginx_path
            ="/usr/local/nginx"
            nginx_pid
            ="/usr/local/nginx/logs/nginx.pid"
            prog="nginx"

            RETVAL=0


            start() {
            # Start daemons.
                    if [ -$nginx_path/conf/nginx.conf ];then
                      echo 
            -n $"Starting $prog: "
                      
            $nginx_path/sbin/nginx -$nginx_path/conf/nginx.conf &
                      RETVAL
            =$?
                    [ 
            $RETVAL -eq 0 ] && {
                    echo Start 
            "$prog" successfully!
                    }
                    
            else
                    RETVAL
            =1
                    fi
                    
            return $RETVAL
            }
            # Stop daemons.
            stop() {
                    echo 
            -n $"Stopping $prog\n"
                    sudo killall 
            -9 nginx
                    RETVAL
            =$?
            }
            # See how we were called.

            conf(){
                    gvim 
            "$nginx_path/conf/nginx.conf"
            }
            case 
            "$1" in
            start)
                    start
                    ;;
            stop)
                    stop
                    ;;
            conf)
                    conf
                    ;;        
            restart)
                    stop
                    start
                    ;;

            *)
                    echo $
            "Usage: $0 {start|stop|conf|restart}"
                    echo $
            "Your may need root privilege to execute this script!"
                    
            exit 1
            esac
            exit $RETVAL

            --EOF--
            posted @ 2010-06-28 16:43 XGuru 閱讀(955) | 評論 (0)編輯 收藏

            2010年6月25日 #

             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 @ 2010-06-25 16:30 XGuru 閱讀(1733) | 評論 (0)編輯 收藏

            2010年6月24日 #



            可能(這里)有點大,但是我覺得看起挺方便的。有錯誤的意見歡迎提出,我會盡快修正。這里有英文原版。

            附上幾個類似的:
            1.作弊手冊cheat sheet
            這里
            2.鍵位圖 這里[EN] [CN] ,
            3.vgod大神的版本,
            4.這里也有一個,
            5.這里還有張壁紙。

            posted @ 2010-06-24 15:42 XGuru 閱讀(3412) | 評論 (2)編輯 收藏

            久久亚洲AV无码西西人体| 9191精品国产免费久久| 国产精品久久久久久久app| 亚洲人成电影网站久久| 欧美va久久久噜噜噜久久| 亚洲中文精品久久久久久不卡| 精品一二三区久久aaa片| 国产精品久久久久…| 一级女性全黄久久生活片免费 | 久久精品无码一区二区无码| 99久久99这里只有免费费精品 | 国产精品久久久亚洲| 久久se这里只有精品| 亚洲另类欧美综合久久图片区| 久久亚洲私人国产精品| 欧美精品一区二区久久| 久久天堂电影网| 久久精品麻豆日日躁夜夜躁| 亚洲国产香蕉人人爽成AV片久久 | 久久青青草原精品国产软件| 久久国产精品99精品国产| 看全色黄大色大片免费久久久| 国产麻豆精品久久一二三| 一级a性色生活片久久无少妇一级婬片免费放 | 久久综合伊人77777| 国产亚洲美女精品久久久久狼| 久久伊人五月丁香狠狠色| 久久久久人妻一区精品| 久久本道伊人久久| 国内精品九九久久久精品| 久久亚洲AV无码精品色午夜 | 要久久爱在线免费观看| 久久久久国产| 国产精品综合久久第一页 | 粉嫩小泬无遮挡久久久久久| 伊人久久大香线焦AV综合影院| 亚洲人AV永久一区二区三区久久| 99精品久久久久久久婷婷| 亚洲AV无码久久精品狠狠爱浪潮 | 久久中文字幕视频、最近更新 | 99久久伊人精品综合观看|