Direct I/O概念:
Direct I/O is a way to avoid entire caching layer in the kernel and send the I/O directly to the disk.
想要使用direct io的模式,可以這樣做:
Opens files with O_DIRECT flag.
Synchronous I/O概念:
Synchronous I/O is any I/O (system I/O with or without O_DIRECT, or stream I/O) performed to a file descriptor that was opened using the O_SYNC or O_DSYNC flags.
幾個Flag的區別:
O_DIRECT | I/O operations performed against files opened with O_DIRECT bypass the kernel's page cache, writing directly to the storage. |
O_SYNC | File data and all file metadata are written synchronously to disk. |
O_DSYNC | Only file data and metadata needed to access the file data are written synchronously to disk. Metadata that is not required for retrieving the data of the file may not be written immediately. |
2019年5月6日更新:
===============
上面的解釋非常不清楚,我找到了這篇名為“UNIX高級環境編程(14)文件IO - O_DIRECT和O_SYNC詳解 < 海棠花溪 >”的文章。看了之后,才終於懂了這兩個flag的區別。
O_DIRECT:用於讓IO從用戶態直接跨過“stdio緩沖區的高速緩存”和“內核緩沖區的高速緩存”,直接寫到存儲上。
O_SYNC:用於控制“內核緩沖區的高速緩存”直接寫到存儲上,即強制刷新內核緩沖區到輸出文件的存儲。
I/O緩沖的過程是這樣的:
用戶數據 –> stdio緩沖區 –> 內核緩沖區高速緩存 –> 磁盤
可見,上面的兩個flag的區別是O_DIRECT讓IO從用戶數據中直接到磁盤(跨過了兩個緩沖區),而O_SYNC讓IO從內核緩沖區直接到磁盤(僅跨過了內核緩沖區)。
參考資料
===============
What is direct I/O anyway?
http://www.alexonlinux.com/what-is-direct-io-anyway
Ensuring data reaches disk
https://lwn.net/Articles/457667/
UNIX高級環境編程(14)文件IO - O_DIRECT和O_SYNC詳解 < 海棠花溪 >