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

 

IOCP-Tips


這個問題是這樣,如果在接收端(WSARecv)投遞了一個200字節的WSABUF,那麼你的工作器線程處理完成通知的時候,首先收到第一個200字節,此時你可以繼續投遞接收下來的200個字節(注意了,是得到上一個200字節通知并保存處理了才投遞下一個)這樣才能保證你的接收和處理1000個字節不亂。如果你一開始就投遞(而不是投遞一個之後,在得到通知處理之後依次投遞)了5個WSARecv,對應5個單IO操作數據,會有5個通知在隊列,當然在隊列裏這5個完成包順序是正確的。問題在于,你有多個工作器線程來分別處理這些通知,那麼雖然隊列裏是正確的,但你的工作器線程在處理通知和保存數據的時候,保存這些數據有可能出現亂序。根源在于投遞WSARecv的方式。解決方案雖然有,就是對發送的包加上編號header,在工作器線程中保存200字節的時候根據編號來處理.


1。IOCP一般只用于“響應socket的recv消息”,發送數據時,其線程載體未必是IOCP線程,建議使用其它線程池的線程(IOCP本質上就是1個線程池,速度稍微快一點而已)來處理業務邏輯;

2。IOCP照樣可用于“長連接socket”,無論是“大數量的并發訪問”還是“長時間的事務處理”,只要在收到數據之后,把數據投遞到另外1個線程池里處理,而IOCP就立即返回了,不會造成任何socket層面的延遲和阻塞(即:轉換處理事務的線程載體)。本人在win2k下測試過最高4000個并發連接(P2-350,28M);

3。我在項目里寫的服務器,用3個線程池:第1線程池是IOCP,處理recv消息;第2線程池是普通線程池,處理程序事務;第3線程池是普通線程池,用來send網絡數據;


--------------
我一般把你第三個線程池和第一個重合起來,這樣效率會更高。



我來個總結:
1,我會創建cpu*4的線程數處理,res,and send.
2.我會用cpu*8的線程數處理所有事務。

同時post cpu*4個accept,這樣同時最大的并行accept就會是cpu*4;
對于每個accpte的clinet post 1 read


接收的情況:
當clienta收到一個完成通知的時候,處理buff,把結果(list)放到client結點中,post event(注意給clienta ->addref())給2,2派出一個idle thread to 處理clienta ,clienta->release().
N個client的時候,情況類是。

發送情況。
在2中業務和暴風雨一樣復雜,而對于每個結點來說,都是single thread的,如果2沒有idle的線程,對于和結點clienta一樣的其他結點來說,他們的包結果來不級處理的時候,會list到自己的結點上。直到2有idle的線程來處理。但1中的線程還在快樂的接收的自己數據。
當2中某個thread的接受到一個命的時候,比如要發送一個數據,2 post event to 1,1從clienta中的list取出一個待發包,post write.這樣可以避免多個線程對同一個socket post wirte,大家都知道如果一個socket 在pending狀態時,不能對同一個overlay發起兩個post write.我們之所以用一個Overlay而不用多個,是為了程序著想,不需要太復雜。因為對于同一個包,有可能需要post 多次。這樣,我們可以通過結點的記錄上次發送了多少byte.從而正確的從上次的offsize post.

業務處理上:
我一般不會把分析包的fuction放在io處理線程中,也就是iocp中,我會暴路一個接口類,比如一個pure class.這樣做,可以很好的把類分離,并且可以應用到不同的應用中。
從上面的分析可以看出,真正的執行者肯定在2中,當2有一個包分析完成的時候,我會post一個event給2,也就是自己發事件給自己。讓2分配出另一個線程來處理業務,而原來的線程可以繼續分析包。2->2的情況,也不是一概而論,看具體的業務。但這樣做,就可以比較高效了。







