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

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

完成端口使用總結(jié) (轉(zhuǎn))

http://blog.csdn.net/dananhai/archive/2008/02/26/2122778.aspx

<!--[endif]-->前言

本文不是全面介紹完成端口的,只是簡(jiǎn)單介紹了一下完成端口和幾個(gè)常用概念。本文主要關(guān)注完成端口關(guān)閉時(shí)資源釋放問(wèn)題。

<!--[if !supportLists]-->基礎(chǔ)介紹

    完成端口——可能是Win32下最復(fù)雜的一種I/O模型,Win32下最復(fù)雜的內(nèi)核對(duì)象。它通過(guò)指定數(shù)量的線程對(duì)重疊I/O請(qǐng)求進(jìn)行管理,以便為已經(jīng)完成的I/O請(qǐng)求提供服務(wù),相對(duì)其它I/O模型,它管理任意數(shù)目I/O套接字。假若一個(gè)應(yīng)用程序同時(shí)需要管理為數(shù)眾多的套接字,那么采用這種模型,往往可以達(dá)到最佳的系統(tǒng)性能。

通過(guò)CreateIoCompletionPort唯一一個(gè)創(chuàng)建內(nèi)核對(duì)象而沒(méi)有LPSECURITY_ATTRIBUTES參數(shù)的Win32函數(shù),這是因?yàn)橥瓿啥丝谥粦?yīng)用于進(jìn)程內(nèi))來(lái)創(chuàng)建I/O完成端口,當(dāng)你創(chuàng)建一個(gè)I/O完成端口時(shí),內(nèi)核實(shí)際創(chuàng)建了5個(gè)不同的數(shù)據(jù)結(jié)構(gòu)。

  • 設(shè)備列表。

<!--[if !vml]--><!--[endif]-->
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

  • I/O完成隊(duì)列(FIFO)。當(dāng)一個(gè)設(shè)備的異步I/O請(qǐng)求完成時(shí),系統(tǒng)檢查該設(shè)備是否關(guān)聯(lián)了一個(gè)完成端口,如果是系統(tǒng)向該完成端口的I/O完成隊(duì)列加入完成I/O請(qǐng)求項(xiàng)。

<!--[if !vml]--><!--[endif]-->
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->

  • 等待線程隊(duì)列(LIFO)。當(dāng)線程池中的一個(gè)線程調(diào)用GetQueuedCompletionStatus時(shí),調(diào)用線程的線程ID備放入該隊(duì)列中。
  • 釋放線程隊(duì)列(活動(dòng)線程隊(duì)列)。完成端口通過(guò)該隊(duì)列監(jiān)視和限定活動(dòng)線程的數(shù)目,這個(gè)限定通常是CPU數(shù)目,過(guò)多的活動(dòng)線程沒(méi)有實(shí)際意義,它會(huì)引發(fā)線程切換從而降低性能。
  • 暫停線程隊(duì)列。當(dāng)線程調(diào)用了SleepWaitForSingleObjectWaitForMultipleObjects等。

<!--[if !vml]--><!--[endif]-->

 

<!--[if !supportLists]-->相關(guān)概念

<!--[if !supportLists]-->工作者線程與完成端口

成功創(chuàng)建一個(gè)完成端口后,便可開始將套接字句柄與對(duì)象關(guān)聯(lián)到一起。但在關(guān)聯(lián)套接字之前,首先必須創(chuàng)建一個(gè)或多個(gè)“工作者線程”,以便在I/O請(qǐng)求投遞給完成端口對(duì)象后,為完成端口提供服務(wù)。

完成端口I/O模型的工作流程如下:

1  通過(guò)CreateIoCompletionPort創(chuàng)建完成端口。

2  創(chuàng)建工作者線程。

3  通過(guò)CreateIoCompletionPort將完成端口與某一設(shè)備相關(guān)聯(lián)。

4  通過(guò)WSAXXX發(fā)出異步I/O請(qǐng)求。

5  在工作者線程中通過(guò)調(diào)用GetQueuedCompetionStatus取得完成I/O請(qǐng)求項(xiàng)進(jìn)行后續(xù)的處理。

<!--[if !supportLists]--> <!--[endif]-->單句柄數(shù)據(jù)和單I/O操作數(shù)據(jù)

