Windows核心程式設計 非同步I O之完成埠

2021-09-19 15:43:53 字數 804 閱讀 9188

1. 背景

構建乙個服務應用程式,常用的主要有兩種模型: 序列模型和並行模型。

缺點:不能同時處理多個請求。

2. 建立i/o完成埠

i/o完成埠會對併發執行的執行緒數量設定乙個上限,即執行緒數量不能隨著請求個數增加而線性增長,一般是根據機器本身的cpu個數來選擇乙個合適的上限,以減少核心執行執行緒上下文切換的花銷。在應用程式初始化的時候,會建立乙個執行緒池,並讓執行緒池中的執行緒在應用程式執行期間處於可調用度狀態,得以提高服務應用程式的效能。

建立i/o完成埠的函式用: createiocompletionport(),此函式有引數可指定執行緒池的大小。當建立乙個i/o完成埠時,系統核心會建立5個不同的資料結構:

3)等待執行緒佇列(**先出):當執行緒池中的每個執行緒呼叫getqueuecompletionstatus()時,呼叫執行緒的執行緒id會被新增到等待執行緒佇列,這是告知i/o完成埠核心物件,有哪些執行緒在等待處理已完成的i/o請求,當i/o完成佇列**現一項時,i/o完成埠就會喚醒等待執行緒佇列中的乙個執行緒來進行處理。該佇列是**先出的,假設有3個執行緒在等待執行緒佇列中,當i/o完成佇列出現乙個項時,則最後呼叫getqueuecompletionstatus()的執行緒3會被喚醒來處理這個項。執行緒3處理完這個項後,會再次呼叫getqueuecompletionstatus()進入等待執行緒佇列,這時如果i/o完成佇列又來了一項,則執行緒3會被再次喚醒來處理這個項。

4)已釋放執行緒列表:當完成埠在等待執行緒佇列中喚醒的執行緒或已暫停的執行緒被喚醒,都會進入到已釋放執行緒列表;

5)已暫停執行緒列表:如果乙個已釋放的執行緒,在工作過程中切換到了等待狀態,則會被放入到已暫停執行緒列表。

Linux 核心101 非同步IO

posix 非同步 io inte ce aio 定義了允許程序建立乙個或多個非同步的 io 操作的介面。程序可以在 io 操作完成之後得到作業系統的通知,手段包括 不通知 訊號 例項化thread。注意 這只是 posix the portable operating system inte ce...

網路程式設計之IO模型 非同步IO

linux下的asynchronous io其實用得不多,從核心2.6版本才開始引入。先看一下它的流程 使用者程序發起read操作之後,立刻就可以開始去做其它的事。而另一方面,從kernel的角度,當它受到乙個asynchronous read之後,首先它會立刻返回,所以不會對使用者程序產生任何bl...

Windows核心程式設計

內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...