我現在的處理方式上面,與樓上的有點不一樣.線程數量上面我不會固定,也就是不受CPU的多少而限制.但是會給出一個同步運行線程數參考值.比如CPU*2.但是實際運作過程當中會由于有多個網絡事件到來,而可能這個值會被耗光,也就是在某個時間里沒有線程處于GetQueuedCompletionStatue阻賽來處理下一個網絡事件,此時我就會考慮再添加一個例外線程,來做等待.由于多出了一個例外線程,所以可能已經超過允許同時運行的線程數量參考值,則哪一個線程完成任務后先做值檢測,若超出則看是處于阻塞狀態的線程數是否達到兩個,若是則自行結束(這時候會帶一個麻煩事情就是,該線程的退出會引發由其發出的I/O請求被取消,也會有一個網絡事件).
不過我發送時是直接使用WSASend拉交,也就是說可能會有兩個線程同時工作于一個連接之上.只是當有執行WSASend時,Sending計數加1,而下一輪需要發送時,先檢測Sending計數.如果有Sending,則直接把數據包附加到Sending隊列,如此也可以保證數據的順序性,同時不需要PostQueuedCompletionStatus,少一個切換過程,并且實現真正意義上的重疊IO,對于處理發送完成事件的線程,則可以一直發送WSASend到沒有待發數據為止,每一次完成通知則扣減一個完成計數,每提交一次WSASend則增加一個計數.
由于有多個線程引用一個連接的上下文信息,如果在刪除時直接刪除,則會報錯,所以在需要設置刪除前,先置刪除標識,所有線程遇到該標識將不再發送WSASend/WSARecv,另由一個檢測線程來對沒有(發送和接收)計數的數據進行清理(記得closesocket先,以阻止所有后來的網絡事件,在下一次檢測過程當中清理為其分配的資源,并刪除).
檢測線程主要有兩項工作,一是清理垃圾,二是針對不良連接,也就是在一段時間內沒有任何I/O操作的連接進行清理,也就是說如果是自己的客戶端則最好是在沒有數據交互的情況下發送時脈信息,對于部分需要驗證的服務,也可以在此對超時未進行身份驗證的連接清理掉.







從我個人做過的項目中講,一個連接就應該同時只會有1個r + 1個s 被投遞,否則出現工作線程恰逢時間片切換(多核CPU上尤其小心),網絡粘包半包時,邏輯協議包的解析上極為困難。
所謂廣播消息,往往只是部分廣播(例如區域同步),這個由邏輯層決定需要對哪些session進行消息發送就行了,socket層要做的只是給指定socket發送消息。
無論r/s,都應該有自己的緩沖隊列,r的用于處理粘包半包,s的用于流量緩沖控制。
此外,在我自己的應用中,網絡模塊(獨立進程)收到完整數據(能成功解析出邏輯包),再使用namedpipe(也用IOCP)轉發給具體工作進程,反向流程依然

posted on 2011-08-02 11:06 Vcer-JZ 閱讀(667) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

統計

隨筆分類

