Windows核心編程 - 同步設備I/O 與異步設備I/0

1. I/O設備

    Windows支持的常見I/O設備包括有文件、目錄、邏輯磁盤驅動器、物理磁盤驅動器、串口、並口、郵槽、管道、套接字、控制檯。但對Windows系統層面來說,不太關心具體設備是爲哪一種,將設備都抽象成是“文件”,對設備的操作即是對文件進行操作。常用的打開設備的API函數有:CreateFile()、CreateNamedPipe()(命令管道)、CreatePipe()(匿名管道)、Socket()(套接字)等。對設備數據進行讀寫的API函數是:ReadFile()和WriteFile()。

2.同步I/O

   同步I/O是指我們調用一個函數來告知系統要對某個設備進行讀取或寫入數據,這個函數會一直等待I/O完成纔會返回,在等待期間,調用函數的線程是處於阻塞狀態的。爲什麼會阻塞呢? 是因爲硬件特性導致速度不匹配的原因,速度較快的需等待速度相對慢的操作完成,拿到操作結果後才能往下繼續執行。 假如打開設備(CreateFile)時是以同步方式打開,那麼上面提到的ReadFile()和WriteFile()都是以同步方式進行I/O請求,如果想以異步方式調用,則在CreateFile打開設備時需設置異步FILE_FLAG_OVERLAPPED的參數標記。有個常見的例子,我們在使用有界面的窗口程序時,在用鼠標點擊或鍵盤輸入時,所產生的鼠標、鍵盤消息都會由操作系統添加到該窗口程序的消息隊列中,由該窗口程序的界面線程來消費、處理。假設在鼠標點擊或鍵盤輸入時,窗口線程正在等待ReadFile()或WriteFile()返回而被阻塞,那麼鼠標、鍵盤消息將得不到處理,就是我們所常見的程序窗口停止響應或未響應現象。

3.異步I/O

   異步I/O與同步I/O是相對的,是指我們調用一個函數來告知系統要對某個設備進行讀取或寫入數據,但這個函數不會等待I./O完成,而是立即返回, 由操作系統在它自己的線程中完成具體的I/O操作,當操作系統 I/O操作完成後會有通知。上面有提到,用CreateFile打開設備時,指定FILE_FLAG_OVERLAPPED的參數標記就能異步方式打開,這樣後面進行的I/O請求將會添加到設備驅動程序的隊列中,由驅動程序完成實際的I/O操作,線程可以繼續執行其它任務,不必掛起。

4.取消隊列中I/O請求

    有時我們可以需要在設備驅動程序對一個已經添加到隊列的I/O請求者處理之前將其取消,取消的方式有如下幾種:

   1)調用CancelIo(HANDLE hFile);

   2) 關閉設備句柄;

   3)當線程終止時,操作系統會自動取消該線程所發出的所有I/O請求;

   4)如果需要將發往給定文件句柄的一個指定的I/O請求取消,可使用 CancleIoEx(HANDLE hFile , LPOVERLAPPED pOverlappad);

5.接收I/O請求的通知

    接收I/O請求通知的以下幾種方法:

 1)觸發設備內核對象:允許一個線程發出I.O請求,另一個線程對結果進行處理;

  2)觸發事件內核對象: 允許向一個設備同時發出多個I/O請求, 允許 一個線程發出I/O請求,另一個線程對結果進行處理;

  3)使用可提醒I/O: 允許向一個設備同時發出多個I/O請求, 發出I/O請求的線程必須對結果進行處理;

  4)使用I/O完成端口: 允許向一個設備同時發出多個I/O請求, 允許 一個線程發出I/O請求,另一個線程對結果進行處理;這種伸縮性與靈活性最佳。

       幾種方法具體介紹與區別後續再進行了解。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章