了解低级文件例程

时间:2016-08-24 14:13:57

标签: c file operating-system gnu

我正在阅读Mark Burgess的“The GNU C Programming Tutorial”。我遇到了以下信息:

  

即使低级别例程不使用缓存,一旦您调用write,您的数据可以立即从文件中读取,可能需要一分钟才能将数据物理写入磁盘。 (页:142)

首先,“在将数据写入磁盘之前可能需要一分钟(一段时间)”这是真的吗?

其次,当低级文件例程没有使用缓冲时,为什么会发生延迟?

3 个答案:

答案 0 :(得分:1)

有两个地方可以进行I / O缓冲(至少可能只有两个)。

一个在申请中;使用setvbuf()的标准I / O函数使用缓冲I / O,除非您使用O_DIRECT来阻止它。

另一个在内核中。磁盘I / O通常进入内核缓冲池,最终由内核写入磁盘。有很多方法(Linux上的write();经典Unix上的原始设备;等等)。关键是read()系统调用通常写入内核缓冲池。内核负责确保数据安全正确地写入磁盘(日志,...)。

内核不会立即将所有内容写入磁盘,因为(a)您可能会对数据添加更多更改,(b)其他人可能需要读取或写入数据,(c)磁盘驱动器可能正忙于写入在其1 TiB存储的另一端还有其它东西需要时间才能使写入头就位以获取数据,如果在编写更改之前安排其他工作,则系统的整体性能会更好缓冲到磁盘。它将被写入磁盘。它只是未定义的时间,它可能是一秒或几秒或更长的时间,但大多数情况下,数据写入磁盘的时间通常不会很长。

现在,RAID控制器中也可能存在缓冲,也可能是RAID设置中的单个磁盘,如果它是远程安装的文件系统,也可能存在网络缓冲。那些增加了额外的缓冲水平。

与标准C I / O函数不同,write()和{{1}}及相关的低级I / O函数没有任何客户端(应用程序)缓冲。

答案 1 :(得分:0)

当文件的内容未直接输出或输入时,该文件被称为缓冲。相反,文件的字节被写入内存中的临时缓冲区。

例如,如果您正在读取文件,则表示您正在从缓冲区中读取数据。一旦读取了缓冲区中的所有字符,就会从文件中补充新的字节。这种间接性的原因是内存读取比硬盘读取快得多。

调用readwrite是低级别的,并且不执行缓冲。 stdio.hgetc之类的putc调用会使用缓冲。当必须补充缓冲区时,这些更高级别的API只调用低级API。

答案 2 :(得分:0)

写入硬盘驱动器比写入RAM要慢得多。当您写入驱动器时,它会写入内存,但不会立即写入磁盘。在需要覆盖该部分内存以为其他内容腾出空间之前,可能无法将数据写入磁盘。这称为回写缓存。