隨筆檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美午夜在线视频| 欧美成人免费全部| 国产一区二区久久| 久久久精品动漫| 欧美国产日韩精品| 洋洋av久久久久久久一区| 欧美日韩精品是欧美日韩精品| av不卡免费看| 久久黄金**| 亚洲欧洲在线看| 欧美日韩18| 香蕉久久夜色精品| 欧美顶级艳妇交换群宴| 亚洲午夜激情免费视频| 国产欧美日韩在线观看| 麻豆免费精品视频| 一区二区三区**美女毛片| 久久久美女艺术照精彩视频福利播放 | 亚洲综合首页| 美女成人午夜| 亚洲素人一区二区| 国内免费精品永久在线视频| 欧美成人亚洲| 亚洲欧美在线一区| 亚洲日韩欧美一区二区在线| 亚洲欧美卡通另类91av| 亚洲国产精品传媒在线观看 | 日韩视频一区二区在线观看| 国产精品久久久久久久久久妞妞| 久久久国产精彩视频美女艺术照福利 | 亚洲一区二三| 欧美黄在线观看| 亚洲欧美日韩一区二区在线| 亚洲福利精品| 国产麻豆成人精品| 欧美另类亚洲| 久久亚洲一区二区| 亚洲一区二区在线视频| 亚洲欧洲一区二区天堂久久| 久久久久久婷| 亚洲欧美在线磁力| 亚洲美女在线看| 亚洲福利av| 国产一区二区三区四区在线观看| 欧美三区在线视频| 欧美va亚洲va日韩∨a综合色| 性欧美暴力猛交69hd| 这里只有精品视频在线| 亚洲黄色影片| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美一级黄色网| 亚洲影院免费观看| 99在线视频精品| 亚洲精品国产精品久久清纯直播 | 欧美 日韩 国产 一区| 欧美亚洲一区在线| 亚洲一区三区视频在线观看| 日韩视频在线一区| 亚洲黑丝一区二区| 亚洲国产日韩一级| 欧美激情在线有限公司| 麻豆av一区二区三区久久| 久久久久久久久久码影片| 欧美一级视频免费在线观看| 亚洲一区图片| 亚洲自拍偷拍一区| 亚洲图片自拍偷拍| 亚洲一区二区欧美| 亚洲欧美日本国产专区一区| 亚洲一区二区三区免费观看| 亚洲专区在线| 亚洲欧美日韩精品| 欧美伊人久久| 久久精品论坛| 久久中文精品| 欧美国产三级| 亚洲国产成人porn| 亚洲精品国久久99热| 亚洲精品日日夜夜| 国产精品99久久久久久久女警| 一道本一区二区| 亚洲自拍偷拍色片视频| 欧美一区二区三区喷汁尤物| 久久九九久精品国产免费直播| 久久久精品午夜少妇| 美女黄毛**国产精品啪啪| 欧美激情一二三区| 国产精品av一区二区| 国产日韩精品在线观看| 在线视频观看日韩| 一区二区欧美视频| 性感少妇一区| 免费观看在线综合色| 亚洲国产日韩在线| 亚洲视频在线观看免费| 欧美在线视频观看| 欧美国产免费| 国产精品一区久久久| 一区二区三区在线免费视频| 亚洲精品久久久一区二区三区| 亚洲视频在线一区| 久久精品欧美日韩精品| 欧美电影在线| 亚洲在线日韩| 麻豆精品视频在线| 国产精品黄色| 亚洲大片一区二区三区| 亚洲视频免费在线观看| 久久一区二区三区国产精品 | 欧美亚洲一区在线| 蜜臀久久久99精品久久久久久| 亚洲片在线资源| 欧美一区二区三区日韩视频| 欧美激情第3页| 国产日韩欧美自拍| av成人黄色| 猫咪成人在线观看| 一区二区三区日韩在线观看| 久久久一区二区| 国产精品日韩欧美一区| 亚洲国产精品尤物yw在线观看| 亚洲综合三区| 亚洲激精日韩激精欧美精品| 午夜视频一区二区| 欧美午夜精品久久久久久人妖 | 亚洲欧美日韩中文视频| 欧美成人精品在线视频| 国产亚洲激情| 亚洲综合欧美日韩| 亚洲欧洲精品一区二区三区不卡| 欧美专区亚洲专区| 国产精品久久久久一区| 亚洲理论电影网| 免费在线视频一区| 欧美在线免费视屏| 国产精品推荐精品| 9国产精品视频| 欧美成人午夜视频| 欧美在线网站| 国产欧美一区二区三区国产幕精品| 一区二区激情小说| 亚洲国产国产亚洲一二三| 久久精品国产69国产精品亚洲| 国产精品拍天天在线| 在线视频欧美日韩| 亚洲日本无吗高清不卡| 美女视频黄a大片欧美| 今天的高清视频免费播放成人| 欧美一级大片在线观看| 亚洲小说区图片区| 国产精品mm| 亚洲影视中文字幕| 亚洲视频狠狠| 国产精品蜜臀在线观看| 亚洲欧美bt| 亚洲在线免费| 国产农村妇女精品一区二区| 午夜亚洲性色视频| 亚洲在线不卡| 国产香蕉97碰碰久久人人| 久久av资源网| 欧美在线不卡视频| 黑人极品videos精品欧美裸| 欧美jizzhd精品欧美巨大免费| 国内精品久久久久影院优| 久久女同互慰一区二区三区| 欧美伊人久久久久久午夜久久久久 | 亚洲国产日韩美| 欧美大色视频| 国产精品99久久久久久www| 一本久道久久综合婷婷鲸鱼| 欧美特黄一级| 欧美在线免费| 久久久久久亚洲精品不卡4k岛国| 精品成人在线视频| 亚洲第一久久影院| 欧美日韩国产综合视频在线观看中文| 99国内精品久久久久久久软件| 亚洲美女精品成人在线视频| 最新国产成人av网站网址麻豆| 欧美第一黄色网| 亚洲午夜电影网| 欧美一区二区三区在线播放| 尤物九九久久国产精品的分类| 亚洲国产aⅴ天堂久久| 欧美性色综合| 久久久视频精品| 欧美大片一区| 午夜亚洲一区| 久久婷婷亚洲| 亚洲午夜91| 久久成人免费视频| 日韩特黄影片| 亚洲欧美变态国产另类| 1024成人网色www| 99这里只有精品| 激情一区二区三区| 日韩午夜视频在线观看| 国内精品久久久| 亚洲乱码日产精品bd|