青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

CppExplore

一切像霧像雨又像風

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  29 隨筆 :: 0 文章 :: 280 評論 :: 0 Trackbacks

作者:CppExplore 網址:http://www.shnenglu.com/CppExplore/
本章主要列舉服務器程序的各種網絡模型,示例程序以及性能對比后面再寫。
一、分類依據。服務器的網絡模型分類主要依據以下幾點
(1)是否阻塞方式處理請求,是否多路復用,使用哪種多路復用函數
(2)是否多線程,多線程間如何組織
(3)是否多進程,多進程的切入點一般都是accept函數前
二、分類。首先根據是否多路復用分為三大類:
(1)阻塞式模型
(2)多路復用模型
(3)實時信號模型
三、詳細分類。
1、阻塞式模型根據是否多線程分四類:
(1)單線程處理。實現可以參見http://www.shnenglu.com/CppExplore/archive/2008/03/14/44509.html后面的示例代碼。
(2)一個請求一個線程。
主線程阻塞在accept處,新連接到來,實時生成線程處理新連接。受限于進程的線程數,以及實時創建線程的開銷,過多線程后上下文切換的開銷,該模型也就是有學習上價值。
(3)預派生一定數量線程,并且所有線程阻塞在accept處。
該模型與下面的(4)類似與線程的領導者/追隨者模型。
傳統的看法認為多進程(linux上線程仍然是進程方式)同時阻塞在accept處,當新連接到來時會有“驚群”現象發生,即所有都被激活,之后有一個獲取連接描述符返回,其它再次轉為睡眠。linux從2.2.9版本開始就不再存在這個問題,只會有一個被激活,其它平臺依舊可能有這個問題,甚至是不支持所有進程直接在accept阻塞。
(4)預派生一定數量線程,并且所有線程阻塞在accept前的線程鎖處。
一次只有一個線程能阻塞在accept處。避免不支持所有線程直接阻塞在accept,并且避免驚群問題。特別是當前linux2.6的線程庫下,模型(3)沒有存在的價值了。另有文件鎖方式,不具有通用性,并且效率也不高,不再單獨列舉。
(5)主線程處理accept,預派生多個線程(線程池)處理連接。
類似與線程的半同步/半異步模型。
主線程的accept返回后,將clientfd放入預派生線程的線程消息隊列,線程池讀取線程消息隊列處理clientfd。主線程只處理accept,可以快速返回繼續調用accept,可以避免連接爆發情況的拒絕連接問題,另加大線程消息隊列的長度,可以有效減少線程消息隊列處的系統調用次數。
(6)預派生多線程阻塞在accept處,每個線程又有預派生線程專門處理連接。
3)和(4)/(5)的復合體。
經測試,(5)中的accept線程處理能力非常強,遠遠大于業務線程,并發10000的連接數也毫無影響,因此該模型沒有實際意義。
總結:就前五模型而言,性能最好的是模型(5)。模型(3)/(4)可以一定程度上改善模型(1)的處理性能,處理爆發繁忙的連接,仍然不理想。。阻塞式模型因為讀的阻塞性,容易受到攻擊,一個死連接(建立連接但是不發送數據的連接)就可以導致業務線程死掉。因此內部服務器的交互可以采用這類模型,對外的服務不適合。優先(5),然后是(4),然后是(1),其它不考慮。
2、多路復用模型根據多路復用點、是否多線程分類:
以下各個模型依據選用select/poll/epoll又都細分為3類。下面個別術語采用select中的,僅為說明。
(1)accept函數在多路復用函數之前,主線程在accept處阻塞,多個從線程在多路復用函數處阻塞。主線程和從線程通過管道通訊,主線程通過管道依次將連接的clientfd寫入對應從線程管道,從線程把管道的讀端pipefd作為fd_set的第一個描述符,如pipefd可讀,則讀數據,根據預定義格式分解出clientfd放入fd_set,如果clientfd可讀,則read之后處理業務。
此方法可以避免select的fd_set上限限制,具體機器上select可以支持多少個描述符,可以通過打印sizeof(fd_set)查看,我機器上是512字節,則支持512×8=4096個。為了支持多余4096的連接數,此模型下就可以創建多個從線程分別多路復用,主線程accept后平均放入(順序循環)各個線程的管道中。創建5個從線程以其對應管道,就可以支持2w的連接,足夠了。另一方面相對與單線程的select,單一連接可讀的時候,還可以減少循環掃描fd_set的次數。單線程下要掃描所有fd_set(如果再最后),該模型下,只需要掃描所在線程的fd_set就可。
(2)accept函數在多路復用函數之前,與(1)的差別在于,主線程不直接與從線程通過管道通訊,而是將獲取的fd放入另一緩存線程的線程消息隊列,緩存線程讀消息隊列,然后通過管道與從線程通訊。
目的在主線程中減少系統調用,加快accept的處理,避免連接爆發情況下的拒絕連接。
(3)多路復用函數在accept之前多路復用函數返回,如果可讀的是serverfd,則accept,其它則read,后處理業務,這是多路復用通用的模型,也是經典的reactor模型。
4)連接在單獨線程中處理。
以上(1)(2)(3)都可以在檢測到cliendfd可讀的時候,把描述符寫入另一線程(也可以是線程池)的線程消息隊列,另一線程(或線程池)負責read,后處理業務。

