異步IO、APC、IO完成端口、線程池與高性能服務器 (一)

轉載: http://www.vchelp.net/
原作者姓名 Fang([email protected])

正文
異步IO、APC、IO完成端口、線程池與高性能服務器之一 異步IO

背景:輪詢 PIO DMA 中斷

    早期IO設備的速度與CPU相比,還不是太懸殊。CPU定時輪詢一遍IO設備,看看有無處理要求,有則加以處理,完成後返回繼續工作。至今,軟盤驅動器還保留着這種輪詢工作方式。
    隨着CPU性能的迅速提高,這種效率低下的工作方式浪費了大量的CPU時間。因此,中斷工作方式開始成爲普遍採用的技術。這種技術使得IO設備在需要得到服務時,能夠產生一個硬件中斷,迫使CPU放棄目前的處理任務,進入特定的中斷服務過程,中斷服務完成後,再繼續原先的處理。這樣一來,IO設備和CPU可以同時進行處理,從而避免了CPU等待IO完成。
    早期數據的傳輸方式主要是PIO(程控IO)方式。通過對IO地址編程方式的方式來傳輸數據。比如串行口,軟件每次往串行口上寫一個字節數據,串口設備完成傳輸任務後,將會產生一箇中斷,然後軟件再次重複直到全部數據發送完成。性能更好的硬件設備提供一個FIFO(先進先出緩衝部件),可以讓軟件一次傳輸更多的字節。
    顯然,使用PIO方式對於高速IO設備來說,還是佔用了太多的CPU時間(因爲需要通過CPU編程控制傳輸)。而DMA(直接內存訪問)方式能夠極大地減少CPU處理時間。CPU僅需告訴DMA控制器數據塊的起始地址和大小,以後DMA控制器就可以自行在內存和設備之間傳輸數據,其間CPU可以處理其他任務。數據傳輸完畢後將會產生一箇中斷。

同步文件IO和異步文件IO

下面摘抄於MSDN《synchronous file I/O and asynchronous file I/O》。
有兩種類型的文件IO同步:同步文件IO和異步文件IO。異步文件IO也就是重疊IO。
在同步文件IO中,線程啓動一個IO操作然後就立即進入等待狀態,直到IO操作完成後才醒來繼續執行。而異步文件IO方式中,線程發送一個IO請求到內核,然後繼續處理其他的事情,內核完成IO請求後,將會通知線程IO操作完成了。

同步IO與異步IO示意圖 io.jpg
    如果IO請求需要大量時間執行的話,異步文件IO方式可以顯著提高效率,因爲在線程等待的這段時間內,CPU將會調度其他線程進行執行,如果沒有其他線程需要執行的話,這段時間將會浪費掉(可能會調度操作系統的零頁線程)。如果IO請求操作很快,用異步IO方式反而還低效,還不如用同步IO方式。
    同步IO在同一時刻只允許一個IO操作,也就是說對於同一個文件句柄的IO操作是序列化的,即使使用兩個線程也不能同時對同一個文件句柄同時發出讀寫操作。重疊IO允許一個或多個線程同時發出IO請求。
    異步IO在請求完成時,通過將文件句柄設爲有信號狀態來通知應用程序,或者應用程序通過GetOverlappedResult察看IO請求是否完成,也可以通過一個事件對象來通知應用程序。

參考書目

1,    MSDN Library
2,    《Windows高級編程指南》
3,    《Windows核心編程》
4,    《Windows 2000 設備驅動程序設計指南》

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