写系统调用直接将数据写入磁盘?

Posted

技术标签:

【中文标题】写系统调用直接将数据写入磁盘?【英文标题】:Write system call writes data to disk directly? 【发布时间】:2012-01-15 01:27:12 【问题描述】:

我已经阅读了几个与此相关的问题 (here),但我仍然有些困惑。

我的理解是 write 系统调用将数据放入Buffered Cache(该问题中提到的操作系统缓存)。当Buffered Cache 已满时,它会被写入磁盘。

Buffered IO 在此基础上进一步优化。它缓存在C RTL buffers 中,当它们满时发出write 系统调用以将内容移动到Buffered Cache。如果我使用fflush,则与存在于C RTL buffersBuffered Cache 中的特定文件相关的数据将发送到磁盘。

我的理解正确吗?

【问题讨论】:

取决于操作系统、文件打开模式、系统特定的每个文件句柄设置... 【参考方案1】:

如何刷新 stdio 缓冲区取决于您使用的标准 C 库。引用Linux manual page:

请注意,fflush() 仅刷新 C 库提供的用户空间缓冲区。 为了确保数据物理存储在磁盘上,内核缓冲区必须是 也刷新了,例如,使用 sync(2) 或 fsync(2)。

这意味着在 Linux 系统上,使用fflush 或溢出缓冲区将调用write 函数。但是操作系统可能会保留内部缓冲区,而不是实际将数据写入设备。为确保数据真正写入设备,请同时使用fflush 和低级fsync

编辑:改写答案。

【讨论】:

@JP:我将它们混合在一起,因为 printf 最终会导致 write 系统调用 @Lamia:我改写了我的答案。

以上是关于写系统调用直接将数据写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章

fsync和fdatasync

内存映射

带缓冲I/O 和不带缓冲I/O的区别与联系

磁盘IO工作机制

后台开发之IO缓冲区管理

Linux磁盘I/O子系统