010 異步I/O處理 003
阿新 • • 發佈:2017-05-28
lpn color seconds 多核 數據 進行 napi 文件 creat
● 異步I/0
○ 使用設備內核對象
○ 使用事件內核對象 提醒同步以及交互
○ 可提醒I/O 不可跨線程的
○ I/O完成端口
⊙ I/O完成端口
○ 串行模型來進行異步IO操作
○ 並行模型 -> 多線程
○ 1個工人 -> 加工零件 -> 5天 -> 串行
○ 5個工人 -> 加工零件 -> 1天 -> 並行
○ 單核 -> 模擬出來的多進程 線程
○ 多核 -> 多線程 核心數 -> CPU的一個核心
○ 一個進程內可以有多個線程 多線程
○ 線程和線程之間可以相互融合
⊙ I/O完成端口 天生就是並行模式
○ 並行模型 -> 多線程
○ 創建隊列
○ 設備
○ 設備
○ 設備操作的隊列
○ 線程池
○ 多個線程
○ 創建一個完成端口
1 HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 0);
● CreateIoCompletionPort 函數
1 HANDLE WINAPI CreateIoCompletionPort( 2 _In_ HANDLE FileHandle, //內核對象 3 _In_opt_ HANDLE ExistingCompletionPort, //已存在的完成端口 為NULL 則位新建一個IOCP 4 _In_ ULONG_PTR CompletionKey, //傳遞處理函數的參數 5 _In_ DWORD NumberOfConcurrentThreads //設置線程數 盡量根據物理實際設置 6 );
● PostQueuedCompletionStatus
1 BOOL WINAPI PostQueuedCompletionStatus(2 _In_ HANDLE CompletionPort, //指定想向其發送一個完成數據包的完成端口對象 3 _In_ DWORD dwNumberOfBytesTransferred, //指定—個值,直接傳遞給GetQueuedCompletionStatus函數中對應的參數 4 _In_ ULONG_PTR dwCompletionKey, //指定—個值,直接傳遞給GetQueuedCompletionStatus函數中對應的參數 5 _In_opt_ LPOVERLAPPED lpOverlapped //指定—個值,直接傳遞給GetQueuedCompletionStatus函數中對應的參數 6 );
● GetQueuedCompletionStatus
BOOL WINAPI GetQueuedCompletionStatus( _In_ HANDLE CompletionPort, //指定想向其發送一個完成數據包的完成端口對象 _Out_ LPDWORD lpNumberOfBytes, //一次完成後的I/O操作所傳送數據的字節數。 _Out_ PULONG_PTR lpCompletionKey, //當文件I/O操作完成後,用於存放與之關聯的CK。 _Out_ LPOVERLAPPED *lpOverlapped, //OVERLAPPED 結構體指針 _In_ DWORD dwMilliseconds //用於指定調用者等待CP的時間。 );
010 異步I/O處理 003