我有一个linux应用程序,可以将数据流式传输到直接连接的SAS存储阵列上的文件。它填充大缓冲区,将它们写入O_DIRECT模式,然后循环缓冲区(即再次填充它们等)。我不需要使用O_SYNC来保证数据完整性,因为我可以忍受崩溃,延迟写入等数据丢失。我主要对高吞吐量感兴趣,而且我似乎在没有O_SYNC的情况下获得更好的性能。但是,我想知道它是否安全:如果使用O_DIRECT而不是O_SYNC,则write()系统调用何时返回?
如果write()在DMA到存储阵列的缓存完成后返回,那么我的应用程序可以安全地再次填充缓冲区。数组本身处于回写模式:它最终会写入磁盘,这是我可以接受的。
如果写入在DMA启动后立即返回(但尚未完成),则我的应用程序不安全,因为它会在DMA仍在进行时覆盖缓冲区。显然我不想写损坏的数据;但在这种情况下,我也无法知道缓冲区的DMA何时完成且重新填充是安全的。
(实际上有几个并行线程,每个都有一个缓冲池,尽管这对上面的问题可能并不重要。)
答案 0 :(得分:2)
当写入调用返回时,您可以重用缓冲区而不会有任何危险。您不知道写入已写入磁盘,但您表示这不是您的问题。
一个支持性参考文献位于http://www.makelinux.net/ldd3/chp-15-sect-3,其中指出:
例如,使用直接I / O需要写入系统调用 同步操作;否则应用程序不知道它何时 可以重用其I / O缓冲区。