www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > 芯聞號 > 充電吧
[導讀]完成端口(I/O completion)原理收藏 ?異步過程調用(apcs)問題:只有發(fā)overlapped請求的線程才可以提供callback函數(shù)(需要一個特定的線程為一個特定的I/O請求服務)

完成端口(I/O completion)原理收藏 ?

異步過程調用(apcs)問題:

只有發(fā)overlapped請求的線程才可以提供callback函數(shù)(需要一個特定的線程為一個特定的I/O請求服務)。

完成端口(I/O completion)的優(yōu)點:

不會限制handle個數(shù),可處理成千上萬個連接。I/O completion port允許一個線程將一個請求暫時保存下來,由另一個線程為它做實際服務。

并發(fā)模型與線程池:

在典型的并發(fā)模型中,服務器為每一個客戶端創(chuàng)建一個線程,如果很多客戶同時請求,則這些線程都是運行的,那么CPU就要一個個切換,CPU花費了更多的時間在線程切換,線程確沒得到很多CPU時間。到底應該創(chuàng)建多少個線程比較合適呢,微軟件幫助文檔上講應該是2*CPU個。但理想條件下最好線程不要切換,而又能象線程池一樣,重復利用。I/O完成端口就是使用了線程池。

理解與使用:

第一步:

在我們使用完成端口之前,要調用CreateIoCompletionPort函數(shù)先創(chuàng)建完成端口對象。

定義如下:
HANDLE CreateIoCompletionPort(
???????????????????????????????? HANDLE FileHandle,
??????????????????????????????? HANDLE ExistingCompletionPort,
?????????????????????????????? DWORD CompletionKey,
?????????????????????????????? DWORD NumberOfConcurrentThreads
);
FileHandle:

文件或設備的handle, 如果值為INVALID_HANDLE_VALUE則產生一個沒有和任何文件handle有關系的port.( 可以用來和完成端口聯(lián)系的各種句柄,文件,套接字)

ExistingCompletionPort:

NULL時生成一個新port, 否則handle會加到此port上。

CompletionKey:

用戶自定義數(shù)值,被交給服務的線程。GetQueuedCompletionStatus函數(shù)時我們可以完全得到我們在此聯(lián)系函數(shù)中的完成鍵(申請的內存塊)。在GetQueuedCompletionStatus

中可以完封不動的得到這個內存塊,并且使用它。

NumberOfConcurrentThreads:

參數(shù)NumberOfConcurrentThreads用來指定在一個完成端口上可以并發(fā)的線程數(shù)量。理想的情況是,一個處理器上只運行一個線程,這樣可以避免線程上下文切換的開銷。如果這個參數(shù)的值為0,那就是告訴系統(tǒng)線程數(shù)與處理器數(shù)相同。我們可以用下面的代碼來創(chuàng)建I/O完成端口。

隱藏在之創(chuàng)建完成端口的秘密:

1. 創(chuàng)建一個完成端口

CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, dwNumberOfConcurrentThreads);

2. 設備列表,完成端口把它同一個或多個設備相關聯(lián)。

CreateIoCompletionPort(hDevice, hCompPort, dwCompKey, 0) ;

第二步:

根據(jù)處理器個數(shù),創(chuàng)建cpu*2個工作線程:

CreateThread(NULL, 0, ServerWorkerThread, CompletionPort,0, &ThreadID))

與此同時,服務器調用WSASocket,bind, listen, WSAAccept,之后,調用

CreateIoCompletionPort((HANDLE) Accept, CompletionPort... )把一個套接字句柄和一個完成端口綁定到一起。完成端口又同一個或多個設備相關聯(lián)著,所以以套接字為基礎,投遞發(fā)送和請求,對I/O處理。接著,可以依賴完成端口,接收有關I/O操作完成情況的通知。再看程序里:

WSARecv(Accept, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,

&(PerIoData->Overlapped), NULL)開始調用,這里象前面講過的一樣,既然是異步I/O,所以WSASend和WSARecv的調用會立即返回。

系統(tǒng)處理:

當一個設備的異步I/O請求完成之后,系統(tǒng)會檢查該設備是否關聯(lián)了一個完成端口,如果是,系統(tǒng)就向該完成端口的I/O完成隊列中加入完成的I/O請求列。

然后我們需要從這個完成隊列中,取出調用后的結果(需要通過一個Overlapped結構來接收調用的結果)。怎么知道這個隊列中已經有處理后的結果呢,調用GetQueuedCompletionStatus函數(shù)。

工作線程與完成端口:

和異步過程調用不同(在一個Overlapped I/O完成之后,系統(tǒng)調用該回調函數(shù)。OS在有信號狀態(tài)下(設備句柄),才會調用回調函數(shù)(可能有很多APCS等待處理了))

GetQueuedCompletionStatus

在工作線程內調用GetQueuedCompletionStatus函數(shù)。

GetQueuedCompletionStatus(

??? HANDLE CompletionPort,

??? LPDWORD lpNumberOfBytesTransferred,

??? LPDWORD lpCompletionKey,

??? LPOVERLAPPED *lpOverlapped,

??? DWORD dwMilliseconds

);

CompletionPort:指出了線程要監(jiān)視哪一個完成端口。很多服務應用程序只是使用一個I/O完成端口,所有的I/O請求完成以后的通知都將發(fā)給該端口。

lpNumberOfBytesTransferred:傳輸?shù)臄?shù)據(jù)字節(jié)數(shù)

lpCompletionKey:

