Linux
在 Linux 中沒有顯式同步的情況下,對文件的單獨阻塞 IO 訪問在執行時是否一致
我試圖弄清楚在並發功率損失不是真正問題的情況下,真正需要執行同步或 fsync 操作的頻率。我正在尋找 Linux 核心或 Posix 或 glibc API 可能在執行時提供的任何保證,而不是特定文件系統提供的功能。
如果函式 a() 打開一個文件,向其中寫入數據,然後關閉該文件,所有這些都使用預設阻塞 IO,是否保證該文件具有該數據以供以後呼叫打開它而無需顯式同步到磁碟?磁碟記憶體或 VFS 層是否保證如果稍後呼叫函式 b() 以打開該文件名進行讀取,則與在打開之前呼叫 fsync() 的 sync() 時相同的數據將可見?或者是否應該始終為將由不同程式碼塊讀取的數據呼叫同步?
POSIX 保證
read
在 a 之後發生的每一個write
都保證看到新數據。從標準:如果
read()
可以(通過任何方式)證明 a of 文件數據發生在 awrite()
of 數據之後,則它必須反映這一點write()
,即使呼叫是由不同的程序進行的。類似的要求適用於對同一文件位置的多個寫入操作。
fsync
不需要打電話。Linux 和 Unix 上的很多很多程序都需要這樣做以確保正確性和一致性,因此未能正確實現它將是一個嚴重的缺陷。