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

            Windows下兩種iocp實現的差距

             

             

            之前幾天說過,因為經典iocp實現(以下簡稱經典實現)多個io線程綁定在一個iocp上,這樣內部管理了iocp隊列的處理,內部決定是不是需要線程切換,我上次修改的一個版本(以下簡稱實現2),用了多個io線程,每個iocp隊列僅綁定一個io線程,一組用戶共享一個io線程,這和經典的多線程epoll模型的做法是很相似的,這樣每個io線程是可以獨立控制了,但理論上這種做法沒有發揮iocp自動管理線程切換的優勢,昨晚沒事用這兩種實現分別做了個echoserver測試了一下,這兩套實現代碼僅40行左右不同,其他完全一樣,效果真的是差很多,測試僅用一個進程模擬了4000個客戶端,每秒1個包,先看實現2的,cpu14%2io線程,1accept線程,1個主線程,其他線程都沒干活閑置。

             

            Cpu

            Memory

            Threads

            handles

            14

            40088k

            8

            4236

             

            再看經典實現,cpu幾乎一直是0%2io線程,accept也是在io線程里面處理,其他跟實現2一樣,測試客戶端也一樣。

            Cpu

            Memory

            Threads

            handles

            0

            39244k

            7

            4336

             

            說實話,在測試之前我也沒想到有這么大的差距,經典實現就是1.2w個連接連上來還是這樣,就是內存占用多一點:

            Cpu

            Memory

            Threads

            handles

            0

            112068k

            7

            12280

             

            習慣上總有人喜歡拿epolliocp來對比,我到現在也沒看到真正公平的對比,就算是相對公平的也沒見到,因為在我看來,要對比硬件應該是一樣的,os都應該是最新的,最重要的是,server端程序應該都是發揮了各自優勢的,如果拿我這里的實現2去代表iocp的水平和epoll對比,勢必造成比epoll差很多的結果,然而這顯然是不正確的。

             

            epoll經典多線程模式實際實現和實現2很相似,理論上也有類似的線程切換問題,不知道效率怎樣。

             

             

            Posted on 2011-02-01 10:48 袁斌 閱讀(11969) 評論(3)  編輯 收藏 引用 所屬分類: c++網絡

            Feedback

            # re: Windows下兩種iocp實現的差距[未登錄]  回復  更多評論   

            2011-02-02 10:28 by by
            iocp的優勢就是系統調度的工作線程,他會盡量進行無切換的線程調度。我之前做過試驗,壓力小時,工作線程幾乎只用到了第一個。你用固定的io線程正是摒棄的iocp的這個優勢。
            epoll的優勢是高效的poll,但是他並不涉及線程,所有的線程處理都是靠線程系統本身來調度,並不會去針對epoll優化。並且epoll管理的只是狀態,並不會關心io操作本身,這也加重了編碼的負擔,以epoll為基礎的各種網絡框架參差不齊。
            以前我用的時候,是以單線程epoll,多線程處理狀態的方式建立了框架。io操作都分布到多個線程。所有的狀態都放進一個隊列中,等待io線程去取用。

            # re: Windows下兩種iocp實現的差距  回復  更多評論   

            2011-02-02 11:43 by 袁斌
            @by
            iocp編程理論上比epoll困難,因為:
            1、winsock系列函數眾多,常用的也有幾十個函數,而且參數眾多,而*nix只有區區幾個函數。
            2、epoll函數通知之后是非阻塞同步調用,而iocp是異步調用,更難理解,編程也更復雜。
            3、iocp模式的框架幾乎沒有單線程模式的,而epoll的框架很多都是單線程的,這和iocp的多線程框架相比難度降低了很多。當然這個不絕對,要視不同實現而定。
            iocp異步多線程模式的確是加大了資源管理的難度,我看過很多網絡框架的實現,幾乎都在這上面花了很多精力,但處理得好的極少,即使是無錯的都不多。所以也沒見過幾個寫得好的框架,同樣采用iocp的不同實現,效率相差可能超過百倍,這可能比epoll的不同框架差距更大。
            最近的frame2中IO線程分組調度是為了給每個io線程綁定特殊tls數據,并使得這些線程可直接接收指定消息更新tls數據,標準框架還是經典模式的,使用好多年了,高效穩定可靠。

            # re: Windows下兩種iocp實現的差距  回復  更多評論   

            2011-02-04 11:52 by 楊粼波
            by說的在理.


            iocp可以看看這篇文章,挺好的.
            http://wenku.baidu.com/view/a1f11287bceb19e8b8f6ba2d.html
            久久亚洲国产成人影院网站| 99久久久国产精品免费无卡顿 | 亚洲人AV永久一区二区三区久久| 欧美一区二区三区久久综| 久久人人爽人人爽人人av东京热| 亚洲va久久久噜噜噜久久天堂 | 亚洲美日韩Av中文字幕无码久久久妻妇 | 久久综合九色综合网站 | 亚洲精品97久久中文字幕无码| 久久久亚洲欧洲日产国码二区| 国产精品成人精品久久久| 老男人久久青草av高清| 国产精品亚洲美女久久久| 伊人久久综合无码成人网| 天天综合久久久网| 韩国免费A级毛片久久| 亚洲а∨天堂久久精品9966| 9久久9久久精品| 中文国产成人精品久久不卡 | 欧美日韩精品久久久久| 国产精品99久久久久久董美香 | 99久久香蕉国产线看观香| 久久综合丝袜日本网| 精品国产乱码久久久久久1区2区| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 国产精品美女久久久m| 亚洲综合伊人久久大杳蕉| 午夜视频久久久久一区 | 日韩精品久久无码人妻中文字幕| 久久久久久av无码免费看大片| 久久不射电影网| 狠狠色丁香婷婷综合久久来| 精品久久久久久久久午夜福利| 午夜天堂精品久久久久| 成人久久免费网站| 久久久无码精品亚洲日韩按摩| 99精品久久久久久久婷婷| 色诱久久久久综合网ywww| 97久久精品无码一区二区天美| 乱亲女H秽乱长久久久| 伊人久久精品无码av一区|