我正在阅读 Mark Burgess 的“GNU C 编程教程”。我了解到以下信息:
Even though low-level fle routines do not use buffering, and once you call write, your data can be read from the file immediately, it may take up to a minute before your data is physically written to disk. (Page:142)
首先,“数据写入磁盘可能需要一分钟(某个时间)”是真的吗?
其次,当低级文件例程不使用缓冲时,为什么会发生延迟?
最佳答案
有两个地方可以发生 I/O 缓冲(至少——可能不止两个)。
一个在应用程序中;使用 FILE *
的标准 I/O 函数使用缓冲 I/O,除非您使用 setvbuf()
来阻止它。
另一个是在内核中。磁盘 I/O 通常进入内核缓冲池,并最终由内核写入磁盘。有一些方法可以解决这个问题(Linux 上的 O_DIRECT
;经典 Unix 上的原始设备;等等)。关键点是 write()
系统调用通常写入内核缓冲池。内核负责确保数据安全正确地写入磁盘(日志记录,...)。
内核不会立即将所有内容写入磁盘,因为 (a) 您可能会对数据添加更多更改,(b) 其他人可能需要读取或写入数据,(c) 磁盘驱动器可能正忙于写入在其 1 TiB 存储的另一端有其他东西,需要一些时间才能使写入头就位以获取数据,如果在写入更改之前安排其他工作,那么系统的整体性能会更好缓冲区到磁盘。它将被写入磁盘。只是没有定义时间,并且可能是几分之一秒、几秒或更长时间,尽管大多数情况下数据写入磁盘不需要几分钟。
如今,RAID Controller 中也可能存在缓冲,并且可能在 RAID 设置内的各个磁盘中存在缓冲,如果是远程安装的文件系统,也可能存在网络缓冲。这些增加了额外的缓冲级别。
read()
和 write()
以及相关的低级 I/O 函数没有任何客户端(应用程序)缓冲 — 与标准 C I 不同/O 函数。
关于c - 了解低级文件例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39125784/