亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于完成端口的網(wǎng)絡(luò)服務(wù)應(yīng)用程序開發(fā)

        2009-07-13 10:09:06王愛平
        新媒體研究 2009年21期
        關(guān)鍵詞:句柄網(wǎng)絡(luò)服務(wù)線程

        王愛平 唐 玄

        [摘要]由于互聯(lián)網(wǎng)的普及,在線人數(shù)也越來(lái)越多,這就提高對(duì)服務(wù)器端應(yīng)用程序性能的要求。因此,講述windows平臺(tái)上高性能網(wǎng)絡(luò)服務(wù)應(yīng)用程序的開發(fā)方法。

        [關(guān)鍵詞]完成端口IOCP網(wǎng)絡(luò)服務(wù)

        中圖分類號(hào):TP3文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1671-7597(2009)1110084-01

        一、引言

        隨著網(wǎng)絡(luò)的廣泛應(yīng)用,企事業(yè)單位、公司都需要開發(fā)網(wǎng)絡(luò)服務(wù)應(yīng)用程序,用于和客戶進(jìn)行交互。網(wǎng)絡(luò)服務(wù)應(yīng)用程序一般可采用B/S、C/S模式開發(fā),其中,B/S模式已經(jīng)廣泛地應(yīng)用在WEB應(yīng)用程序上。然而,要實(shí)現(xiàn)實(shí)時(shí)、高性能的網(wǎng)絡(luò)服務(wù)應(yīng)用程序,仍需要采用C/S模式的開發(fā)方式。在windows操作系統(tǒng)環(huán)境下,使用C/S模式開發(fā),主要考慮網(wǎng)絡(luò)服務(wù)程序的服務(wù)器端程序性能,能支持大量用戶并發(fā)。這就需要使用完成端口模型來(lái)開發(fā)服務(wù)器端程序。

        二、使用完成端口

        完成端口,又稱Input/Output Completion Port(IOCP),是windows

        操作系統(tǒng)中非常復(fù)雜的一種I/O模型。它可以同時(shí)為大量的SOCKET提供服務(wù),因此它是windows操作系統(tǒng)中開發(fā)高性能網(wǎng)絡(luò)應(yīng)用服務(wù)器的首選。

        創(chuàng)建完成端口時(shí),windows操作系統(tǒng)會(huì)創(chuàng)建一個(gè)內(nèi)核對(duì)象。使用完成端口時(shí),將該內(nèi)核對(duì)象與SOCKET進(jìn)行關(guān)聯(lián),則SOCKET產(chǎn)生的事件會(huì)通知到該完成端口,此時(shí),就可以通過(guò)完成端口對(duì)SOCKET進(jìn)行相關(guān)操作了。

        使用完成端口常用3個(gè)相關(guān)函數(shù):

        1.CreateIoCompletionPort(

        HANDLE FileHandle,

        HANDLE ExistingCompletionPort,

        ULONG_PTR CompletionKey,

        DWORD NumberOfConcurrentThreads);

        本函數(shù)用來(lái)創(chuàng)建完成端口對(duì)象、關(guān)聯(lián)完成端口對(duì)象和其他內(nèi)核對(duì)象。

        FileHandle是用來(lái)和完成端口對(duì)象關(guān)聯(lián)的內(nèi)核對(duì)象句柄;ExistingCo

        mpletionPort是已經(jīng)創(chuàng)建好的完成端口對(duì)象句柄,FileHandle所指定的內(nèi)核對(duì)象I/O事件將會(huì)通知到該完成端口對(duì)象;CompletionKey是完成鍵,可以為任何用戶指定的值,其目的是程序可以借此參數(shù)和完成端口之間傳遞值,方便與完成端口之間的通信。NumberOfConcurrentThreads用于指定同時(shí)可以并發(fā)的線程數(shù)量,取0表示并發(fā)線程數(shù)據(jù)為系統(tǒng)中CPU的數(shù)量。

        2.GetQueuedCompletionStatus(

        HANDLE CompletionPort,

        LPDOWRD lpNumberOfBytesTransferred,

        PULONG_PTR lpCompletionKey,

        LPOVERLAPPED *lpOverlapped,

        DWORD dwMilliseconds);

        本函數(shù)用來(lái)獲取完成端口狀態(tài)。調(diào)用本函數(shù)后,線程掛起。當(dāng)與該完成端口相關(guān)聯(lián)的內(nèi)核對(duì)象I/O操作完成時(shí),喚醒線程。

        CompletionPort為完成端口對(duì)象句柄;lpNumberOfBytestTransferred

        是I/O操作中傳輸?shù)淖止?jié)數(shù);lpCompletionKey是調(diào)用CreateIoCompletionP

        Ort時(shí)傳入的CompletionKey參數(shù);lpOverlapped為L(zhǎng)POVERLAPPED的指針類型,是操作系統(tǒng)管理完成端口需要的系統(tǒng)類型,通常I/O傳輸緩沖區(qū)是由該結(jié)構(gòu)指定的;dwMilliseconds指定超時(shí)時(shí)間。

        3.PostQueruedCompletionStatus(

        HANDLE CompletionPort,

        DWORD dwNumberOfBytesTransferred,

        ULONG_PTR lpCompletionKey,

        LPOVERLAPPED *lpOverlapped);

        本函數(shù)用來(lái)向完成端口發(fā)送信息以改變程序流程。

        三、系統(tǒng)設(shè)計(jì)

        服務(wù)器程序主線程程序流程:1.調(diào)用CreateIoCompletionPort函數(shù)創(chuàng)建完成端口;2.調(diào)用_beginthreadex函數(shù)創(chuàng)建一定數(shù)量工作者線程ThreadProc;3.調(diào)用socket函數(shù)創(chuàng)建偵聽套接字并使用listen函數(shù)在指定端口開始偵聽;4.調(diào)用WSAAccept函數(shù)等待客戶端連接(此時(shí)主線程將掛起)。當(dāng)客戶端連接成功,則創(chuàng)建完成鍵(一般包含客戶端相關(guān)信息),關(guān)聯(lián)完成端口與WSAccept返回的新套接字句柄,并向該套接字句柄投遞一個(gè)或多個(gè)異步WSARecv或WSASend請(qǐng)求。循環(huán)執(zhí)行本操作,直至程序結(jié)束。

        服務(wù)器程序工作者線程程序流程:調(diào)用GetQueuedCompletionPort函數(shù),線程掛起。當(dāng)操作系統(tǒng)喚醒該線程時(shí),GetQueuedCompletionPort返回I/O傳輸相關(guān)信息。此時(shí),根據(jù)返回相關(guān)參數(shù)值執(zhí)行相應(yīng)程序。

        四、改進(jìn)措施

        1.使用AcceptEx。由于WSAAccept調(diào)用之后,主線程將會(huì)被阻塞,直到有客戶端連接時(shí)才被喚醒;而且,當(dāng)某個(gè)客戶端連接的時(shí)候,獨(dú)占主線程,其它客戶端將無(wú)法連接服務(wù)器。因此,這里可以采用異步函數(shù)AcceptEx。使用AcceptEx函數(shù)可以同時(shí)創(chuàng)建多個(gè)套接字,并使它們處于等待用戶連接狀態(tài)。而且,AcceptEx也采用了OVERLAPPED結(jié)構(gòu),它也可以和完成端口相關(guān)聯(lián),可以在工作者線程中統(tǒng)一處理客戶端連接事件。這樣,就提高了接受客戶端連接的效率。

        2.使用線程池。microsoft推薦使用的線程數(shù)為CPU數(shù)量乘以2加1,這是為了避免線程頻繁切換引起的系統(tǒng)開銷,這也是完成端口的優(yōu)點(diǎn)。但實(shí)際上,服務(wù)請(qǐng)求所需數(shù)量不應(yīng)用永遠(yuǎn)取此值,它取決于應(yīng)用程序的總體設(shè)計(jì)情況。如果系統(tǒng)中現(xiàn)有工作者線程均處于掛起或鎖定狀態(tài),這時(shí)就需要額外創(chuàng)建新的工作者線程來(lái)響應(yīng)I/O操作,從而提高整個(gè)系統(tǒng)的運(yùn)行效率。

        3.使用內(nèi)存池。在新用戶連接服務(wù)器時(shí),需要為每一個(gè)用戶分配一個(gè)結(jié)構(gòu)體存儲(chǔ)OVERLAPPED結(jié)構(gòu)、數(shù)據(jù)傳輸緩沖區(qū)、完成鍵等信息。如果每來(lái)一個(gè)用戶,就分配一塊內(nèi)存,服務(wù)器就需要頻繁地開辟新空間;而如果每一個(gè)用戶斷開連接時(shí),服務(wù)器就需要頻繁地釋放所占內(nèi)存。這樣會(huì)導(dǎo)致系統(tǒng)性能下降。因此,服務(wù)器應(yīng)用程序可以預(yù)先分配一定數(shù)量?jī)?nèi)存,當(dāng)新用戶連接服務(wù)器時(shí),從中獲取一塊標(biāo)識(shí)為“未使用”的內(nèi)存用于保存信息,標(biāo)識(shí)為“已占用”;當(dāng)該用戶斷開與服務(wù)器連接時(shí),標(biāo)識(shí)該塊內(nèi)存為“未使用”。這樣,就可以有效地避免了服務(wù)器頻繁地分配與釋放內(nèi)存。

        五、結(jié)束語(yǔ)

        經(jīng)測(cè)試,使用完成端口設(shè)計(jì)的服務(wù)器端應(yīng)用程序可以充分發(fā)揮服務(wù)器的性能,支持海量用戶連接與傳輸信息。

        參考文獻(xiàn):

        [1]Jeffrey Richter,windows核心編程,機(jī)械工業(yè)出版社[M].北京,2005年9月.

        [2]Jeffrey Richter,windows高級(jí)編程指南,清華大學(xué)出版社[M].北京,2001年12月.

        猜你喜歡
        句柄網(wǎng)絡(luò)服務(wù)線程
        《壓縮機(jī)技術(shù)》網(wǎng)絡(luò)服務(wù)
        《壓縮機(jī)技術(shù)》網(wǎng)絡(luò)服務(wù)
        網(wǎng)絡(luò)服務(wù)合同的法律問(wèn)題研究
        法制博覽(2021年18期)2021-11-24 20:45:30
        高校圖書館持久標(biāo)識(shí)符應(yīng)用研究
        編譯程序語(yǔ)法分析句柄問(wèn)題分析與探討
        淺談linux多線程協(xié)作
        MFC應(yīng)用程序多線程混合顯示界面方法研究
        基于SPY++的軟件功能擴(kuò)展的研究
        云計(jì)算趨勢(shì)下的藍(lán)汛內(nèi)容感知網(wǎng)絡(luò)服務(wù)
        Linux線程實(shí)現(xiàn)技術(shù)研究
        日本超骚少妇熟妇视频| 亚洲黄色精品在线播放| 日本黄色影院一区二区免费看| 亚洲一区二区av天堂| 国产精品亚洲一级av第二区| 国产精品一区二区三区播放| 色噜噜亚洲男人的天堂| 久久青青草原亚洲av无码麻豆| 少妇人妻偷人精品视蜜桃| 色系免费一区二区三区| 自拍偷拍另类三级三色四色| 久久精品天堂一区二区| 国产成人精品久久二区二区91 | 97久久综合精品国产丝袜长腿| 日本av一区二区三区在线| 色偷偷亚洲第一成人综合网址| 爱性久久久久久久久| 欧美巨大xxxx做受中文字幕| 玩弄放荡人妻一区二区三区| 久久精品国产热| 国产高跟丝袜在线诱惑| 国产精品老熟女乱一区二区| 中文人妻熟女乱又乱精品| 国产精品人妻一区二区三区四| 成年无码aⅴ片在线观看| 国产在视频线精品视频二代| 日韩精品视频免费福利在线观看| 精品久久一品二品三品| 欧美激情一区二区三区成人| 无码va在线观看| 推油少妇久久99久久99久久 | 亚洲综合av永久无码精品一区二区 | 国产成人午夜高潮毛片| 亚洲男人第一无码av网站| 国产va免费精品高清在线| 国产精品久久中文字幕第一页| 自拍av免费在线观看| 久久一区二区三区老熟女| 亚洲欧美国产精品久久| 老头巨大挺进莹莹的体内免费视频| 亚洲AV无码乱码一区二区三区 |