轉自:https://blog.csdn.net/notbaron/article/details/77823158
轉自:
Linux IO中BIO和DIO
Linux IO中BIO和DIO
塊存儲是使用塊設備為系統提供存儲服務。塊設備將信息存儲在固定大小的塊中,每個塊都有自己的地址。
通常情況下,是通過文件系統來訪問塊設備,也可以直接使用裸設備,通過指定偏移和大小來讀寫裸設備。常見的塊存儲設備就是物理磁盤,在Linux系統下,還提供基於其他塊設備之上的邏輯設備,如Device Mapper,軟RAID等。
-
IO棧
Linux 4.10.0的IO棧如下圖:

原圖鏈接:
https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#Diagram_for_Linux_Kernel_3.17 -
緩存 I/O (Buffered I/O)
緩存I/O又被稱作標准I/O,大多數文件系統的默認 I/O 操作都是緩存 I/O。在 Linux 的緩存 I/O 機制中,操作系統會將 I/O 的數據緩存在文件系統的頁緩存( page cache )中,數據會先被拷貝到操作系統內核的緩沖區中,然后才會從操作系統內核的緩沖區拷貝到應用程序的地址空間。有以下優點:
緩存 I/O 使用了操作系統內核緩沖區,在一定程度上分離了應用程序空間和實際的物理設備。
緩存 I/O 可以減少讀盤的次數,從而提高性能。
在緩存 I/O 機制中,DMA 方式可以將數據直接從磁盤讀到頁緩存中,或者將數據從頁緩存直接寫回到磁盤上,而不能直接在應用程序地址空間和磁盤之間進行數據傳輸,數據在傳輸過程中需要在應用程序地址空間和頁緩存之間進行多次數據拷貝操作,帶來的 CPU 以及內存開銷是非常大的。
對於某些特殊的應用程序來說,避開操作系統內核緩沖區而直接在應用程序地址空間和磁盤之間傳輸數據會比使用操作系統內核緩沖區獲取更好的性能 -
直接I/O技術(Direct I/O)
對於某些應用程序來說,它會有它自己的數據緩存機制,比如,它會將數據緩存在應用程序地址空間,這類應用程序完全不需要使用操作系統內核中的高速緩沖存儲器,這類應用程序就被稱作是自緩存應用程序( self-caching applications )。數據庫管理系統是這類應用程序的一個代表。
自緩存應用程序來說,緩存 I/O 明顯不是一個好選擇。可以使用直接 I/O(DIO) 技術。直接 I/O 技術非常適用於自緩存這類應用程序,該技術省略掉緩存 I/O 技術中操作系統內核緩沖區的使用,數據直接在應用程序地址空間和磁盤之間進行傳輸,從而使得自緩存應用程序可以省略掉復雜的系統級別的緩存結構,而執行程序自己定義的數據讀寫管理,從而降低系統級別的管理對應用程序訪問數據的影響。 -
參考
linux塊設備IO棧淺析
http://www.sysnote.org/2015/08/06/linux-io-stack/
Linux 中直接 I/O 機制的介紹
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/
Thomas-krenn—Linux I/O Stack
https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram#Diagram_for_Linux_Kernel_3.17
一個IO的傳奇一生
http://alanwu.blog.51cto.com/3652632/1398744
