我們知道,相對于計算機執行的其他操作而言,裝置IO(檔案、管道、套接字等)是比較慢的。于是在多線程結構中就考慮到采用異步的方式進行裝置讀寫操作,即我們告訴系統對裝置的讀寫資料,而同時應用程式的其他代碼繼續執行,直到擷取裝置操作完畢的系統通知。
在進行異步IO時,我們先向系統發出IO請求,作業系統隊列化各種IO請求,并在内部完成操作,當系統在處理IO請求時,我們的線程可以傳回繼續執行,當作業系統處理完IO請求之後,通知我們資料操作(發送、接收、出錯)完畢。
Windows提供了四種異步IO技術,機制幾乎時相同的,差別在于通知結果的方式不同:
1、使一個裝置核心對象變為有信号
Windows将裝置句柄看作可同步的對象,即它可以處于有信号或處于無信号狀态,當建立裝置句柄、以異步的方式發送IO請求時,該句柄處于無信号狀态,當異步IO完成之後,該句柄受信,通過WaitForSingleobject或WaitForMultipleObjects函數可以判斷裝置操作何時完成。該技術隻能用于一個裝置隻發送一個IO請求,否則,若一個裝置對應多個操作,當句柄受信時無法判斷是該裝置的那個操作完成。 2、使一個事件核心對象變為有信号
針對每個I/O操作綁定一個核心事件對象,并将等待事件等待函數等待該事件的受信,當I/O操作完成後系統使得與該操作綁定的事件受信,進而判斷那個操作完成。該技術解決了使一個裝置核心對象變為有信号技術中一個裝置隻能對應一個操作的不足。
3、警告I/O
在該技術中,當發出裝置IO請求時,同時要求我們傳遞一個被稱為完成例程的回調函數,當IO請求完成時調用該回調函數完成我們需要處理的工作。該技術允許單個裝置同時進行多個I/O請求。
4、完成端口
完成端口技術多用于處理大規模的請求,通過内在的程序池技術可以達到很高的性能,此時暫不做深入讨論,若預知後事如何,請自己看,或等下回完成端口部分分解。
好,至此,刀磨的差不多了,估計也飄了~~~~,幹正事了。