【问题标题】:Does each Unix file description have its own read/write buffers?每个 Unix 文件描述都有自己的读/写缓冲区吗?
【发布时间】:2011-07-09 06:17:57
【问题描述】:

参考this question 关于 read() 和 write(),我想知道每个打开的文件描述是否都有自己的读写缓冲区,或者如果一个文件有一个单独的读写缓冲区一次打开了多次。我很好奇,因为这会对重叠写入同一文件的确切情况产生影响。也许这在 Unix 中有所不同?

(据我了解,“文件描述”是指有关打开文件的信息/选项,例如当前标记位置。相反,“文件描述符”仅指进程中用于引用的数字描述。)

【问题讨论】:

  • 我认为低级 Unix I/O 大多是无缓冲的。但如果作为流打开(fopen 等),则会为 FILE 结构创建一个缓冲区。
  • @seand 据我了解,除非使用 O_DIRECT 打开文件,否则默认情况下会缓冲读/写。基于流的 i/o 库实际上添加了第二层缓冲,这一次是在这个过程中。

标签: linux file unix


【解决方案1】:

这在一定程度上取决于您是在谈论套接字还是实际文件。

严格来说,描述符从来没有自己的缓冲区;它只是一个更深层次抽象的句柄

文件系统对象有它们“自己的”缓冲区,至少在需要时是这样。也就是说,如果程序写入小于文件系统块大小,内核别无选择,只能读取 FS 块并将写入与现有数据合并。

此缓冲区附加到 vnode 并处于较低级别,可能是 inode。它由文件拥有,而不是描述符。如果内存可用,它可能会保留很长时间。

在套接字的情况下,流,但不是一个单独的描述符,实际上确实有它拥有的缓冲区。

【讨论】:

  • 谢谢。正如其他人在另一个问题中所说的那样,这可能因操作系统而异,但通常底层文件系统的整个块都被单独缓冲,并且每个缓冲块在许多读取器/写入器可能正在访问文件的情况下共享。这听起来有点像它自己的小型分页系统,其中单个块缓冲区在写入时被标记为脏。很高兴了解套接字,尽管我主要对“常规”文件感到好奇。
【解决方案2】:

如果文件以阻塞模式打开,那么是的,应该只有一个缓冲区。出于性能原因,我敢打赌默认是非阻塞的。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多