(5)業務線程獨立,下面的網絡層讀取結束后通知業務線程。
以上(1)(2)(3)(4)中都可以將業務線程(可以是線程池)獨立,事先告之(1)、(2)、(3)、(4)中read所在線程(上面1、2、4都可以是線程池),需要讀取的字符串結束標志或者需要讀取的字符串個數,讀取結束,則將clientfd/buffer指針放入業務線程的線程消息隊列,業務線程讀取消息隊列處理業務。這也就是經典的proactor模擬。
總結:模型(1)是拓展select處理能力不錯選擇;模型(2)是模型(1)在爆發連接下的調整版本;模型(3)是經典的reactor,epoll在該模型下性能就已經很好,而select/poll仍然存在爆發連接的拒絕連接情況;模型(4)(5)則是方便業務處理,對模型(3)進行多線程調整的版本。帶有復雜業務處理的情況下推薦模型(5)。根據測試顯示,使用epoll的時候,模型(1)(2)相對(3)沒有明顯的性能優勢,(1)由于主線程兩次的系統調用,反而性能下降。
3、實時信號模型:
使用fcntl的F_SETSIG操作,把描述符可讀的信號由不可靠的SIGIO(SYSTEM V)或者SIGPOLL(BSD)換成可靠信號。即可成為替代多路復用的方式。優于select/poll,特別是在大量死連接存在的情況下,但不及epoll。
四、多進程的參與的方式
(1)fork模型。fork后所有進程直接在accept阻塞。以上主線程在accept阻塞的都可以在accept前fork為多進程。同樣面臨驚群問題。
(2)fork模型。fork后所有進程阻塞在accept前的線程鎖處。同線程中一樣避免不支持所有進程直接阻塞在accept或者驚群問題,所有進程阻塞在共享內存上實現的線程互斥鎖。
(3)業務和網絡層分離為不同進程模型。這個模型可能是受unix簡單哲學的影響,一個進程完成一件事情,復雜的事情通過多個進程結合管道完成。我見過進程方式的商業協議棧實現。自己暫時還沒有寫該模型的示例程序測試對比性能。
(4)均衡負載模型。起多個進程綁定到不同的服務端口,前端部署lvs等均衡負載系統,暴露一個網絡地址,后端映射到不同的進程,實現可擴展的多進程方案。
總結:個人認為(1)(2)沒什么意義。(3)暫不評價。(4)則是均衡負載方案,和以上所有方案不沖突。
以上模型的代碼示例以及性能對比后面給出。

posted on 2008-03-21 17:16 cppexplore 閱讀(11557) 評論(16)  編輯 收藏 引用

評論

# re: 【原創】系統設計之 網絡模型(二) 2008-03-21 19:17 sgsoft
現在的高性能服務器多采用異步IO,在Windows上,使用IOCP,在AIX上,使用AIO 系統對象,在Solaris,HP-UX上,都有不同實現。但大多使用了OS的異步事件隊列來防止連接阻塞。

