【问题标题】:I/O buffer cache for disk file in Linux kernelLinux内核中磁盘文件的I/O缓冲区缓存
【发布时间】:2011-12-18 02:15:44
【问题描述】:

我有一个关于磁盘文件的内核 I/O 缓存的问题。 据我所知,当调用 write() 或 read() 时,内核空间中有一个缓冲区缓存用于磁盘文件 I/O 操作。 我的问题是,这种 I/O 缓冲是只适用于磁盘文件,还是也适用于终端、FIFO、管道和套接字?

谢谢

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    它被称为“页面缓存”。它由文件支持的页面和交换支持的“匿名页面”组成。这都是 Linux 虚拟内存 (VM) 子系统的一部分。

    它不用于 TTY、FIFO、管道或套接字。它们中的每一个都根据其性质提供自己的缓冲。例如,您写入管道的数据必须驻留在某处,然后才能再次读回。但这种缓冲与 VM 子系统无关。

    [更新]

    请注意,此缓冲完全独立于(例如)fwrite() 提供的用户空间缓冲。 (我看你之前问过类似的问题,不清楚你是否理解其中的区别。)

    【讨论】:

    • 谢谢你的回答,尼莫。据我了解,由于此页面缓存,“通常”读取()/写入()到磁盘文件不会阻塞。那么是不是因为不同的缓冲机制导致对管道、fifo、socket、tty的读/写可能阻塞?
    • 是的,我知道它们的区别~~
    • read在数据不可用的情况下可以一直阻塞;这包括读取内容尚未在页面缓存中的文件。如果脏页太多(由vm.dirty_ratio 确定),write 到文件可能 阻塞。除非管道缓冲区已满,否则写入管道不会阻塞。同样,除非套接字缓冲区已满,否则写入套接字不会阻塞。也许你应该问一个问题,说明你真正想要做什么?
    • 我不清楚这些阻塞读/写何时以及如何发生在各种文件中。谢谢,尼莫,我会问另一个问题。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-08-05
    • 2012-06-26
    • 2014-09-20
    相关资源
    最近更新 更多