日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 物聯(lián)網(wǎng) > 《物聯(lián)網(wǎng)技術》雜志
[導讀]摘 要:介紹了Windows最復雜的內(nèi)核對象IOCP (I/O Completion Port輸入/輸出完成端口)的基本原理。利用完成端 口機制,應用程序能夠為數(shù)百上千的用戶服務。文章通過完成端口對象指定一定數(shù)量的線程,對重疊I/O請求進行管理,從而 為已完成的重疊I/O請求提供服務。通過該模型編寫的網(wǎng)絡服務應用程序可以達到較好的性能。

引言

與計算機執(zhí)行的大多數(shù)其他操作相比,設備I/O是其中 最慢、最不可預測的操作之一。比如CPU從硬盤文件中讀寫、 網(wǎng)絡讀取數(shù)據(jù)等,每一線程要等待I/O操作完成再執(zhí)行后續(xù) 的代碼。讓太多或者太少的服務器線程來處理線程,都可能 會導致性能問題。使用異步設備I/O可以將請求交給設備的 驅(qū)動程序去處理,應用程序的線程可以執(zhí)行其他有用的任務。 這樣可以更好地使用資源并創(chuàng)建出更高效的應用程序。

但是,隨著客戶端請求、退出的增加,會有許多的并發(fā) 線程并發(fā)執(zhí)行。由于這些線程都是可運行狀態(tài),Windows內(nèi) 核會浪費太多時間來進行活動線程的上下文切換,如不斷新 建和銷毀線程。Windows提供了 I/O完成端口機制可以很好 地解決上述問題。

IOCP模型

當我們創(chuàng)建一個I/O完成端口的時候,系統(tǒng)內(nèi)核實際上 會創(chuàng)建5個不同數(shù)據(jù)結構。完成端口會將客戶請求加入到一 個公共的消息隊列中,然后應用程序會創(chuàng)建一個線程池來處 理客戶的請求。當設備與I/O完成端口相關聯(lián)后,系統(tǒng)會檢查 是否有與設備相關的一個I/O端口,若有則會將已完成的I/O 請求追加到消息隊列,并調(diào)用相關的工作線程來處理這個請求。 當這個請求被處理完后,系統(tǒng)會通過一種機制通知客戶,客戶 只需要取處理好的數(shù)據(jù)即可。圖1所示是一個完成端口模型 的結構示意圖。

IOCP模型的使用

在實現(xiàn)異步通信機制的時候,一般要用到一個核心數(shù)據(jù) 結構重疊(OVERLAPPED)結構。OVERLAPPED結構定義

如下:

typedef struct _OVERLAPPED

{

DWORD Internal ;//[out]保存已處理的I/O請求的錯誤碼 DWORD InternalHigh ; //[out]異步I/O完成保存已傳輸?shù)淖?節(jié)數(shù)

DWORD Offset ; //[int]文件傳送的字節(jié)偏移量的低位字 DWORD OffsetHigh ;//[int]文件傳送的字節(jié)偏移量的高位字 HANDLE hEvent ; //[in]指定一個I/O操作完成后觸發(fā)的事件 [OVERLAPPED, *LPOVERLAPPED ;

OVERLAPPED結構執(zhí)行兩個重要的功能:第一,它像 一把鑰匙,用以識別每一個目前正在進行的overlapped操 作,比如在網(wǎng)絡發(fā)送和接收數(shù)據(jù)時,都會用到WSASend()和 WSARecv。函數(shù),參數(shù)里面都會附帶一個重疊結構,這個重 疊結構我們可以理解為一個網(wǎng)絡操作的ID號,通過這個ID 號就可以區(qū)分是對哪個網(wǎng)絡進行操作了;第二,它在你和系統(tǒng) 之間提供了一個共享區(qū)域,參數(shù)可以在該區(qū)域中雙向傳遞。

基于完成端口模型的應用程序?qū)崿F(xiàn)

