1. 程式人生 > >010 異步I/O處理 003

010 異步I/O處理 003

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