磁盤IO的幾種訪問方式如下:
緩存IO
緩存I/O又被稱作標准I/O,大多數文件系統的默認I/O操作都是緩存I/O。在Linux的緩存I/O機制中,數據先從磁盤復制到內核空間的緩沖區,然后從內核空間緩沖區復制到應用程序的地址空間。
讀操作:操作系統檢查內核的緩沖區有沒有需要的數據,如果已經緩存了,那么就直接從緩存中返回;否則從磁盤中讀取,然后緩存在操作系統的緩存中。
寫操作:將數據從用戶空間復制到內核空間的緩存中。這時對用戶程序來說寫操作就已經完成,至於什么時候再寫到磁盤中由操作系統決定,除非顯示地調用了sync同步命令。
緩存I/O的優點:1)在一定程度上分離了內核空間和用戶空間,保護系統本身的運行安全;2)可以減少讀盤的次數,從而提高性能。
緩存I/O的缺點:數據在傳輸過程中需要在應用程序地址空間和緩存之間進行多次數據拷貝操作,這些數據拷貝操作所帶來的CPU以及內存開銷是非常大的。
圖 1. 以標准的方式對文件進行讀寫
直接IO
直接IO就是應用程序直接訪問磁盤數據,而不經過內核緩沖區,這樣做的目的是減少一次從內核緩沖區到用戶程序緩存的數據復制。比如說數據庫管理系統這類應用,它們更傾向於選擇它們自己的緩存機制,因為數據庫管理系統往往比操作系統更了解數據庫中存放的數據,數據庫管理系統可以提供一種更加有效的緩存機制來提高數據庫中數據的存取性能。
直接IO的缺點:如果訪問的數據不在應用程序緩存中,那么每次數據都會直接從磁盤加載,這種直接加載會非常緩存。通常直接IO與異步IO結合使用,會得到比較好的性能。(異步IO:當訪問數據的線程發出請求之后,線程會接着去處理其他事,而不是阻塞等待)
圖2. 數據傳輸不經過操作系統內核緩沖區
內存映射
內存映射是指將硬盤上文件的位置與進程邏輯地址空間中一塊大小相同的區域一一對應,當要訪問內存中一段數據時,轉換為訪問文件的某一段數據。這種方式的目的同樣是減少數據在用戶空間和內核空間之間的拷貝操作。當大量數據需要傳輸的時候,采用內存映射方式去訪問文件會獲得比較好的效率。
使用內存映射文件處理存儲於磁盤上的文件時,將不必再對文件執行I/O操作,這意味着在對文件進行處理時將不必再為文件申請並分配緩存,所有的文件緩存操作均由系統直接管理,由於取消了將文件數據加載到內存、數據從內存到文件的回寫以及釋放內存塊等步驟,使得內存映射文件在處理大數據量的文件時能起到相當重要的作用。
圖 3. 內存映射方式訪問