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

 

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 閱讀(663) 評論(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>
            久久亚洲高清| 亚洲一区免费网站| 欧美影视一区| 亚洲免费中文字幕| 亚洲一区二区精品在线观看| 欧美高清在线一区二区| 欧美亚洲视频一区二区| 亚洲一区三区电影在线观看| 一本色道久久综合亚洲精品高清 | 亚洲在线观看视频| 99re66热这里只有精品3直播| 欧美电影免费观看网站| 久久香蕉国产线看观看网| 狂野欧美激情性xxxx| 久久伊人精品天天| 国产精品jizz在线观看美国| 国产精品都在这里| **欧美日韩vr在线| 日韩视频在线观看免费| 亚洲欧美日韩中文视频| 久久婷婷人人澡人人喊人人爽| 欧美肥婆在线| 亚洲欧美日韩精品久久亚洲区| 久久国产88| 欧美视频在线一区| 亚洲国产精品久久久久婷婷884| 日韩视频免费观看高清完整版| 亚洲愉拍自拍另类高清精品| 美女脱光内衣内裤视频久久影院| 99精品免费网| 欧美电影美腿模特1979在线看| 国产精品一区亚洲| 亚洲人成久久| 欧美 日韩 国产精品免费观看| 亚洲精品欧美日韩专区| 午夜日韩在线观看| 欧美激情一区二区三区在线视频观看| 一本色道久久综合亚洲精品小说| 午夜精品福利视频| 久久精品首页| 欧美精品一区二区三区四区| 国产精品九九久久久久久久| 国产亚洲欧美一区在线观看| 欧美日韩一区二区三区四区五区| 亚洲欧美日韩国产精品| 久久久久久久国产| 久久久久国产精品人| 欧美一级理论性理论a| 久色婷婷小香蕉久久| 亚洲黄一区二区三区| 在线欧美一区| 亚洲男女自偷自拍图片另类| 亚洲人成免费| 久久美女性网| 久久成人免费日本黄色| 欧美电影资源| 国产精品久久国产三级国电话系列| 在线精品亚洲一区二区| 老司机免费视频久久| 欧美自拍丝袜亚洲| 国产日韩亚洲欧美综合| 久久久久一区二区| 欧美在线视频一区二区| 亚洲电影激情视频网站| 欧美1区视频| 亚洲一区二区3| 一区二区在线观看av| 欧美黄色一区| 久久久之久亚州精品露出| 久久久久久9999| 亚洲精品久久久久久一区二区| 亚洲激情一区| 国产日韩欧美精品| 亚洲精品乱码久久久久久久久| 欧美日韩免费| 亚洲电影专区| 国产午夜亚洲精品理论片色戒| 亚洲黄色片网站| 激情成人在线视频| 午夜精品一区二区三区在线播放| 一本色道久久综合亚洲精品不卡 | 亚洲免费视频网站| 狠狠色噜噜狠狠色综合久| 99精品热视频| 国产精品99久久久久久宅男| 欧美fxxxxxx另类| 亚洲国产乱码最新视频| 亚洲精一区二区三区| 蜜臀a∨国产成人精品| 亚洲国产精品久久| 亚洲精品网站在线播放gif| 久久久综合激的五月天| 欧美高清视频| 亚洲自拍16p| 国产伪娘ts一区| 久久综合网hezyo| 欧美国产免费| 欧美一二三区在线观看| 在线播放不卡| 欧美深夜影院| 久久久www成人免费精品| 欧美va亚洲va香蕉在线| 亚洲色图自拍| 在线观看视频亚洲| 99国内精品久久久久久久软件| 亚洲视频1区2区| 国产一区日韩欧美| 欧美网站在线观看| 欧美日本韩国一区| 久久综合一区二区三区| 99精品欧美一区二区蜜桃免费| 久久久久久久久久久久久女国产乱| 亚洲国产精品成人一区二区| 欧美日韩麻豆| 欧美精品午夜视频| 鲁大师成人一区二区三区 | 亚洲精品乱码久久久久| 欧美人交a欧美精品| 久久夜色精品国产噜噜av| 亚洲欧美日韩天堂一区二区| 欧美国产日韩一区二区| 久久国产福利| 欧美一级欧美一级在线播放| 亚洲免费激情| 亚洲午夜伦理| 欧美一区二区三区在线免费观看| 一区二区三区成人精品| 99riav国产精品| 亚洲亚洲精品在线观看| 一区二区三区欧美在线| 亚洲伊人伊色伊影伊综合网| 一区二区冒白浆视频| 亚洲一级高清| 久久亚洲不卡| 日韩视频在线播放| 亚洲人成啪啪网站| 在线一区免费观看| 久久精品一二三| 亚洲二区在线观看| 亚洲一区二区三区影院| 午夜宅男久久久| 免费观看亚洲视频大全| 欧美日韩免费在线视频| 亚洲手机成人高清视频| 亚洲在线观看视频| 欧美成人xxx| 国产麻豆精品在线观看| 日韩视频二区| 欧美大片在线观看一区| 亚洲男人av电影| 欧美日韩国产一区二区| 影音先锋一区| 久久久91精品国产一区二区三区| 免费在线成人| 欧美一区二区视频免费观看| 国内精品久久久久影院 日本资源| 欧美国产综合视频| 免费日韩视频| 午夜精品福利在线| 亚洲激情在线观看| 另类国产ts人妖高潮视频| 亚洲香蕉在线观看| 国外成人在线视频| 韩国av一区二区三区在线观看 | 香蕉久久夜色精品国产使用方法| 午夜免费日韩视频| 午夜精品久久久久久久久久久久久 | 欧美国产日韩精品免费观看| 亚洲精品日产精品乱码不卡| 午夜在线观看免费一区| 国产精品豆花视频| 亚洲愉拍自拍另类高清精品| 亚洲国产一区在线| 免费不卡欧美自拍视频| 亚洲国产经典视频| 亚洲国产一区二区a毛片| 宅男噜噜噜66一区二区| 亚洲精品美女久久久久| 国产精品亚洲欧美| 亚洲欧美在线免费观看| 欧美午夜免费影院| 亚洲天堂视频在线观看| 亚洲午夜久久久久久久久电影院| 国产精品美女一区二区在线观看| 亚洲永久在线| 老司机一区二区| 亚洲午夜精品久久久久久浪潮| 一区二区欧美在线| 国产一区在线免费观看| 亚洲国产精品久久久久婷婷老年| 欧美日韩国产欧| 你懂的亚洲视频| 国产一区二区三区四区hd| 日韩视频免费在线观看| 激情伊人五月天久久综合| 中国av一区| 一区二区三区四区五区视频| 欧美伊人久久久久久午夜久久久久 | 老色鬼精品视频在线观看播放| 六月丁香综合|