是否缺異步通信服務器模型呢?Win和*inx不一樣的實現。  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-21 22:05 cppexplore
@sgsoft
win上實現了socket上真正的AIO,*inx上基本上都沒有針對socket實現真正的AIO。本文主要針對linux平臺,其他平臺不很熟悉,并且沒機會接觸,也無法寫代碼進行測試,因此AIO的模型就沒涉及。
另詳細分類2里的模型(5)模擬了AIO的實現,也就是proactor的模擬。  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二)[未登錄] 2008-03-22 12:27
我一直采用的sever處理模型是,父進程創建出監聽socket,然后fork出子進程,子進程中在accept出阻塞,處理IO時采用多路復用模型(select之類的),個人感覺效率還是不錯的.

BTW:看來兄臺也是server程序員,有時間多多交流:)
  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-24 12:16 cppexplore
@創
你的模型是不是和細分類2中(1)的模型類似啊,直接使用線程不更好嘛。如果是用epoll的話,直接單線程在epoll處wait就好。

以前去你blog上逛過,呵呵,多多交流!  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-24 15:24 ecopgm
在下是新手,想問幾個問題:
1. 上面的模型,都是將accept獨立處理,這樣可以接受爆發連接,然后讀寫和邏輯處理都是交給下級線程池。那這樣的模型跟主線程里accept并讀寫,然后下級線程池處理邏輯,在性能上區別有多大呢?
2. accept即使接受了所有爆發連接,但是生產者快,消費者慢,加上隊列的流控,這樣還是沒什么用啊,連接還是會被丟掉
3. 消息隊列和管道,這兩種通信方式,在性能上有什么差異?管道更好嗎,比消息隊列更少的同步操作?  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二)[未登錄] 2008-03-24 19:32 CppExplore
@ecopgm
1、上面的模型并不是都將accept獨立處理啊?各種情況都有的。“下級線程池處理邏輯”這個就多說了,這個和accept/讀寫是否在同一線程不沖突,不同線程的時候也可以把邏輯獨立出來。各種模型性能上的數據對比后面的文章會給出具體的數據。概括說下,不單獨處理accept,除epoll方式外,爆發連接都會出現拒絕連接情況,比如ab(apache帶的工具)并發1w的時候。當然并非所有的服務器能是要處理這種爆發的斷連接。在不拒絕連接的情況下,比如并發1000,性能還是差不多的。
2、連接被拒絕是在三路握手階段,accept接受的所有連接,連接就不會被丟掉了啊,生產者的確是非常快,消費者很慢,但不影響client把數據發送到這邊的接受緩沖區。服務器沒有發送reset的必要,client也不會發fin分節,連接自然不會被丟掉。
3、消息隊列自然比管道快,這里的消息隊列不是ipc的消息隊列,全部實現在用戶態,可以看下上一篇《線程二》有消息隊列的實現,比涉及系統調用的管道快,管道怎么也是屬于進程間通訊的方式。但是消息隊列不能象管道一樣把文件描述符放到fd_set里,供select監控。  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-24 22:11 ecopgm
@CppExplore
我先前理解錯了,能不能接受爆發連接,是取決于accept的速度。我對并發的概念沒想清楚,呵呵,謝謝。  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二)[未登錄] 2008-03-24 22:34 CppExplore
@ecopgm
這么晚還沒睡覺啊。
這里說的爆發的連接,也可以說是單點并發。你想的并發是不是同時在線的連接啊?一般都是追求的同時在線連接數。爆發連接的場景畢竟也不多。尤其是對音頻視頻等多媒體的應用服務器,限于網絡帶寬,也不可能有爆發的連接出現,有的話直接拒絕連接就可以接受,呵呵。  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-24 22:41 ecopgm
對的,我想成請求數了,覺得如果1萬個連接到了,每個發個消息過來,邏輯層處理不了這么多,而隊列又裝不下,那這個請求就丟失了,請求不是連接,呵呵  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二) 2008-03-25 10:11 游客
好文章,贊一個!!  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二)[未登錄] 2008-04-30 20:05 true
下面這個假想的模型在上面有體現,但不太好歸類,描述如下:
1.主線程一直accept
2.有一個線程在監聽epoll事件
3.accept后將連接加入2中的epoll監聽(在epoll中add 這個fd時是線程安全的嗎?)
4.epoll檢測到某fd可讀時,交給業務邏輯線程t1處理(這時需要在epoll中del這個fd嗎),在t1中根據請求的類型給fd發送了一些數據,然后再加入到epoll中?。即2中的epoll只監聽可讀  回復  更多評論
  

