下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、理解 I/O Completion Port(完成端口 )歡迎閱讀此篇IOCP教程。我將先給岀IOCP的定義然后給岀它的實(shí)現(xiàn)方法,最后剖析一個(gè) Echo程序來為您撥開IOCP的謎云,除去你心中對(duì)IOCP的煩惱。0K,但我不能保證你明白IOCP的一切,但我會(huì)盡我最大的努力。以下是我會(huì)在這篇文章中提到的相關(guān)技術(shù):I/O 端口同步/異步堵塞/非堵塞服務(wù)端/客戶端多線程程序設(shè)計(jì)Win sock API 2.0在這之前,我曾經(jīng)開發(fā)過一個(gè)項(xiàng)目,其中一塊需要網(wǎng)絡(luò)支持,當(dāng)時(shí)還考慮到了代碼的可移植性,只要使用 select,connect,accept,listen,send還有recv,再加上幾個(gè) #ifde
2、f的圭寸裝以用來處理Win sock和BSD套接字socket中間的不兼容性,一個(gè)網(wǎng)絡(luò)子系統(tǒng)只用了幾個(gè)小時(shí)很少的代碼就寫岀來了,至今還讓我很回味。那以后很長時(shí)間也就沒再碰了。前些日子,我們策劃做一個(gè)網(wǎng)絡(luò)游戲,我主動(dòng)承擔(dān)下網(wǎng)絡(luò)這一塊,想想這還不是小case,心里偷著樂啊。網(wǎng)絡(luò)游戲好啊,網(wǎng)絡(luò)游戲?yàn)槌砂偕锨У耐婕姨峁┝藰啡ず土钊酥氐挠螒蝮w驗(yàn),他們在線上互相戰(zhàn)斗或是加入隊(duì)伍去戰(zhàn)勝共同的敵人。我信心滿滿的準(zhǔn)備開寫我的網(wǎng)絡(luò),于是乎, 發(fā)現(xiàn)過去的阻塞同步模式模式根本不能拿到一個(gè)巨量多玩家MMP的架構(gòu)中去,直接被否定掉了。于是乎,就有了 IOCP,如果能過很輕易而舉的搞掂IOCP,也就不會(huì)有這篇教程了。下面
3、請諸位跟隨我進(jìn)入正題。什么是IOCP ?先讓我們看看對(duì)IOCP的評(píng)價(jià)I/O完成端口可能是 Win32提供的最復(fù)雜的內(nèi)核對(duì)象。Adva need Win dows 3rd Jeffrey Richter這是IOCP實(shí)現(xiàn)高容量網(wǎng)絡(luò)服務(wù)器的最佳方法。Win dows Sockets2.0:Write Scalable Win sock Apps Usi ng Completion PortsMicrosoft Corporati on完成端口模型提供了最好的伸縮性。這個(gè)模型非常適用來處理數(shù)百乃至上千個(gè)套接字。Windows網(wǎng)絡(luò)編程2nd An tho ny Jones & Jim Ohlu ndI/
4、O completion ports特別顯得重要,因?yàn)樗鼈兪俏ㄒ贿m用于高負(fù)載服務(wù)器必須冋時(shí)維護(hù)許多連接線路的一個(gè)技術(shù)。Completion ports利用一些線程,幫助平衡由I/O請求所引起的負(fù)載。這樣的架構(gòu)特別適合用在SMP系統(tǒng)中產(chǎn)生的” scalable服務(wù)器。Win32 多線程程序設(shè)計(jì)Jim Beveridge & Robert Wiener看來我們完全有理由相信IOCP是大型網(wǎng)絡(luò)架構(gòu)的首選。那IOCP到底是什么呢?微軟在 Winsock2中引入了 IOCP這一概念 。IOCP全稱I/O Completion Port ,中文譯為I/O完成端口。 IOCP是一個(gè)異步I/O的API,它可以
5、高效地將I/O事件通知給應(yīng)用程序。與使用 select()或是其它異步方法不同的是,一個(gè)套接字socket與一個(gè)完成端口關(guān)聯(lián)了起來,然后就可繼續(xù)進(jìn)行正常的 Win sock操作了。然而,當(dāng)一個(gè)事件發(fā)生的時(shí)候,此完成端口就將被操作系統(tǒng) 加入一個(gè)隊(duì)列中。然后應(yīng)用程序可以對(duì)核心層進(jìn)行查詢以得到此完成端口。這里我要對(duì)上面的一些概念略作補(bǔ)充,在解釋完成兩字之前,我想先簡單的提一下同步和異步這兩個(gè)概念, 邏輯上來講做完一件事后再去做另一件事就是同步,而同時(shí)一起做兩件或兩件以上事的話就是異步了。你也可以拿單線程和多線程來作比喻。但是我們一定要將同步和堵塞, 異步和非堵塞區(qū)分開來,所謂的堵塞函數(shù)諸如accep
6、t(),當(dāng)調(diào)用此函數(shù)后,此時(shí)線程將掛起,直到操作系統(tǒng)來通知它,” HEY兄弟,有人連進(jìn)來了 ”,那個(gè)掛起的線程將繼續(xù)進(jìn)行工作,也就符合”生產(chǎn)者-消費(fèi)者”模型。堵塞和同步看上去有兩分相似,但卻是完全不同的概念。大家都知道I/O設(shè)備是個(gè)相對(duì)慢速的設(shè)備,不論打印機(jī),調(diào)制解調(diào)器,甚至硬盤,與CPU相比都是奇慢無比的,坐下來等I/O的完成是一件不甚明智的事情,有時(shí)候數(shù)據(jù)的流動(dòng)率非常驚人,把數(shù)據(jù)從你的文件服務(wù)器中以Ethernet速度搬走,其速度可能高達(dá)每秒一百萬字節(jié),如果你嘗試從文件服務(wù)器中 讀取100KB,在用戶的眼光來看幾乎是瞬間完成,但是,要知道,你的線程執(zhí)行這個(gè)命令,已 經(jīng)浪費(fèi)了 10個(gè)一百萬次
7、CPU周期。所以說,我們一般使用另一個(gè)線程來進(jìn)行I/O。重疊IOoverlapped I/O是Win32的一項(xiàng)技術(shù),你可以要求操作系統(tǒng)為你傳送數(shù)據(jù),并且在傳送完畢 時(shí)通知你。這也就是完成的含義。這項(xiàng)技術(shù)使你的程序在I/O進(jìn)行過程中仍然能夠繼續(xù)處理事務(wù)。事實(shí)上,操作系統(tǒng)內(nèi)部正是以線程來完成overlapped I/O。你可以獲得線程所有利益,而不需要付出什么痛苦的代價(jià)。完成端口中所謂的端口并不是我們在 TCP/IP中所提到的端口,可以說是完全沒有關(guān)系。我到現(xiàn)在也沒想通一個(gè)I/O設(shè)備I/O Device和端口 IOCP中的Port有什么關(guān)系。估計(jì)這個(gè)端口也迷惑了不少人。IOCP只不過是用來進(jìn)行讀寫
8、操作,和文件I/O倒是有些類似。既然是一個(gè)讀寫設(shè)備,我們所能要求它的只是在處理讀與寫上的高效。在文章的第三部分你會(huì)輕而易舉的發(fā)現(xiàn)IOCP設(shè)計(jì)的真正用意。IOCP和網(wǎng)絡(luò)又有什么關(guān)系?int mai n()WSAStartup(MAKEWORD(2, 2), & wsaData);Liste nin gSocket = socket(AF_INET, SOCK_STREAM, 0);bin d(Liste nin gSocket, (SOCKADDR* )&ServerAddr, sizeof(ServerAddr);liste n( Liste nin gSocket, 5);int n lis
9、te nAddrLe n = sizeof(Clie ntAddr);while(TRUE)NewCo nn ection = accept(Liste nin gSocket, (SOCKADDR*)&Clie ntAddr,&n listenAddrLe n);HANDLE hThread = CreateThread(NULL, 0, ThreadFu nc, (void*)NewCo nn ectio n, 0, &dwTreadld);CloseHa ndle(hThread);return 0;相信只要寫過網(wǎng)絡(luò)的朋友,應(yīng)該對(duì)這樣的結(jié)構(gòu)在熟悉不過了。accept后線程被掛起,等待一個(gè)
10、客戶發(fā)岀請求,而后創(chuàng)建新線程來處理請求。當(dāng)新線程處理客戶請求時(shí),起初的線程循環(huán)回去等待另一個(gè)客戶請求。處理客戶請求的線程處理完畢后終結(jié)。在上述的并發(fā)模型中,對(duì)每個(gè)客戶請求都創(chuàng)建了一個(gè)線程。其優(yōu)點(diǎn)在于等待請求的線程只需做很少的工作。大多數(shù)時(shí)間中,該線程在休眠因?yàn)閞ecv處于堵塞狀態(tài)。但是當(dāng)并發(fā)模型應(yīng)用在服務(wù)器端基于Windows NT ,Windows NT 小組注意到這些應(yīng)用程序的性能沒有預(yù)料的那么高。特別的,處理很多同時(shí)的客戶請求意味著很多線程并發(fā)地運(yùn)行在系統(tǒng)中。因?yàn)樗羞@些線程都是可運(yùn)行的沒有被掛起和等待發(fā)生什么事,Microsoft意識(shí)到NT內(nèi)核花費(fèi)了太多的時(shí)間來轉(zhuǎn)換運(yùn)行線程的上下文Co
11、ntext,線程就沒有得到很多 CPU時(shí)間來做它們的工作。大家可能也都感覺到并行模型的瓶頸在于它為每一個(gè)客戶請求都創(chuàng)建了一個(gè)新線程。創(chuàng)建線程比起創(chuàng)建進(jìn)程開銷要小,但也遠(yuǎn)不是沒有開銷的。我們不妨設(shè)想一下:如果事先開好 N個(gè)線程,讓它們在那hold堵塞,然后可以將所有用戶的請求都投遞到一個(gè)消息隊(duì)列中去。然后那N個(gè)線程逐一從消息隊(duì)列中去取岀消息并加以處理。就可以避免針對(duì)每一個(gè)用戶請求都開線程。不僅減少了線程的資源,也提高了線程的利用率。理論上很不錯(cuò),你想我等泛泛之輩都能想岀來的問題,Microsoft又怎會(huì)沒有考慮到呢 ?!這個(gè)問題的解決方法就是一個(gè)稱為I/O完成端口的內(nèi)核對(duì)象,他首次在Window
12、s NT3.5 中被引入。其實(shí)我們上面的構(gòu)想應(yīng)該就差不多是IOCP的設(shè)計(jì)機(jī)理。其實(shí)說穿了 IOCP不就是一個(gè)消息隊(duì)列嘛!你說這和端口 這兩字有何聯(lián)系。我的理解就是IOCP最多是應(yīng)用程序和操作系統(tǒng)溝通的一個(gè)接口罷了。至于IOCP的具體設(shè)計(jì)那我也很難說得上來,畢竟我沒看過實(shí)現(xiàn)的代碼,但你完全可以進(jìn)行模擬,只不過性能可能 ,如果想深入理解 IOCP, Jeffrey Ritchter 的Advaneed Windows 3rd 其中第13章和第14張有很多寶貴的內(nèi)容,你可以拿來窺視一下系統(tǒng)是如何完成這一切的。實(shí)現(xiàn)方法Microsoft為IOCP提供了相應(yīng)的 API函數(shù),主要的就兩個(gè),我們逐一的來看一
13、下:HANDLE CreateloCompletio nPort (HANDLE FileHa ndle,/ han dle to fileHANDLE Existi ngCompletio nPort,/ han dle to I/O completion portULONG_PTR Completio nKey,/ completion keyDWORD NumberOfC on curre ntThreads / n umber of threads to execute con curre ntly);在討論各參數(shù)之前,首先要注意該函數(shù)實(shí)際用于兩個(gè)截然不同的目的:1 用于創(chuàng)建一個(gè)完成端
14、口對(duì)象2 將一個(gè)句柄HANDLE和完成端口關(guān)聯(lián)到一起在創(chuàng)建一個(gè)完成一個(gè)端口的時(shí)候,我們只需要填寫一下 NumberOfCo ncurre ntThreads 這個(gè)參數(shù)就可以了。它告訴系統(tǒng)一個(gè)完成端口上同時(shí)允許運(yùn)行的線程最大數(shù)。在默認(rèn)情況下,所開線程數(shù)和CPU數(shù)量相同,但經(jīng)驗(yàn)給我們一個(gè)公式:線程數(shù)=CPU數(shù)* 2 + 2要使完成端口有用,你必須把它同一個(gè)或多個(gè)設(shè)備相關(guān)聯(lián)。這也是調(diào)用CreateIoCompletio nPort完成的。你要向該函數(shù)傳遞一個(gè)已有的完成端口的句柄,我們既然要處理網(wǎng)絡(luò)事件,那也就是將客戶的socket作為HANDLE傳進(jìn)去。和一個(gè)完成鍵對(duì)你有意義的一個(gè) 32位值,也就是
15、一個(gè)指 針,操作系統(tǒng)并不關(guān)心你傳什么。每當(dāng)你向端口關(guān)聯(lián)一個(gè)設(shè)備時(shí),系統(tǒng)向該完成端口的設(shè)備列表中加入一條信息紀(jì)錄。另一個(gè)API就是BOOL GetQueuedCompletio nStatus(/ handle to completion port/ bytes tran sferred/ file completion key/ buffer/ opti onal timeout valueHANDLE Completio nPort,LPDWORD lpNumberOfBytes,PULONG_PTR lpCompletio nKey,LPOVERLAPPED *lpOverlapped,D
16、WORD dwMilliseco nds);I/O完成端口,第一個(gè)參數(shù)指岀了線程要監(jiān)視哪一個(gè)完成端口。很多服務(wù)應(yīng)用程序只是使用一個(gè)GetQueuedCompletio nStatus使所有的I/O請求完成以后的通知都將發(fā)給該端口。簡單的說,調(diào)用線程掛起,直到指定的端口的I/O完成隊(duì)列中岀現(xiàn)了一項(xiàng)或直到超時(shí)。同I/O完成端口相關(guān)聯(lián)的第3個(gè)數(shù)據(jù)結(jié)構(gòu)是使線程得到完成I/O項(xiàng)中的信息:傳輸?shù)淖止?jié)數(shù),完成鍵和OVERLAPPED結(jié)構(gòu)的地址。該信息是通過傳遞給GetQueuedCompleti on Satatus的IpdwNumberOfBytesTra nsferred,lpdwCompletionKey 和 lpOverlapped 參數(shù)返回給線程的根據(jù)到目前為止已經(jīng)講到的東西,首先來構(gòu)建一個(gè)frame。下面為您說明了如
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版國際物流運(yùn)輸服務(wù)電子合同風(fēng)險(xiǎn)評(píng)估與管理3篇
- 西安歐亞學(xué)院《鉆井液工藝原理》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度廚師團(tuán)隊(duì)培訓(xùn)與績效評(píng)估合同3篇
- 武漢大學(xué)《鋼琴與伴奏》2023-2024學(xué)年第一學(xué)期期末試卷
- 二零二五版人工智能教育合資協(xié)議范本3篇
- 二零二五版建筑行業(yè)工人薪資保障合同范本2篇
- 二零二五年度冷鏈物流車隊(duì)運(yùn)輸合作協(xié)議3篇
- 2024版砌體工程建筑承包合同細(xì)則版B版
- 二零二五年知識(shí)產(chǎn)權(quán)侵權(quán)糾紛調(diào)解與法律咨詢協(xié)議3篇
- 二零二五年房地產(chǎn)項(xiàng)目價(jià)值評(píng)估與增值服務(wù)合同3篇
- 營運(yùn)經(jīng)理招聘筆試題與參考答案2024年
- 人教版小學(xué)英語各冊單詞表(帶英標(biāo))
- 廣東省潮州市潮安區(qū)2023-2024學(xué)年六年級(jí)上學(xué)期期末考試數(shù)學(xué)試題
- SONY索尼數(shù)碼照相機(jī)DSC-HX200使用說明書
- 電子電工實(shí)驗(yàn)室項(xiàng)目可行性研究報(bào)告
- 2024中國保險(xiǎn)發(fā)展報(bào)告-中南大風(fēng)險(xiǎn)管理研究中心.燕道數(shù)科
- 醫(yī)院突發(fā)事件應(yīng)急預(yù)案工作總結(jié)
- 《海底電力電纜輸電工程施工及驗(yàn)收規(guī)范》
- (試題)考試護(hù)理應(yīng)急預(yù)案題庫與答案
- 【閱讀提升】部編版語文五年級(jí)下冊第一單元閱讀要素解析 類文閱讀課外閱讀過關(guān)(含答案)
- 鄉(xiāng)村治理中正式制度與非正式制度的關(guān)系解析
評(píng)論
0/150
提交評(píng)論