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

 

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 閱讀(666) 評論(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>
            欧美福利视频在线观看| 欧美va亚洲va日韩∨a综合色| 欧美 日韩 国产在线| 揄拍成人国产精品视频| 欧美在线视频日韩| 欧美一级在线播放| 国内一区二区在线视频观看| 久久久av水蜜桃| 久久精品理论片| 亚洲国内精品| 一级成人国产| 国产精品日本一区二区 | 麻豆成人综合网| 亚洲日韩欧美视频一区| 亚洲国产欧洲综合997久久| 欧美成人精品在线| 亚洲尤物视频网| 欧美中文在线字幕| 亚洲国产精品99久久久久久久久| 亚洲高清不卡一区| 国产精品捆绑调教| 久久亚洲精品一区| 欧美日韩三区| 久久婷婷国产麻豆91天堂| 欧美国产91| 欧美一区深夜视频| 免费永久网站黄欧美| 亚洲一区二区三区激情| 欧美在线日韩在线| 亚洲精品在线二区| 性欧美video另类hd性玩具| 亚洲精品美女免费| 午夜精品亚洲一区二区三区嫩草| 伊人一区二区三区久久精品| 夜夜嗨av一区二区三区| 精品成人免费| 亚洲一二三区在线观看| 亚洲国内高清视频| 欧美淫片网站| 亚洲午夜精品国产| 美女主播视频一区| 久久国产精品一区二区三区| 欧美激情综合亚洲一二区| 久久久久久久高潮| 欧美视频中文字幕| 亚洲国产欧美在线| 在线观看亚洲a| 性色av一区二区三区在线观看 | 欧美日本一区二区高清播放视频| 欧美专区中文字幕| 欧美无砖砖区免费| 亚洲国产欧美在线人成| 精品51国产黑色丝袜高跟鞋| 亚洲天堂视频在线观看| 一区二区激情视频| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲精品久久视频| 亚洲第一精品夜夜躁人人躁 | 亚洲国产一区二区三区高清 | 欧美日韩国产小视频| 欧美成人一品| 在线观看日韩欧美| 午夜视频一区| 久久成人精品无人区| 国产精品国产三级国产普通话三级| 欧美成人四级电影| 一区二区视频免费在线观看| 欧美一区二区三区免费大片| 先锋资源久久| 国产精品视频在线观看| 亚洲一区二区三区涩| 午夜日韩在线| 国产美女搞久久| 性欧美办公室18xxxxhd| 久久久久久高潮国产精品视| 国产亚洲精品久久飘花 | 欧美电影免费观看高清| 亚洲国产精品久久91精品| 久久男人资源视频| 欧美高清在线一区| 亚洲精品一区在线观看香蕉| 欧美国产成人精品| 99精品99| 欧美专区18| 一区一区视频| 欧美国产第二页| aⅴ色国产欧美| 午夜精品影院| 一区久久精品| 欧美激情第1页| 一本色道综合亚洲| 欧美在线免费一级片| 狠狠色丁香婷婷综合影院| 久久久久国色av免费观看性色| 欧美ed2k| 亚洲欧美激情在线视频| 国产婷婷一区二区| 免费亚洲视频| 日韩视频免费在线| 久久国产福利| 99精品99久久久久久宅男| 国产精品大片wwwwww| 久久av老司机精品网站导航| 亚洲国产精品t66y| 小黄鸭精品aⅴ导航网站入口 | 欧美成人性网| 亚洲欧美日韩精品在线| 久久一区二区三区四区五区| 亚洲毛片网站| 国产亚洲在线观看| 欧美日韩国产在线播放| 欧美在线看片| 一区二区三区视频观看| 欧美成人a视频| 午夜日韩av| 亚洲精品视频啊美女在线直播| 国产精品久久久久久久久借妻| 久久看片网站| 西瓜成人精品人成网站| 亚洲精品久久久久久一区二区| 久久精品国产一区二区三区免费看| 亚洲日本黄色| 国精品一区二区| 国产精品日韩精品| 欧美精品一区二区三| 久久精品一区二区三区中文字幕 | 久久久久国产一区二区| 一区二区三区国产盗摄| 在线观看国产一区二区| 国产欧美日韩精品丝袜高跟鞋 | 欧美激情一区二区三区蜜桃视频| 香蕉久久国产| 亚洲综合视频1区| 一区二区国产日产| 亚洲区中文字幕| 亚洲国产经典视频| 免费观看30秒视频久久| 久久精品一二三| 欧美一区二区高清在线观看| 亚洲无线一线二线三线区别av| 亚洲精品乱码久久久久久蜜桃91| 在线成人黄色| 激情91久久| 黄色日韩精品| 精品91免费| 精品成人国产| 在线成人av网站| 亚洲丶国产丶欧美一区二区三区 | 国产一区二区三区在线观看精品 | 欧美a级一区| 欧美一区二区在线视频| 亚洲视频在线观看网站| 亚洲美女黄网| 一区二区欧美在线| 亚洲午夜精品在线| 亚洲图片激情小说| 亚洲小视频在线观看| 亚洲视频中文| 翔田千里一区二区| 欧美亚洲网站| 久久色在线观看| 六十路精品视频| 欧美激情一区二区三区高清视频| 欧美国产综合视频| 欧美日韩一级黄| 国产精品视频免费观看| 国产日产精品一区二区三区四区的观看方式 | 亚洲精品一区二区三区不| 亚洲精选视频免费看| 99精品国产在热久久婷婷| 一区二区三区四区国产| 午夜精品久久久99热福利| 欧美在线一级视频| 男人插女人欧美| 欧美午夜电影网| 国产一区三区三区| 亚洲精品欧美在线| 亚洲欧美在线一区二区| 久久久亚洲高清| 最新国产乱人伦偷精品免费网站| 亚洲人成人99网站| 亚洲欧美日韩精品久久久久| 久久精品夜色噜噜亚洲a∨| 女同性一区二区三区人了人一| 欧美无乱码久久久免费午夜一区| 国产视频一区二区三区在线观看| 亚洲电影观看| 久久aⅴ国产紧身牛仔裤| 欧美大片18| 亚洲欧美一区二区三区久久| 免费毛片一区二区三区久久久| 国产精品v欧美精品v日韩精品| 激情视频一区二区三区| 亚洲在线黄色| 亚洲韩国日本中文字幕| 午夜视频精品| 国产精品高清一区二区三区| 1769国内精品视频在线播放| 午夜在线精品| 亚洲美女av在线播放|