2.1創(chuàng)建I/O完成端口

_inHANDLEFileHandle,

_in_optHANDLEExistingCompletionPort,

_inULONG_PTRCompletionKey,

_inDWORDNumberOfConcurrentThreads);

PULONG_PTRlpCompletionKey,//當文件I/O操作完成后,用于存放與之關聯(lián)的CK(套接字信息結構體指針)

LPOVERLAPPED*lpOverlapped,//為調(diào)用IOCP機制所引用的OVERLAPPED結構

DWORDdwMilliseconds,//用于指定調(diào)用者等待

該函數(shù)用于創(chuàng)建一個完成端口對象和將一個句柄同完成CP的時間

端口關聯(lián)在一起。在創(chuàng)建一個完成端口時,前三個參數(shù)都會忽);

略,NumberOfConcurrentThreads參數(shù)指定允許有多少線程處于可運行狀態(tài)。通常給NumberOfConcurrentThreads參數(shù)當一^工作者線程從GetQueuedCompletionStatus調(diào)用中接收到I/O完成通知后,在lpCompletion和lpOverlapped參

設為0,那么I/O完成端口會使用默認值,也就是允許并發(fā)執(zhí)數(shù)中,會包含一些必要的套接字信息。利用這些信息,可通

行的線程數(shù)量等于主機的CPU數(shù)量,避免額外的上下文切換。

過完成端口,繼續(xù)在一個套接字上進行I/O處理。通過這些

代碼如下:hIOCP=CreateIoCompletionPort(INVALID_HANDLE

VALUE,NULL,0,0);

2.2工作者線程和完成端口

成功創(chuàng)建一個完成端口后,便可開始將套接字句柄和對象關聯(lián)到一起。但是在關聯(lián)套接字之前,必須創(chuàng)建一個或多個工作者線程,以便在I/O請求投遞完成端口對象后,為完成端口提供服務。應該創(chuàng)建多少個線程?在此要記住一個重點,在調(diào)用CreateIoCompletionPort時指定的并發(fā)線程數(shù)量,與打算創(chuàng)建的線程池線程數(shù)量是有區(qū)別的。假如在完成端口上創(chuàng)建的工作者線程數(shù)量超過指定并發(fā)執(zhí)行的線性數(shù)量(這里設為n個),那么系統(tǒng)最多只允許n個線程運行。因為我們隨時都能執(zhí)行更多的線程,比如調(diào)用了函數(shù)Sleep或WaitForSingleObject使其處于暫停狀態(tài),就要用另外線程代替。為了充分發(fā)揮系統(tǒng)性能,一般設置為CPU的數(shù)量乘以2。

2.3完成端口與重疊I/O

創(chuàng)建好工作者線程后,調(diào)用GetQueuedCompletionStatus)函數(shù)讓句柄和完成端口相關聯(lián)起來,進行I/O請求處理。它將調(diào)用線程切換到睡眠狀態(tài),直到指定的完成端口的隊列中出現(xiàn)該請求。如以套接字句柄為基礎,投遞數(shù)據(jù)發(fā)送和接收請求,會掃描完成端口的隊列里是否有網(wǎng)絡通信的請求存在(如讀取數(shù)據(jù)、發(fā)送數(shù)據(jù)等),一旦發(fā)現(xiàn)消息隊列中出現(xiàn)一項的時候,該完成端口會喚醒線性池中的一個線程。這個線程會得到已完成I/O項中的所有信息:

已傳輸?shù)淖止?jié)數(shù)、完成鍵以及OVERLAPPED結構的地址。GetQueuedCompletionStatus()函數(shù)定義如下:

