Overlapped I/O:發起 I/O 請求後立即返回,由系統內部線程異步執行,完成後通知應用。實現「I/O 與計算並行」,提高「受 I/O 限制程序」的吞吐率。
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 取完成包 | 可擴展性最強,線程池自動平衡,支持海量并发 | 編程模型較複雜 |
OVERLAPPED*、傳輸字節數、鍵值,輕松關聯上下文。FILE_SKIP_COMPLETION_PORT_ON_SUCCESS 避免無謂入隊。小數據量(如 <4KB)Overlapped I/O 可能慢於同步 I/O(系統判定可即時完成而同步執行,或隊列開銷大於傳輸時間)。大數據量、高并发時優勢明顯。
I/O 完成會暫時提升線程優先級(I/O 完成提升),防止優先級反轉。可用 Get/SetThreadPriority 管理,注意優先級繼承問題。