<!--[if !vml]--><!--[endif]-->HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort,
<!--[if !vml]--><!--[endif]-->   ULONG_PTR CompletionKey, DWORD NumberOfConcurrentThreads);
<!--[if !vml]--><!--[endif]-->BOOL GetQueuedCompletionStatus    (HANDLE CompletionPort, LPDWORD lpNumberOfBytesTransferred,
<!--[if !vml]--><!--[endif]-->    PULONG_PTR lpCompletionKey, LPOVERLAPPED *lpOverlapped, DWORD dwMilliseconds );<!--[if !vml]--><!--[endif]--> 

    GetQueuedCompetionStatuslpCompletionKey參數(shù)包含了“單句柄數(shù)據(jù)”,它是通過(guò)調(diào)用CreateIoCompletionPort來(lái)關(guān)聯(lián)完成端口與設(shè)備時(shí),通過(guò)CompletionKey參數(shù)設(shè)定的。也就是說(shuō)這個(gè)數(shù)據(jù)特定于設(shè)備(這里指套接字)。
    GetQueuedCompetionStatus
lpOverlapped參數(shù)則包含了“單I/O操作數(shù)據(jù)”,在通過(guò)該函數(shù)取得I/O完成隊(duì)列中的I/O請(qǐng)求完成項(xiàng)后,lpOverlapped指向一個(gè)對(duì)應(yīng)了發(fā)起這個(gè)I/O請(qǐng)求時(shí)傳遞的OVERLAPPED數(shù)據(jù)結(jié)構(gòu),也就是說(shuō)這個(gè)數(shù)據(jù)特定于I/O請(qǐng)求。
  單句柄數(shù)據(jù)和單I/O數(shù)據(jù)有什么用呢?同過(guò)單句柄數(shù)據(jù)我們可以關(guān)聯(lián)特定的處理函數(shù)或處理器或其它結(jié)構(gòu)對(duì)該句柄之上的I/O進(jìn)行特定的處理。單I/O數(shù)據(jù)為異步I/O的發(fā)起和完成建立了聯(lián)系,它可以關(guān)聯(lián)緩沖區(qū)或處理器(參見ACE_Proactor),方便異步I/O操作。

<!--[if !supportLists]-->需要注意的問(wèn)題

下面是請(qǐng)求完成通知插入I/O完成隊(duì)列的幾種情況:

  • 調(diào)用了closesocket
  • 調(diào)用了CancelIo
  • 發(fā)起I/O請(qǐng)求的線程終止
  • 超時(shí)
  • PostQueuedCompletionStatus
  • I/O請(qǐng)求正常完成

上述情況除正常完成和PostQueuedCompletionStatus外,其他完成通知會(huì)使GetQueuedCompletionStatus返回FALSE,而此時(shí)lpOverlapped(超時(shí)為NULL)指向未完成I/O請(qǐng)求的I/O數(shù)據(jù)。明白了這些后,后面講的大多不是問(wèn)題,講一講加深下印象吧。

