【windows核心編程】IO完成連接埠(IOCP)複製檔案小例前簡單說明

來源:互聯網
上載者:User

標籤:style   使用   os   strong   檔案   資料   

 

 

1、關於IOCP

    IOCP即IO完成連接埠,是一種高伸縮高效率的非同步IO方式,一個裝置或檔案與一個IO完成連接埠相關聯,當檔案或裝置的非同步IO操作完成的時候,去IO完成連接埠的【完成隊列】取一項,根據完成鍵(Complete Key)來判斷是哪個裝置或檔案的操作完成,然後再根據實際情況進行處理。

 

2、相關API 和 資料結構

 

    將一個已完成的IO通知追加到IOCP的【完成隊列】中

    BOOL   PostQueuedCompletionStatus(

        HANDLE    hCompletionPort,     //IO完成連接埠

        DWORD    dwNumBytes,          //傳輸的位元組數

        ULONG_PTR  completionKey,    //完成鍵

        OVERLAPPED*   pOverlapped    //裝置或檔案發送非同步IO請求時的關聯OVERLAPPED結構指標

)

 

   從【完成隊列】中取一項

   BOOL    GetWQueuedCompletionStatus(

       HANDLE       hCompletionPort,    //IOCP

       PWORD       pdwNumberOfBytesTransferred, //已傳輸位元組數

       PULONG_PTR   pCompletionKey,    //完成鍵

       OVERLAPPED**  ppOverlapped,     //與檔案或裝置關聯的OVERLAPPED結構,指標的指標,[out]

       DWORD    dwMilliseconds               //等待時間

)

 

 

  建立IOCP 或 將一個檔案/裝置與一個IOCP關聯起來

HANDLE WINAPI CreateIoCompletionPort(  __in      HANDLE FileHandle,               //檔案 裝置控制代碼  __in_opt  HANDLE ExistingCompletionPort,   //一個IOCP控制代碼  __in      ULONG_PTR CompletionKey,         //完成鍵  __in      DWORD NumberOfConcurrentThreads  //允許啟動並執行最大線程數量);

建立
HANDLE hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 一個數量);

關聯
CreateIoCompletionPort(hFile, hIOCP, CK_XXX, 一個數量);



OVERLAPPED結構
typedef struct _OVERLAPPED {  ULONG_PTR Internal;       //錯誤碼,系統管理  ULONG_PTR InternalHigh;  //傳輸自位元組數 系統管理  union {    struct {      DWORD Offset;         //起始位移 地位, 需要特別注意:大檔案時這個值容易溢出      DWORD OffsetHigh;    //起始位移 高位    } ;    PVOID  Pointer;  } ;  HANDLE    hEvent;         //事件核心對象} OVERLAPPED, *LPOVERLAPPED;


 

 IOCP的五個資料結構

①裝置列表

表示與該連接埠相關聯的一個或多個裝置

②IO完成隊列  FIFO

包含已傳輸位元組數、完成鍵、OVERLAPPED結構、錯誤碼等

當IO請求完成 或 調用PostQueuedCompletionStatus時 會往該隊列中添加項

③等待線程隊列  FILO

當線程池中每個線程調用GetQueuedCompletionStatus時,調用線程的線程標示符會被添加到這個等待線程隊列,這使得IOCP始終都能夠知道有哪些線程正在等待對已完成的IO請求進行處理。

④已釋放線程列表

對IO請求後進行處理的線程由於某種原因被掛起後,又被喚醒,就進入以釋放線程列表

⑤已暫停線程列表

對IO請求後進行處理的線程由於某種原因被掛起後進入已暫停線程列表

 

 

3、說明

IOCP中運行啟動並執行最大線程數一般是CPU個數

線程池中的最大線程數一般是CPU個數的2倍

 

 

下一篇用一個複製檔案的例子來示範一下IOCP的使用

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.