緩存IO和直接IO


緩存IO和直接IO

緩存IO:數據從磁盤先通過DMA copy到內核空間,再從內核空間通過cpu copy到用戶空間

直接IO:數據從磁盤通過DMA copy到用戶空間

緩存IO

緩存IO又被稱為標准IO,大多數文件系統的默認IO操作都是緩存IO

​ 在Linux的緩存IO機制中嗎,數據先從磁盤復制到內核空間的緩沖區,然后從內核空間緩沖區復制到應用程序的地址空間。

  • 讀操作
    • 操作系統檢查內核的緩沖區有沒有需要的數據,如果已經緩存了,那么就直接從緩存中返回。否則從磁盤中讀取,然后緩存在操作系統的緩存中。
  • 寫操作
    • 將數據從用戶空間復制到內核空間的緩存中。這時對用戶程序來說寫操作就已經完成,至於什么時候再寫到磁盤中由操作系統決定。除非顯示的調用的了sync同步命名
  • 緩存IO的優點
    • 在一定程度上分離了內核空間和用戶空間,保護系統本身的運行安全
    • 可以減少讀盤的次數,從而提高性能
  • 緩存IO的缺點
    • 在緩存IO機制中,DMA方式可以將數據直接從磁盤讀到頁緩存中,或者將數據從頁緩存直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數據傳輸,這樣,數據在傳輸過程中需要在應用程序地址空間(用戶空間)和緩存(內核空間)直接進行多次數據拷貝操作,這個數據拷貝操作所帶來的CPU已經內存開銷是非常大的

直接IO

直接IO就是應用程序直接訪問磁盤數據,而不經過內核緩沖區,也就是繞過內核緩沖區,自己管理IO緩存區,這樣做的目的是減少一次內核緩沖區到用戶程序緩存的數據復制

​ 引入內核緩沖區的目的在於提高磁盤文件的訪問性能,因為當進程需要讀取磁盤文件時,如果文件內容已經在內核緩沖區中,那么就不需要再次訪問磁盤。而當進程需要向文件寫入數據是,實際上只是寫到了內核緩沖區便告訴進程已經寫成功,而真正寫入磁盤是通過一定的策略進行延時的。

​ 然而,對於一些較復雜的應用,比如數據庫服務器,他們為了充分提高性能。希望繞過內核緩沖區,由自己在用戶態空間時間並管理IO緩沖區,包括緩存機制和寫延遲機制等,以支持獨特的查詢機制,比如數據庫可以根據加合理的策略來提高查詢緩存命中率。另一方面,繞過內核緩沖區也可以減少系統內存的開銷,因為內核緩沖區本身就在使用系統內存。

​ 直接IO的缺點就是如果直接訪問的數據不再應用緩存中,那么每次數據都會直接從磁盤進行加載,這種直接加載會非常緩慢,通常直接IO跟異步IO結合使用會得到較好的性能

Linux提供了對這種需求的支持,即在open()系統調用中增加參數選項O_DIRECT,用它打開的文件便可以繞過內核緩沖區的直接訪問,這樣有效避免了CPU和內存的多余時間的開銷。

順便提一下,與O_DIRECT類似的一個選項是O_SYNC,后者只對寫數據有效,它將寫入內核緩沖區的數據立即寫入磁盤,將機器故障時數據的丟失減少到最小,但是它仍然要經過內核緩沖區。


免責聲明!

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



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