磁盤IO:緩存IO與直接IO


    文件系統IO分為DirectIO和BufferIO,其中BufferIO也叫Normal IO。


1. 緩存IO

       緩存I/O又被稱作標准I/O,大多數文件系統的默認I/O操作都是緩存I/O。在Linux的緩存I/O機制中,數據先從磁盤復制到內核空間的緩沖區,然后從內核空間緩沖區復制到應用程序的地址空間。

       讀操作:操作系統檢查內核的緩沖區有沒有需要的數據,如果已經緩存了,那么就直接從緩存中返回;否則從磁盤中讀取,然后緩存在操作系統的緩存中。

       寫操作:將數據從用戶空間復制到內核空間的緩存中。這時對用戶程序來說寫操作就已經完成,至於什么時候再寫到磁盤中由操作系統決定,除非顯示地調用了sync同步命令(詳情參考《【珍藏】linux 同步IO: sync、fsync與fdatasync》)。

       緩存I/O的優點:1)在一定程度上分離了內核空間和用戶空間,保護系統本身的運行安全;2)可以減少讀盤的次數,從而提高性能

       緩存I/O的缺點:在緩存 I/O 機制中,DMA 方式可以將數據直接從磁盤讀到頁緩存中,或者將數據從頁緩存直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數據傳輸,這樣,數據在傳輸過程中需要在應用程序地址空間(用戶空間)和緩存(內核空間)之間進行多次數據拷貝操作,這些數據拷貝操作所帶來的CPU以及內存開銷是非常大的。


2. 直接IO

       直接IO就是應用程序直接訪問磁盤數據,而不經過內核緩沖區,這樣做的目的是減少一次從內核緩沖區到用戶程序緩存的數據復制。比如說數據庫管理系統這類應用,它們更傾向於選擇它們自己的緩存機制,因為數據庫管理系統往往比操作系統更了解數據庫中存放的數據,數據庫管理系統可以提供一種更加有效的緩存機制來提高數據庫中數據的存取性能。

       直接IO的缺點:如果訪問的數據不在應用程序緩存中,那么每次數據都會直接從磁盤加載,這種直接加載會非常緩存。通常直接IO與異步IO結合使用,會得到比較好的性能。(異步IO:當訪問數據的線程發出請求之后,線程會接着去處理其他事,而不是阻塞等待)

下圖分析了寫場景下的DirectIO和BufferIO:


參考:

Linux 中直接 I/O 機制的介紹:http://www.ibm.com/developerworks/cn/linux/l-cn-directio/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM