我有一个关于内核I/O缓存的问题,与磁盘文件相关。据我所知,当调用write()或read()时,内核空间中会有一个缓存区用于磁盘文件的I/O操作。我的问题是,这种I/O缓冲只适用于磁盘文件,还是也适用于终端、FIFO、管道和套接字?谢谢。
它被称为“页面缓存”,由文件支持的页面和由交换支持的“匿名页面”组成。这都是Linux虚拟内存(VM)子系统的一部分。 它不用于TTY、FIFO、管道或套接字。每个缓冲区都有自己的缓冲方式;例如,您写入管道的数据必须在再次读取之前驻留在某个地方。但是该缓冲与VM子系统无关。 [更新] 请注意,此缓冲与(例如)fwrite()提供的用户空间缓冲完全独立。(我看到您之前问过类似的问题,不清楚您是否理解区别。)
read
操作总是会阻塞;这包括读取尚未在页面缓存中的文件内容。如果有太多脏页(由vm.dirty_ratio
决定),则向文件进行write
操作可能会阻塞。除非管道缓冲区已满,否则写入管道不会阻塞。同样地,除非套接字缓冲区已满,否则写入套接字不会阻塞。也许你应该问一个更明确你实际想要做什么的问题? - Nemo