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

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

IOCP與線程

author : Kevin Lynx

 

什么是完成包?

完成包,即IO Completion Packet,是指異步IO操作完畢后OS提交給應用層的通知包。IOCP維護了一個IO操作結果隊列,里面
保存著各種完成包。應用層調用GQCS(也就是GetQueueCompletionStatus)函數獲取這些完成包。

最大并發線程數

在一個典型的IOCP程序里,會有一些線程調用GQCS去獲取IO操作結果。最大并發線程數指定在同一時刻處理完成包的線程數目。
該參數在調用CreateIoCompletionPort時由NumberOfConcurrentThreads指定。

工作者線程

工作者線程一般指的就是調用GQCS函數的線程。要注意的是,工作者線程數和最大并發線程數并不是同一回事(見下文)。工作者
線程由應用層顯示創建(_beginthreadex 之類)。工作者線程通常是一個循環,會不斷地GQCS到完成包,然后處理完成包。

調度過程

工作者線程以是否阻塞分為兩種狀態:運行狀態和等待狀態。當線程做一些阻塞操作時(線程同步,甚至GQCS空的完成隊列),線程
處于等待狀態;否則,線程處于運行狀態。

另一方面,OS會始終保持某一時刻處于運行狀態的線程數小于最大并發線程數。每一個調用GQCS函數的線程OS實際上都會進行記錄,
當完成隊列里有完成包時,OS會首先檢查當前處于運行狀態的工作線程數是否小于最大并發線程數,如果小于,OS會按照LIFO的順
序讓某個工作者線程從GQCS返回(此工作者線程轉換為運行狀態)。如何決定這個LIFO?這是簡單地通過調用GQCS函數的順序決定的。

從這里可以看出,這里涉及到線程喚醒和睡眠的操作。如果兩個線程被放置于同一個CPU上,就會有線程切換的開銷。因此,為了消
除這個開銷,最大并發線程數被建議為設置成CPU數量。

從以上調度過程還可以看出,如果某個處于運行狀態的工作者線程在處理完成包時阻塞了(例如線程同步、其他IO操作),那么就有
CPU資源處于空閑狀態。因此,我們也看到很多文檔里建議,工作者線程數為(CPU數*2+2)。

在一個等待線程轉換到運行狀態時,有可能會出現短暫的時間運行線程數超過最大并發線程數,這個時候OS會迅速地讓這個新轉換
的線程阻塞,從而減少這個數量。(關于這個觀點,MSDN上只說:by not allowing any new active threads,卻沒說明not allowing
what)

調度原理

這個知道了其實沒什么意義,都是內核做的事,大致上都是操作線程control block,直接摘錄<Inside IO Completion Ports>:

The list of threads hangs off the queue object. A thread's control block data structure has a pointer in it that
references the queue object of a queue that it is associated with; if the pointer is NULL then the thread is not
associated with a queue.

So how does NT keep track of threads that become inactive because they block on something other than the completion
port" The answer lies in the queue pointer in a thread's control block. The scheduler routines that are executed
in response to a thread blocking (KeWaitForSingleObject, KeDelayExecutionThread, etc.) check the thread's queue
pointer and if its not NULL they will call KiActivateWaiterQueue, a queue-related function. KiActivateWaiterQueue
decrements the count of active threads associated with the queue, and if the result is less than the maximum and
there is at least one completion packet in the queue then the thread at the front of the queue's thread list is
woken and given the oldest packet. Conversely, whenever a thread that is associated with a queue wakes up after
blocking the scheduler executes the function KiUnwaitThread, which increments the queue's active count.

參考資料

<Inside I/O Completion Ports>:
http://technet.microsoft.com/en-us/sysinternals/bb963891.aspx
<I/O Completion Ports>:
http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx
<INFO: Design Issues When Using IOCP in a Winsock Server>:
http://support.microsoft.com/kb/192800/en-us/

posted on 2008-06-23 17:32 Kevin Lynx 閱讀(4865) 評論(3)  編輯 收藏 引用 所屬分類: network

評論

# re: IOCP與線程 2008-06-23 23:45 飯中淹

@Kevin Lynx
寫iocp應用的時候,我覺得最好能夠實現工作線程就地組包,然后在組包之后,在工作線程內就地處理,這樣是對iocp和cpu資源的最佳化利用。

還有,多謝你的幫助,我才糾正了對iocp的錯誤理解。

  回復  更多評論   

# re: IOCP與線程 2010-06-04 11:02 我是豬

@飯中淹
錯了 這樣會浪費效能  回復  更多評論   

# re: IOCP與線程 2010-06-29 09:55 zhengxf

