【发布时间】:2011-12-18 02:15:44
【问题描述】:
我有一个关于磁盘文件的内核 I/O 缓存的问题。 据我所知,当调用 write() 或 read() 时,内核空间中有一个缓冲区缓存用于磁盘文件 I/O 操作。 我的问题是,这种 I/O 缓冲是只适用于磁盘文件,还是也适用于终端、FIFO、管道和套接字?
谢谢
【问题讨论】:
标签: linux linux-kernel
我有一个关于磁盘文件的内核 I/O 缓存的问题。 据我所知,当调用 write() 或 read() 时,内核空间中有一个缓冲区缓存用于磁盘文件 I/O 操作。 我的问题是,这种 I/O 缓冲是只适用于磁盘文件,还是也适用于终端、FIFO、管道和套接字?
谢谢
【问题讨论】:
标签: linux linux-kernel
它被称为“页面缓存”。它由文件支持的页面和交换支持的“匿名页面”组成。这都是 Linux 虚拟内存 (VM) 子系统的一部分。
它不用于 TTY、FIFO、管道或套接字。它们中的每一个都根据其性质提供自己的缓冲。例如,您写入管道的数据必须驻留在某处,然后才能再次读回。但这种缓冲与 VM 子系统无关。
[更新]
请注意,此缓冲完全独立于(例如)fwrite() 提供的用户空间缓冲。 (我看你之前问过类似的问题,不清楚你是否理解其中的区别。)
【讨论】:
read在数据不可用的情况下可以一直阻塞;这包括读取内容尚未在页面缓存中的文件。如果脏页太多(由vm.dirty_ratio 确定),write 到文件可能 阻塞。除非管道缓冲区已满,否则写入管道不会阻塞。同样,除非套接字缓冲区已满,否则写入套接字不会阻塞。也许你应该问一个问题,说明你真正想要做什么?