# re: 【原創】系統設計之 網絡模型(二)[未登錄] 2008-05-01 07:53 CppExplore
@true
:)
這個就是文中2(1)的模型,主線程accept,將新的clientfd通過管道傳遞給epoll線程,管道的讀端也在epoll的監控之下。不使用管道的話,sockpair也可以,不過它也是基于管道實現。
管道的連接是不可回避的,因為epoll線程在epoll_wait處等待,要實時的告訴epoll監控某fd,一定要epoll_wait返回,執行加入操作,再繼續epoll_wait。
后面的業務線程處理也就是2(4)和2(5)模型。
2(3)是單線程的模型,就epoll而言,單線程的性能最好,也就是epoll+單線程=高性能。業務線程當然是根據需要后接線程,測試的數據一直沒時間發出來,過幾天發下。  回復  更多評論
  

# re: 【原創】技術系列之 網絡模型(二)[未登錄] 2008-06-19 12:12 Jeff
想問一下,不可以用UDP來接收請求數據嗎,為什么非要用TCP,UDP不可靠?  回復  更多評論
  

# re: 【原創】技術系列之 網絡模型(二)[未登錄] 2008-06-19 13:26 CppExplore
@Jeff
udp也可以啊,模型簡單,在一個端口上復用就可以了,沒什么可寫的。  回復  更多評論
  

# re: 【原創】技術系列之 網絡模型(二) 2009-04-19 20:49 蛙蛙
你怎么2W連接就滿足了呀,下面這個人弄了單機50W連接。
http://blog.sina.com.cn/s/blog_466c66400100cfrj.html  回復  更多評論
  