你好,我也認為寫iocp應用的時候, 應該工作線程就地組包,然后在組包之后,在工作線程內就地處理, 不知道"飯中淹" 老兄有何高見,能分享一下嗎.
  回復  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久久久久久久久一区| 久久婷婷国产综合精品青草| 亚洲自啪免费| 亚洲精品一区中文| 亚洲欧洲在线看| 一本大道久久a久久综合婷婷 | 99re6热在线精品视频播放速度| 欧美国产视频日韩| 亚洲激情一区| 欧美国产精品久久| 91久久精品久久国产性色也91 | 亚洲国产黄色| 日韩视频免费| 香蕉精品999视频一区二区| 欧美一级视频| 欧美国产在线视频| 国产精品看片资源| 亚洲国产高清在线观看视频| 日韩视频在线免费| 欧美一区二区三区的| 狼人天天伊人久久| 亚洲日韩欧美一区二区在线| 亚洲一区激情| 免费成人美女女| 国产精品丝袜白浆摸在线| 国产一区日韩二区欧美三区| 亚洲精品视频免费| 久久精品国产成人| 亚洲欧洲精品一区| 久久成人国产| 国产精品久久国产精品99gif | 欧美一区二区高清在线观看| 欧美黑人国产人伦爽爽爽| 国产精品永久免费| 亚洲精品自在在线观看| 久久精品国产亚洲一区二区三区| 亚洲大胆美女视频| 欧美一区二区在线播放| 欧美精品亚洲精品| 尤物在线观看一区| 亚洲自拍电影| 亚洲精品1区| 久久亚洲一区| 国产日韩欧美电影在线观看| 一本大道av伊人久久综合| 欧美a级片网| 久久天堂av综合合色| 狠狠色狠狠色综合| 日韩西西人体444www| 亚洲综合色激情五月| 欧美午夜女人视频在线| 一区二区欧美视频| 日韩视频三区| 午夜在线一区二区| 亚洲黄页一区| 久久久噜噜噜久久久| 国产欧美精品久久| 亚洲综合另类| 99视频精品| 欧美日韩午夜在线| 夜夜夜久久久| 亚洲精品影院| 欧美一区二区三区免费观看| 中国成人亚色综合网站| 欧美日韩日本视频| 这里只有视频精品| 99视频精品全部免费在线| 欧美另类videos死尸| 99国产精品久久久久久久成人热| 亚洲高清不卡在线| 欧美激情中文字幕一区二区| 亚洲理伦在线| 亚洲乱码精品一二三四区日韩在线| 欧美精品一区二| 一本色道婷婷久久欧美| av72成人在线| 国产欧美在线看| 久久综合色一综合色88| 久久伊人亚洲| 日韩天堂在线视频| 一个人看的www久久| 国产精品视频免费| 久久久999| 一区二区三区国产在线| 国产精品系列在线播放| 久久久久久久久久久久久9999| 久久精品九九| 一区二区高清视频在线观看| 99国产精品久久久久久久久久| 国产精品国产精品国产专区不蜜| 久久高清免费观看| 欧美电影打屁股sp| 欧美制服丝袜| 久久综合一区二区| 亚洲欧美国产三级| 久久久久久一区二区三区| 夜夜嗨av一区二区三区四季av| 一区二区三区日韩精品视频| 国产综合亚洲精品一区二| 亚洲国产黄色| 国产精品主播| 亚洲精品乱码久久久久久久久| 国产精品电影网站| 欧美国产视频在线| 亚洲欧美制服另类日韩| 久久综合999| 亚洲在线观看免费视频| 久久大逼视频| 亚洲永久免费视频| 免费在线观看一区二区| 欧美一区二区三区精品 | 亚洲午夜久久久久久久久电影院| 亚洲欧美日韩成人| 日韩视频精品在线| 久久久青草婷婷精品综合日韩| 亚洲一区二区av电影| 久久在线观看视频| 欧美中文在线字幕| 欧美色综合网| 亚洲电影自拍| 一色屋精品视频免费看| 亚洲在线免费观看| 亚洲精品一线二线三线无人区| 欧美一站二站| 欧美中文字幕在线| 国产精品青草久久久久福利99| 亚洲成色777777在线观看影院| 国产真实久久| 久久福利资源站| 久久成人综合视频| 国产精品视频免费| 亚洲综合首页| 欧美一区二区日韩一区二区| 国产精品av免费在线观看| 亚洲欧洲美洲综合色网| 日韩视频永久免费| 欧美日韩精品免费在线观看视频| 欧美激情第三页| 亚洲精品视频二区| 欧美激情一区二区久久久| 亚洲黄色三级| 亚洲午夜精品一区二区| 欧美亚一区二区| 亚洲午夜精品久久久久久浪潮 | 久久成人精品无人区| 国产午夜精品久久久久久久| 性欧美video另类hd性玩具| 先锋影音一区二区三区| 国产女主播一区| 久久久久久久久岛国免费| 欧美91福利在线观看| 亚洲人妖在线| 国产精品久久久久毛片大屁完整版| 亚洲性线免费观看视频成熟| 欧美诱惑福利视频| 精品动漫一区| 欧美日韩国产一区| 欧美一区二区三区日韩| 欧美成人日韩| 亚洲一区二区高清| 国模一区二区三区| 欧美风情在线观看| 亚洲免费在线精品一区| 免费高清在线视频一区·| 亚洲三级网站| 国产精品亚洲人在线观看| 久久乐国产精品| 99re66热这里只有精品3直播| 久久国产精品第一页| 亚洲精品国产精品乱码不99按摩| 久久综合中文| 在线免费精品视频| 欧美日韩亚洲视频一区| 亚洲一区二区三区乱码aⅴ蜜桃女| 久久久福利视频| 日韩亚洲国产欧美| 国产亚洲福利| 欧美激情片在线观看| 小黄鸭视频精品导航| 亚洲国产一区二区在线| 欧美自拍偷拍午夜视频| 日韩视频―中文字幕| 国产一区二区三区视频在线观看| 欧美成人影音| 久久精品国产免费观看| 亚洲欧洲精品一区二区| 欧美一区二区三区免费视| 亚洲国产成人精品久久久国产成人一区| 欧美日本成人| 久久黄色小说| 亚洲另类黄色| 亚洲国产精品久久久久婷婷884| 久久精品三级| 日韩视频在线一区| 亚洲国产日韩欧美| 狠狠色狠狠色综合日日五| 欧美久久久久中文字幕| 中日韩男男gay无套 | 欧美精品一区二区三区蜜桃| 亚洲免费播放|