完成端口的單句柄數(shù)據(jù)指針,這個指針將可以得到我們在CreateIoCompletionPort中申請那片內存。

lpOverlapped:

重疊I/O請求結構,這個結構同樣是指向我們在重疊請求時所申請的內存塊,同時和lpCompletionKey,一樣我們也可以利用這個內存塊來存儲我們要保存的任意數(shù)據(jù)。

dwMilliseconds:

等待的最長時間(毫秒),如果超時,lpOverlapped被設為NULL,函數(shù)返回False.

GetQueuedCompletionStatus功能及隱藏的秘密:

GetQueuedCompletionStatus使調用線程掛起,直到指定的端口的I/O完成隊列中出現(xiàn)了一項或直到超時。(I/0完成隊列中出現(xiàn)了記錄)調用GetQueuedCompletionStatus時,調用線程的ID(cpu*2個線程,每個ServerWorkerThread的線程ID)就被放入該等待線程隊列中。

等待線程隊列很簡單,只是保存了這些線程的ID。完成端口會按照后進先出的原則將一個線程隊列的ID放入到釋放線程列表中。

這樣,I/O完成端口內核對象就知道哪些線程正在等待處理完成的I/O請求。當端口的I/O完成隊列出現(xiàn)一項時,完成端口就喚醒(睡眠狀態(tài)中變?yōu)榭烧{度狀態(tài))等待線程隊列中的一個線程。線程將得到完成I/O項中的信息:傳輸?shù)淖止?jié)數(shù),完成鍵(單句柄數(shù)據(jù)結構)和Overlapped結構地址,線程是通過GetQueuedCompletionStatus返回這些信息,等待CPU的調度。

GetQueuedCompletionStatus返回可能有多種原因,如果傳遞無效完成端口句柄,函數(shù)返回False,GetLastError返回一個錯誤(ERROR_INVALID_HANDLE),如果超時,返回False, GetLastError返回WAIT_TIMEOUT, i/o完成隊列刪除一項,該表項是一個成功完成的I/O請求,則返回True。

調用GetQueuedCompletionStatus的線程是后進先出的方式喚醒的,比如有4個線程等待,如果有一個I/O,最后一個調用GetQueuedCompletionStatus的線程被喚醒來處理。處理完之后,再調用 GetQueuedCompletionStatus進入等待線程隊列中。

深入分析完成端口線程池調度原理:

假設我們運行在2CPU的機器上。創(chuàng)建完成端口時指定2個并發(fā),創(chuàng)建了4個工作線程加入線程池中等待完成I/O請求,且完成端口隊列(先入先出)中有3個完成I/O的請求的情況:

工作線程運行, 創(chuàng)建了4個工作線程,調用GetQueuedCompletionStatus時,該調用線程就進入了睡眠狀態(tài),假設這個時候,I/O完成隊列出現(xiàn)了三項,調用線程的ID就被放入該等待線程隊列中。

I/O完成端口內核對象(第3個參數(shù)等級線程隊列),因此知道哪些線程正在等待處理完成的I/O請求。當端口的I/O完成隊列出現(xiàn)一項時,完成端口就喚醒(睡眠狀態(tài)中變?yōu)榭烧{度狀態(tài))等待線程隊列中的一個線程(前面講過等待線程隊列是后進先出)。所以線程D將得到完成I/O項中的信息:傳輸?shù)淖止?jié)數(shù),完成鍵(單句柄數(shù)據(jù)結構)和Overlapped結構地址,線程是通過GetQueuedCompletionStatus返回這些信息。

在前面我們指定了并發(fā)線程的數(shù)目是2,所以I/O完成端口喚醒2個線程,線程D和線程C,另兩個繼續(xù)休眠(線程B,線程A),直到線程D處理完了,發(fā)現(xiàn)表項里還有要處理的,就喚醒同一線程繼續(xù)處理。

線程并發(fā)量:

并發(fā)量限制了與該完成端口相關聯(lián)的可運行線程的數(shù)目, 它類似閥門的作用。 當與該完成端口相關聯(lián)的可運行線程的總數(shù)目達到了該并發(fā)量,系統(tǒng)就會阻塞任何與該完成端口相關聯(lián)的后續(xù)線程的執(zhí)行, 直到與該完成端口相關聯(lián)的可運行線程數(shù)目下降到小于該并發(fā)量為止。所以解釋了線程池中的運行線程可能會比設置的并發(fā)線程多的原因。

它的作用:

最有效的假想是發(fā)生在有完成包在隊列中等待,而沒有等待被滿足,因為此時完成端口達到了其并發(fā)量的極限。此時,一個正在運行中的線程調用 GetQueuedCompletionStatus時,它就會立刻從隊列中取走該完成包。這樣就不存在著環(huán)境的切換,因為該處于運行中的線程就會連續(xù)不斷地從隊列中取走完成包,而其他的線程就不能運行了。

注意:如果池中的所有線程都在忙,客戶請求就可能拒絕,所以要適當調整這個參數(shù),獲得最佳性能。

線程并發(fā):D線程掛起,加入暫停線程,醒來后又加入釋放線程隊列。

線程的安全退出:

PostQueudCompletionStatus函數(shù),我們可以用它發(fā)送一個自定義的包含了OVERLAPPED成員變量的結構地址,里面包含一個狀態(tài)變量,當狀態(tài)變量為退出標志時,線程就執(zhí)行清除動作然后退出。

完成端口使用需要注意的地方:

1.在執(zhí)行wsasend和wsarecv操作前,請先將overlapped結構體使用memset進行清零。

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

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