BOOLGetQueuedCompletionStatus(

HANDLECompletionPort,//指定的IOCP,該值由CreateIoCompletionPort函數(shù)創(chuàng)建

LPDWORDlpNumberOfBytes,//一次完成后的I/O操作所傳送數(shù)據(jù)的字節(jié)數(shù)

參數(shù),可獲得兩種重要的套接字數(shù)據(jù)類型:單句柄數(shù)據(jù)以及單I/O操作數(shù)據(jù)。單I/O操作數(shù)據(jù)是CompletionKey(完成鍵)參數(shù)標識的是某個特定的套接字句柄數(shù)據(jù),相當于用一個標志來綁定每一個I/O操作,這樣收到網(wǎng)絡操作完成的通知后,可以通過這個標志來找出返回的數(shù)據(jù)對應的I/O操作。該標志可以定義如下:

typedefstruct_PER_IO_CONTEXT{

OVERLAPPEDm_Overlapped;//每一^重疊I/O網(wǎng)絡操作都要有一個

SOCKETm_sockAccept;//這個I/O操作所使用的Socket,每個連接的都是一樣的

WSABUFm_wsaBuf;//存儲數(shù)據(jù)的緩沖區(qū),用來給重疊操作傳遞參數(shù)的

charm_szBuffer[MAX_BUFFER_LEN];//對應WSABUF里的緩沖區(qū)

OPERATION_TYPEm_OpType;//標志這個重疊1/O操作是做什么的,例如Accept/Recv等}PER_IO_CONTEXT,*PPER_IO_CONTEXT;

該結構關聯(lián)了與I/O操作的某些重要數(shù)據(jù)元素,例如完成I/O操作發(fā)送或接受請求的類型m_OpType。每一個I/O操作對應了響應的PER_IO_CONTEXT,我們還要定義單句柄數(shù)據(jù)來管理句柄上的所有I/O請求,如在Socket上投遞了多個AcceptEx請求,該結構定義如下:

typedefstruct_PER_SOCKET_CONTEXT{

SOCKETm_Socket;//每一個客戶端連接的Socket

SOCKADDR_INm_ClientAddr;//這個客戶端的地址

CArray<_PER_IO_CONTEXT*>m_arrayIoContext;//數(shù)組,所有客戶端IO操作的參數(shù),也就是說對于每一個客戶端Socket是可以在上面同時投遞多個IO請求的

2014年/第3期物聯(lián)網(wǎng)技術61\}PER_SOCKET_CONTEXT,*PPER_SOCKET_CONTEXT;

2.4關閉IOCP

調(diào)用PostQueuedCompletionStatus函數(shù),向每個工作者線程都發(fā)送一個特殊的完成數(shù)據(jù)包。可以喚醒那些還在等待完成端口但又沒有已完成的I/O請求,每個線程會對GetQueuedCompletionStatus的返回值進行檢查,如果發(fā)現(xiàn)應用程序正在終止,那么它就可以進行清理工作并正常的退出。

3IOCP程序流程

該程序調(diào)用高性能特性的AcceptEx函數(shù)用來完成端口異步,取消了阻塞方式的Accept調(diào)用。我們知道,AcceptEx是在客戶端連入之前就把客戶端的Socket建立好了,而不需要像Accept那樣在客戶端連入之后,再去時間去建立Socket。統(tǒng)可能來不及為更多的并發(fā)客戶端現(xiàn)場準備Socket。另外,相比Accept只能阻塞方式建立一個連入接口而AcceptEx可以同時在完成端口上投遞多個請求。圖2所示是其程序的整體流程圖。

基于完成端口模型的應用程序?qū)崿F(xiàn)

4結語

采用I/O完成端口編寫的服務應用程序,經(jīng)過ProcessExplorer測試發(fā)現(xiàn)當服務器收到3000個并發(fā)線程的時候CPU占有率約為4%,而采用了多個并發(fā)線程的客戶端程序CPU占有率約為12%。所以,如果預計到自己的服務器在任何給定的時間,都會為大量I/O請求提供服務,便應考慮使用I/O完成端口模型,從而獲得更好的性能。但是在編寫基于完成端口的系統(tǒng)創(chuàng)建一個Socket的開銷是相當高了,用Accept的話,系服務應用程序時,還應注意重疊操作可確保按照應用程序安排好的順序執(zhí)行。然而,不能確保從完成端口返回的完成通知也按照上述順序執(zhí)行。在對數(shù)據(jù)包有要求的時候,比如傳送大數(shù)據(jù)的時候,要注意這個順序。

20211120_6197d4b147075__基于完成端口模型的應用程序實現(xiàn)

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

憑借其全新的功能豐富的移動交易應用程序,屢獲殊榮的經(jīng)紀商HFM讓客戶實現(xiàn)觸手可及的全方位交易體驗。 毛里求斯路易港2022年10月14日 /美通社/ -- 全球多資產(chǎn)經(jīng)紀商...

關鍵字: 應用程序 FM 移動應用 ADI

倫敦2022年10月13日 /美通社/ -- Ubuntu Pro是擴展式安全維護和合規(guī)訂閱服務,目前針對數(shù)據(jù)中心和工作站已推出公開測試Beta版本。Canonical將按照...

關鍵字: UBUNTU CANONICAL BSP 應用程序

加拿大政府9月26日表示,從2022年10月1日起,加拿大將取消所有疫情下的旅行限制,包括對乘坐航班和火車乘客的疫苗接種和口罩要求。所有旅行者(無論國籍)從10月1日開始將不必通過ArriveCAN應用程序提交健康信息或...

關鍵字: ECAN 應用程序 飛機 ARRI

SIXT管理委員會批準整體可持續(xù)發(fā)展計劃,以進一步加快二氧化碳減排和智能新能源出行需求 到2030年, SIXT在歐洲車隊中的新能源車將達到70%至90% 投資5000萬歐元:公司將大...

關鍵字: 可持續(xù)發(fā)展 新能源汽車 應用程序 移動平臺

(全球TMT2022年9月22日訊)建筑項目管理軟件領域企業(yè)InEight Inc.宣布了最新的軟件創(chuàng)新,包括范圍、設計和資源管理方面的新流程標準化,以及新的進展跟蹤功能和創(chuàng)建基準驗證型進程預估和時間表的能力。該更新還...

關鍵字: 軟件 進程 應用程序 模板

InEight專注于軟件創(chuàng)新的標準化和基準更新,從而提高了效率,增加了項目信心 InEight建筑項目管理平臺的最新發(fā)展引入了新的設計管理和基準實踐,提高了各個項目之間的一...

關鍵字: 軟件 應用程序 進程 移動應用

Sumo Logic可靠性管理為企業(yè)領導者提供關鍵數(shù)據(jù),以平衡創(chuàng)新速度和服務可靠性

關鍵字: LOGIC 應用程序 PEN COM

中國晉城2022年9月7日 /美通社/ -- 希爾頓集團 (NYSE: HLT)今日宣布,晉城古書院希爾頓花園酒店正式開門迎客。作為集團旗下標志性高端精選服務酒店,首次進駐山西省的晉城古書院希爾頓花園酒店,將秉承品牌在全...

關鍵字: MIDDOT BSP 應用程序 感應器

(全球TMT2022年9月6日訊)近年來美網(wǎng)在提升數(shù)字體驗方面下了功夫,這背后,作為賽事主辦方美國網(wǎng)球協(xié)會 (USTA)長期合作伙伴的IBM及其眾多數(shù)字化解決方案功不可沒。很長時間以來,IBM Consulting與美...

關鍵字: IBM 數(shù)字化 應用程序 CODE

洛杉磯2022年8月31日 /美通社/ -- 由INKA Entworks提供的領先云端到端移動應用保護解決方案AppSealing宣布,公司榮獲2022年Gartner Hype Cycle應用安全"榜樣供應...

關鍵字: PSE APPS GARTNER 應用程序

《物聯(lián)網(wǎng)技術》雜志

2511 篇文章

關注

發(fā)布文章

編輯精選

技術子站

關閉