# re: 【原創】技術系列之 網絡模型(二) 2015-03-27 17:13 ckw
文中2(1)的模型 使用select時也無法突破最大fd=1024的限制啊!  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区二区三区四区视频| 欧美精品在线网站| 国产一区亚洲| 久久在线91| 久久欧美肥婆一二区| 亚洲国产日韩一级| 亚洲人在线视频| 欧美精品大片| 午夜激情久久久| 久久精品国产一区二区三区免费看| 国外成人性视频| 暖暖成人免费视频| 欧美日韩国产色视频| 亚洲欧美激情诱惑| 欧美在线免费视屏| 亚洲欧洲视频| 亚洲一区二区av电影| 伊人男人综合视频网| 亚洲国产日韩精品| 国产精品久久久久久久久动漫| 欧美在线亚洲综合一区| 久久亚洲综合色一区二区三区| 亚洲麻豆视频| 小嫩嫩精品导航| 亚洲精品视频在线播放| 亚洲欧美日韩精品久久久久| 在线精品视频免费观看| 一区二区三区视频在线播放| 一区二区在线观看视频在线观看| 亚洲精品美女91| 亚洲人体偷拍| 国产一区二区三区在线观看免费 | 欧美a级一区二区| 欧美精品一区在线播放| 欧美一区二区三区啪啪| 欧美激情第8页| 久久精品国产一区二区三| 欧美另类变人与禽xxxxx| 久久久久欧美精品| 国产精品第一区| 亚洲欧洲日韩综合二区| 国产亚洲欧美一级| 亚洲一区999| 日韩小视频在线观看| 久久久久久久尹人综合网亚洲| 亚洲欧美99| 欧美日韩精品一区二区在线播放 | 一区在线观看视频| 亚洲欧美日韩中文视频| 亚洲婷婷免费| 欧美黄网免费在线观看| 欧美福利电影网| 精品51国产黑色丝袜高跟鞋| 午夜精品美女自拍福到在线 | 韩国av一区二区三区| 亚洲一区二区黄| 亚洲性视频网站| 欧美人与性动交α欧美精品济南到 | 久久一区国产| 免费成年人欧美视频| 韩国一区二区三区在线观看| 亚洲欧美一区二区激情| 欧美亚洲免费电影| 国产麻豆精品视频| 午夜精品久久久久久久久久久 | 亚洲国产精品v| 久久阴道视频| 欧美成人福利视频| 亚洲国产一区视频| 欧美本精品男人aⅴ天堂| 亚洲第一综合天堂另类专| 在线日本高清免费不卡| 美女成人午夜| 91久久精品一区二区别| 一本久道久久综合中文字幕| 欧美日韩免费一区| 亚洲社区在线观看| 久久精品国产99国产精品| 国产欧美日韩精品丝袜高跟鞋| 欧美亚洲视频| 蜜臀a∨国产成人精品| 亚洲黄色免费| 欧美人与禽性xxxxx杂性| 亚洲视频在线免费观看| 久久国产日本精品| 亚洲高清资源| 欧美日韩色一区| 亚洲一区二区三区午夜| 欧美亚洲日本一区| 国产精品入口夜色视频大尺度| 亚洲网址在线| 免费成年人欧美视频| av不卡免费看| 国产精品一区视频网站| 久久人人超碰| 夜夜嗨av一区二区三区免费区| 欧美一区视频在线| 亚洲人成免费| 国产精品资源| 欧美成人嫩草网站| 亚洲香蕉网站| 亚洲大片免费看| 亚洲欧美视频| 最新精品在线| 国产日韩精品一区二区| 欧美韩国在线| 欧美一区二视频| 9l国产精品久久久久麻豆| 久久乐国产精品| 亚洲视频1区| 1000部精品久久久久久久久| 国产精品va在线播放| 美脚丝袜一区二区三区在线观看 | 久久久91精品| 亚洲天天影视| 亚洲欧洲视频| 激情av一区二区| 国产精品日韩精品欧美在线| 欧美成人69| 久久国产日韩| 亚洲欧美日韩精品一区二区| 日韩视频欧美视频| 欧美好骚综合网| 免费日韩av| 久久久精品日韩欧美| 欧美亚洲网站| 中文在线资源观看网站视频免费不卡 | 亚洲欧美一区二区激情| 亚洲精品免费在线| 亚洲第一免费播放区| 久久视频一区二区| 久久精品国产99精品国产亚洲性色| 一本一本久久| 99精品热视频| 99在线热播精品免费| 亚洲欧洲精品一区二区精品久久久| 国产一区二区你懂的| 国产日韩欧美另类| 国产欧美一区二区精品性色| 国产精品久久久久一区二区| 欧美日韩中文另类| 欧美日韩亚洲综合在线| 欧美日韩国产成人在线免费| 欧美精品一区二区三| 欧美激情女人20p| 欧美福利视频| 欧美人与禽猛交乱配视频| 欧美色精品天天在线观看视频| 欧美日本韩国在线| 国产精品超碰97尤物18| 国产精品久久久久aaaa九色| 国产精品高清在线观看| 国产精品丝袜xxxxxxx| 国产欧美日韩精品一区| 极品中文字幕一区| 1000部精品久久久久久久久| 欧美在线不卡| 尤物网精品视频| 亚洲国产日韩欧美在线图片| 亚洲人成在线观看一区二区 | 国产精品老牛| 国产三级精品三级| 亚洲大片精品永久免费| 亚洲激情欧美激情| 一区二区三区四区五区精品视频 | 亚洲最新在线| 亚洲伊人色欲综合网| 欧美在线视频免费观看| 免费不卡中文字幕视频| 最新日韩中文字幕| 亚洲欧美另类在线观看| 久久久久在线观看| 欧美日韩国产精品专区| 国产毛片一区二区| 亚洲国产精品毛片| 亚洲综合日韩在线| 麻豆成人91精品二区三区| 91久久久久久久久| 午夜视频在线观看一区二区| 另类春色校园亚洲| 国产精品三级久久久久久电影| 在线播放日韩欧美| 亚洲一级一区| 欧美mv日韩mv国产网站app| 9久草视频在线视频精品| 久久久久久97三级| 国产精品久久午夜| 亚洲精品视频一区| 久久久亚洲午夜电影| 99国内精品久久| 巨胸喷奶水www久久久免费动漫| 欧美性猛交99久久久久99按摩| 狠狠色噜噜狠狠色综合久| 亚洲午夜精品一区二区| 免费亚洲网站| 午夜视频一区二区| 国产精品狠色婷| 一区二区三区色| 欧美插天视频在线播放| 欧美一区二区三区久久精品茉莉花 |