c - 了解低级文件例程

标签 c file operating-system gnu

我正在阅读 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/

相关文章:

c++ - pthread_join中的 "status"到底代表什么以及如何查询

c - OpenCV 和 C,cvPreprocessCategoricalResponses 中的错误参数(响应 #0 不是整数)

c - 为什么 fflush() 会影响 fork 进程的输出?

Git 无法忽略在全局忽略中定义的 .DS_Store

java - java多线程在不同操作系统上有不同吗?

c - 如何在C中打印方阵的所有方子矩阵?

c - 如何避免按 Enter 和 getchar() 只读取单个字符?

android - 如何从文件选择的 Intent 中获取非空数据?

python - 在 Python 中读取多行文件

javascript - 使用 Javascript 在不将所有内容加载到内存的情况下从大型 CSV 文件读取的最佳方法