<!--[if !supportLists]-->資源管理問(wèn)題一

  • 當(dāng)I/O請(qǐng)求返回非pending錯(cuò)誤和GetQueuedCompletionStatus返回FALSE時(shí)如果釋放I/O數(shù)據(jù)占用的資源。(IOCP中的socket錯(cuò)誤和資源釋放處理方法
  • 進(jìn)行重疊I / O操作的同時(shí),強(qiáng)行釋放一個(gè)OVERLAPPED結(jié)構(gòu)。要想避免出現(xiàn)這種情況,最好的辦法是針對(duì)每個(gè)套接字句柄,調(diào)用closesocket函數(shù),任何尚未進(jìn)行的重疊I / O操作都會(huì)完成。

<!--[if !supportLists]-->資源管理問(wèn)題二(關(guān)閉完成端口服務(wù))

    我們通常通過(guò)調(diào)用PostQueuedCompletionStatusI/O完成隊(duì)列中加入特殊的完成項(xiàng)來(lái)結(jié)束工作者線程的,此時(shí),對(duì)于未完成的I/O請(qǐng)求要分情況處理之:

  • 對(duì)于在工作者線程中發(fā)起的I/O請(qǐng)求(一般情況下是這樣),隨著該工作者線程的結(jié)束這些I/O請(qǐng)求便會(huì)完成,那么對(duì)于這種情況我們需要另外的線程來(lái)做相應(yīng)的清理工作——通過(guò)調(diào)用超時(shí)參數(shù)為0GetQueuedCompletionStatus函數(shù),遍歷I/O完成隊(duì)列,lpOverlapped包含了特定于I/O操作的數(shù)據(jù)。
  • 也可在收到關(guān)閉通知后,關(guān)閉套接字或取消相關(guān)的操作使得I/O請(qǐng)求完成并處理之。這需要將這些套接字以及相應(yīng)的I/O操作記錄下來(lái)。

<!--[if !supportLists]-->關(guān)于PostQueuedCompletionStatus


由于等待線程隊(duì)列是LIFO的,所以該函數(shù)要想通知每個(gè)工作者線程是件棘手的事情。

<!--[if !supportLists]--><!--[endif]-->參考文獻(xiàn)

[1]Jeffery Richter.Advanced Windows(3rd Edition),Microsoft Press,1997
[2]Anthony Jones,Jim Ohlund. Network Programming for Microsoft Windows ,Microsoft Press,2002

 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2122778


posted on 2008-03-05 17:07 大龍 閱讀(8398) 評(píng)論(2)  編輯 收藏 引用

評(píng)論

# re: 完成端口使用總結(jié) (轉(zhuǎn)) 2008-07-05 08:26 企業(yè)即時(shí)通訊

Kmd教程7-后備列表
作者:松松翻譯·發(fā)布日期:2004-10-8·閱讀次數(shù):7824  回復(fù)  更多評(píng)論   

# re: 完成端口使用總結(jié) (轉(zhuǎn)) 2009-07-10 18:07 飛鴿傳書

寫的很詳細(xì)的。  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            欧美xx69| 亚洲欧洲精品一区二区三区 | 久久久精品午夜少妇| 亚洲精品女人| 美女任你摸久久| 欧美大片国产精品| 久热精品在线| 欧美国产欧美亚州国产日韩mv天天看完整| 久久综合久久综合这里只有精品| 久久久久久婷| 亚洲第一在线综合网站| 亚洲欧洲日本国产| 正在播放欧美视频| 午夜精品久久久99热福利| 久久久久久亚洲精品中文字幕 | 亚洲综合视频一区| 午夜在线一区| 免费欧美在线视频| 欧美亚一区二区| 狠狠色丁香婷婷综合久久片| 亚洲国产精品成人综合| 亚洲一区二区三区在线看| 久久精品国内一区二区三区| 欧美黄色免费网站| 在线亚洲激情| 久久嫩草精品久久久久| 欧美日韩午夜在线视频| 国模精品一区二区三区色天香| 亚洲国产一区二区精品专区| 欧美制服第一页| 亚洲天天影视| 久久综合久久综合久久| 在线视频日韩| 久久综合色88| 国产一区二区三区电影在线观看 | 午夜视频久久久久久| 欧美成人r级一区二区三区| 国产精品久久久久久久久借妻 | 欧美激情一区二区三区全黄| 国产精品视频一二三| 亚洲精品欧美在线| 久久精品国产久精国产爱| 亚洲级视频在线观看免费1级| 亚洲在线网站| 欧美天堂在线观看| 亚洲免费观看高清完整版在线观看| 久久国产黑丝| 亚洲午夜视频| 欧美午夜精品久久久| 久久一区二区三区超碰国产精品| 欧美激情第10页| 亚洲国产高潮在线观看| 久久久久久穴| 欧美一级黄色录像| 国产精品日韩一区二区| 亚洲影院在线| 亚洲片区在线| 欧美另类一区| 在线一区日本视频| 99国内精品| 欧美视频不卡中文| 亚洲亚洲精品在线观看 | 久久精品国产96久久久香蕉| 国产精品国码视频| 亚洲一级在线| 在线视频中文亚洲| 国产精品久久久| 性欧美18~19sex高清播放| 一区二区欧美日韩视频| 欧美视频1区| 欧美在线免费视频| 欧美资源在线| 亚洲黄色免费| 亚洲精品黄网在线观看| 欧美日韩亚洲一区三区| 性色av一区二区三区在线观看 | 欧美日韩国产美女| 欧美日韩国产电影| 亚洲欧美日韩网| 猛男gaygay欧美视频| 久久午夜电影| 夜夜嗨一区二区| 中日韩在线视频| 国产日产欧产精品推荐色| 欧美在线免费观看视频| 久久视频在线免费观看| 日韩午夜激情av| 亚洲一区中文字幕在线观看| 国模精品一区二区三区色天香| 欧美国产精品专区| 国产精品www.| 老司机免费视频一区二区| 免费视频久久| 午夜国产不卡在线观看视频| 久久精品国产亚洲一区二区| 亚洲日本免费电影| 亚洲系列中文字幕| 亚洲国产精品123| 亚洲午夜一区二区三区| 亚洲第一免费播放区| 日韩视频一区二区三区在线播放免费观看| 欧美日在线观看| 久久久精品欧美丰满| 欧美凹凸一区二区三区视频| 亚洲一区二区免费在线| 久久久久成人精品免费播放动漫| 亚洲美女啪啪| 亚洲香蕉伊综合在人在线视看| 激情av一区| 亚洲网站在线播放| 亚洲另类黄色| 久久久久久国产精品一区| 亚洲永久字幕| 欧美精品一区二区视频| 鲁大师影院一区二区三区| 欧美性开放视频| 亚洲小说春色综合另类电影| 国产精品亚洲综合一区在线观看| 欧美国产三区| 国内精品一区二区三区| 亚洲午夜一二三区视频| 一本不卡影院| 美玉足脚交一区二区三区图片| 久久国产成人| 国产日韩欧美精品在线| 中文国产亚洲喷潮| 一区二区三区产品免费精品久久75| 久久久亚洲国产天美传媒修理工| 午夜亚洲性色视频| 欧美午夜大胆人体| 一本久道久久综合婷婷鲸鱼| 亚洲日本欧美在线| 美日韩丰满少妇在线观看| 免费一区视频| 激情视频一区| 久久午夜视频| 欧美www视频在线观看| 精品电影在线观看| 久久九九国产精品| 久久香蕉国产线看观看av| 国产精品久久久久av免费| 久久综合免费视频影院| 亚洲国产毛片完整版| 欧美精品久久一区二区| 欧美高清视频免费观看| 国产亚洲精品美女| 久久av一区二区三区亚洲| 久久婷婷国产综合国色天香| 国产私拍一区| 麻豆精品传媒视频| 亚洲国产婷婷香蕉久久久久久| 亚洲精品国产精品乱码不99按摩| 久久综合中文色婷婷| 亚洲国产美国国产综合一区二区| 欧美成人国产一区二区| 日韩一级二级三级| 羞羞答答国产精品www一本 | 国产亚洲精品久久久久婷婷瑜伽| 亚洲性线免费观看视频成熟| 午夜免费在线观看精品视频| 国产欧美综合一区二区三区| 久久九九热re6这里有精品| 久久婷婷激情| 1024国产精品| 欧美日韩免费观看一区=区三区| 亚洲婷婷国产精品电影人久久| 久久精品麻豆| 91久久极品少妇xxxxⅹ软件| 欧美日韩一区二区在线观看视频| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 亚洲国产欧美一区二区三区久久| 国产精品一区一区三区| 亚洲男人的天堂在线观看| 久久综合一区| 一区二区三区久久| 国产一区二区高清视频| 欧美不卡福利| 欧美一级久久久久久久大片| 亚洲东热激情| 久久av红桃一区二区小说| 亚洲精品一区二区三区婷婷月 | 亚洲一区二区免费看| 久久久久久久综合日本| 一区二区成人精品| 激情文学综合丁香| 国产精品二区三区四区| 免费在线亚洲欧美| 国产精品香蕉在线观看| 西西人体一区二区| 亚洲日本电影在线| 国产一区二区电影在线观看| 欧美精品久久一区| 久久香蕉国产线看观看网| 亚洲女人小视频在线观看| 日韩视频免费看| 亚洲经典视频在线观看| 麻豆成人综合网| 久久国产精品99国产精| 亚洲中午字幕| 一本综合精品|