首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

Windows 重疊 I/O (Overlapped I/O) 深度解析:從事件通知到完成端口

     編輯:C++ 入門

核心概念

Overlapped I/O:發起 I/O 請求後立即返回,由系統內部線程異步執行,完成後通知應用。實現「I/O 與計算並行」,提高「受 I/O 限制程序」的吞吐率。

關鍵 API 與結構

  • CreateFile(..., FILE_FLAG_OVERLAPPED, ...):啟用異步模式。
  • OVERLAPPED 結構:Offset/OffsetHigh(64位文件偏移)、hEvent(手動重置事件)、Internal/InternalHigh(系統保留/傳輸字節數)。生命週期必須超過 I/O 調用。
  • ReadFile/WriteFile(..., &overlapped):異步讀寫。返回 TRUE 表示即時完成;FALSE + GetLastError()==ERROR_IO_PENDING 表示已排隊。

四種完成通知機制

機制原理優點缺點
文件句柄激發文件句柄本身成爲同步對象,WaitForSingleObject(hFile) + GetOverlappedResult簡單,無需額外事件Win9x 不支持;多線程共用句柄難區分哪個請求完成
事件對象OVERLAPPED.hEvent 設置為手動重置事件,完成時系統 SetEvent每請求一事件,WaitForMultipleObjects 可等待任意/所有事件對象開銷;需手動重置防丟失
APC (異步過程調用)ReadFileEx/WriteFileEx 指定回調 FileIOCompletionRoutine,線程處於 Alertable 等待時執行無需額外等待對象,代碼結構清晰必須用 SleepEx/WaitFor...Ex(bAlertable=TRUE);回調延遲執行
I/O 完成端口 (IOCP)CreateIoCompletionPort 關聯文件句柄,工作線程 GetQueuedCompletionStatus 取完成包可擴展性最強,線程池自動平衡,支持海量并发編程模型較複雜

IOCP 核心優勢

  • 系統自動調度工作線程數 ≈ CPU 核心數,避免線程過多上下文切換。
  • 完成包包含 OVERLAPPED*、傳輸字節數、鍵值,輕松關聯上下文。
  • 可對「不關心完成的請求」設置 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 避免無謂入隊。

性能誤區

小數據量(如 <4KB)Overlapped I/O 可能慢於同步 I/O(系統判定可即時完成而同步執行,或隊列開銷大於傳輸時間)。大數據量、高并发時優勢明顯。

線程優先級交互

I/O 完成會暫時提升線程優先級(I/O 完成提升),防止優先級反轉。可用 Get/SetThreadPriority 管理,注意優先級繼承問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved