理解iocp(完成端口)_第1頁
理解iocp(完成端口)_第2頁
理解iocp(完成端口)_第3頁
理解iocp(完成端口)_第4頁
理解iocp(完成端口)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、理解I/OCompletionPort(完成端口)歡迎閱讀此篇IOCP教程。我將先給岀IOCP的定義然后給岀它的實現(xiàn)方法,最后剖析一個Echo程序來為您撥開IOCP的謎云,除去你心中對IOCP的煩惱。0K,但我不能保證你明白IOCP的一切,但我會盡我最大的努力。以下是我會在這篇文章中提到的相關(guān)技術(shù):I/O端口同步/異步堵塞/非堵塞服務(wù)端/客戶端多線程程序設(shè)計WinsockAPI在這之前,我曾經(jīng)開發(fā)過一個項目,其中一塊需要網(wǎng)絡(luò)支持,當時還考慮到了代碼的可移植性,只要使用select,connect,accept,listen,send還有recv,再加上幾個#ifdef的圭寸裝以用來處理Wins

2、ock和BSD套接字socket中間的不兼容性,一個網(wǎng)絡(luò)子系統(tǒng)只用了幾個小時很少的代碼就寫岀來了,至今還讓我很回味。那以后很長時間也就沒再碰了。前些日子,我們策劃做一個網(wǎng)絡(luò)游戲,我主動承擔下網(wǎng)絡(luò)這一塊,想想這還不是小case,心里偷著樂啊。網(wǎng)絡(luò)游戲好啊,網(wǎng)絡(luò)游戲為成百上千的玩家提供了樂趣和令人著秘的游戲體驗,他們在線上互相戰(zhàn)斗或是加入隊伍去戰(zhàn)勝共同的敵人。我信心滿滿的準備開寫我的網(wǎng)絡(luò),于是乎,MMP的架構(gòu)中去,直接被否定掉MMP的架構(gòu)中去,直接被否定掉IOCP,也就不會有這篇教程了。下面請發(fā)現(xiàn)過去的阻塞同步模式模式根本不能拿到一個巨量多玩家了。于是乎,就有了IOCP,如果能過很輕易而舉的搞掂諸

3、位跟隨我進入正題。什么是IOCP?先讓我們看看對IOCP的評價I/O完成端口可能是Win32提供的最復(fù)雜的內(nèi)核對象。AdvaneedWindows3rdJeffreyRichter這是IOCP實現(xiàn)高容量網(wǎng)絡(luò)服務(wù)器的最佳方法。Windows:WriteScalableWinsockAppsUsingCompletionPortsMicrosoftCorporation完成端口模型提供了最好的伸縮性。這個模型非常適用來處理數(shù)百乃至上千個套接字。Windows網(wǎng)絡(luò)編程2ndAnthonyJones&JimOhlundI/Ocompletionports特別顯得重要,因為它們是唯一適用于高負載服務(wù)器必

4、須同時維護許多連接線路的一個技術(shù)。Completionports利用一些線程,幫助平衡由I/O請求所引起的負載。這樣的架構(gòu)特別適合用在SMP系統(tǒng)中產(chǎn)生的”scalable服務(wù)器。Win32多線程程序設(shè)計JimBeveridge&RobertWiener看來我們完全有理由相信IOCP是大型網(wǎng)絡(luò)架構(gòu)的首選。那IOCP到底是什么呢?微軟在Winsock2中引入了IOCP這一概念。IOCP全稱I/OCompletionPort,中文譯為I/O完成端口。IOCP是一個異步I/O的API,它可以高效地將I/O事件通知給應(yīng)用程序。與使用select()或是其它異步方法不同的是,一個套接字socket與一個完

5、成端口關(guān)聯(lián)了起來,然后就可繼續(xù)進行正常的Winsock操作了。然而,當一個事件發(fā)生的時候,此完成端口就將被操作系統(tǒng)加入一個隊列中。然后應(yīng)用程序可以對核心層進行查詢以得到此完成端口。這里我要對上面的一些概念略作補充,在解釋完成兩字之前,我想先簡單的提一下同步和異步這兩個概念,邏輯上來講做完一件事后再去做另一件事就是同步,而同時一起做兩件或兩件以上事的話就是異步了。你也可以拿單線程和多線程來作比喻。但是我們一定要將同步和堵塞,異步和非堵塞區(qū)分開來,所謂的堵塞函數(shù)諸如accept()當調(diào)用此函數(shù)后,此時線程將掛起,直到操作系統(tǒng)來通知它,”HEY兄弟,有人連進來了”,那個掛起的線程將繼續(xù)進行工作,也就

6、符合”生產(chǎn)者-消費者”模型。堵塞和同步看上去有兩分相似,但卻是完全不同的概念。大家都知道I/O設(shè)備是個相對慢速的設(shè)備,不論打印機,調(diào)制解調(diào)器,甚至硬盤,與CPU相比都是奇慢無比的,坐下來等I/O的完成是一件不甚明智的事情,有時候數(shù)據(jù)的流動率非常驚人,把數(shù)據(jù)從你的文件服務(wù)器中以Ethernet速度搬走,其速度可能高達每秒一百萬字節(jié),如果你嘗試從文件服務(wù)器中讀取100KB,在用戶的眼光來看幾乎是瞬間完成,但是,要知道,你的線程執(zhí)行這個命令,已經(jīng)浪費了10個一百萬次CPU周期。所以說,我們一般使用另一個線程來進行I/O。重疊IOoverlappedI/O是Win32的一項技術(shù),你可以要求操作系統(tǒng)為你

7、傳送數(shù)據(jù),并且在傳送完畢時通知你。這也就是完成的含義。這項技術(shù)使你的程序在I/O進行過程中仍然能夠繼續(xù)處理事務(wù)。事實上,操作系統(tǒng)內(nèi)部正是以線程來完成overlappedI/O。你可以獲得線程所有利益,而不需要付出什么痛苦的代價。完成端口中所謂的端口并不是我們在TCP/IP中所提到的端口,可以說是完全沒有關(guān)系。我到現(xiàn)在也沒想通一個I/O設(shè)備I/ODevice和端口IOCP中的Port有什么關(guān)系。估計這個端口也迷惑了不少人。IOCP只不過是用來進行讀寫操作,和文件I/O倒是有些類似。既然是一個讀寫設(shè)備,我們所能要求它的只是在處理讀與寫上的高效。在文章的第三部分你會輕而易舉的發(fā)現(xiàn)IOCP設(shè)計的真正用

8、意。IOCP和網(wǎng)絡(luò)又有什么關(guān)系?intmain()WSAStartup(MAKEWORD(2,2),&wsaData);ListeningSocket=socket(AF_INET,SOCK_STREAM,0);bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr);listen(ListeningSocket,5);intnlistenAddrLen=sizeof(ClientAddr);while(TRUE)NewConnection=accept(ListeningSocket,(SOCKADDR*)&ClientAd

9、dr,&nlistenAddrLen);HANDLEhThread=CreateThread(NULL,0,ThreadFunc,(void*)NewConnection,0,&dwTreadId);CloseHandle(hThread);return0;相信只要寫過網(wǎng)絡(luò)的朋友,應(yīng)該對這樣的結(jié)構(gòu)在熟悉不過了。accept后線程被掛起,等待一個客戶發(fā)出請求,而后創(chuàng)建新線程來處理請求。當新線程處理客戶請求時,起初的線程循環(huán)回去等待另一個客戶請求。處理客戶請求的線程處理完畢后終結(jié)。在上述的并發(fā)模型中,對每個客戶請求都創(chuàng)建了一個線程。其優(yōu)點在于等待請求的線程只需做很少的工作。大多數(shù)時間中,該線程在休

10、眠因為recv處于堵塞狀態(tài)。但是當并發(fā)模型應(yīng)用在服務(wù)器端基于WindowsNT,WindowsNT小組注意到這些應(yīng)用程序的性能沒有預(yù)料的那么高。特別的,處理很多同時的客戶請求意味著很多線程并發(fā)地運行在系統(tǒng)中。因為所有這些線程都是可運行的沒有被掛起和等待發(fā)生什么事,Microsoft意識到NT內(nèi)核花費了太多的時間來轉(zhuǎn)換運行線程的上下文Context,線程就沒有得到很多CPU時間來做它們的工作。大家可能也都感覺到并行模型的瓶頸在于它為每一個客戶請求都創(chuàng)建了一個新線程。創(chuàng)建線程比起創(chuàng)建進程開銷要小,但也遠不是沒有開銷的。我們不妨設(shè)想一下:如果事先開好N個線程,讓它們在那hold堵塞,然后可以將所有用

11、戶的請求都投遞到一個消息隊列中去。然后那N個線程逐一從消息隊列中去取出消息并加以處理。就可以避免針對每一個用戶請求都開線程。不僅減少了線程的資源,也提高了線程的利用率。理論上很不錯,你想我等泛泛之輩都能想出來的問題,Microsoft又怎會沒有考慮到呢!這個問題的解決方法就是一個稱為I/O完成端口的內(nèi)核對象,他首次在Windows中被引入。其實我們上面的構(gòu)想應(yīng)該就差不多是IOCP的設(shè)計機理。其實說穿了IOCP不就是一個消息隊列嘛!你說這和端口這兩字有何聯(lián)系。我的理解就是IOCP最多是應(yīng)用程序和操作系統(tǒng)溝通的一個接口罷了。至于IOCP的具體設(shè)計那我也很難說得上來,畢竟我沒看過實現(xiàn)的代碼,但你完全可以進行模擬,只不過性能可能,如果想深入理解IOCP,JeffreyRitchter的AdvaneedWindows3rd其中第13章和第14張有很多寶貴的內(nèi)容,你可以拿來窺視一下系統(tǒng)是如何完成這一切的。實現(xiàn)方法Microsoft為IOCP提供了相應(yīng)的API函數(shù),主要的就兩個,我們逐一的來看一下:HANDLECreateIoCompletionPort(HANDLEFileHandle,始化Winsock創(chuàng)建一個完成端口

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論