Linux内核中磁盘文件的I/O缓存

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

7
它被称为“页面缓存”,由文件支持的页面和由交换支持的“匿名页面”组成。这都是Linux虚拟内存(VM)子系统的一部分。 它不用于TTY、FIFO、管道或套接字。每个缓冲区都有自己的缓冲方式;例如,您写入管道的数据必须在再次读取之前驻留在某个地方。但是该缓冲与VM子系统无关。 [更新] 请注意,此缓冲与(例如)fwrite()提供的用户空间缓冲完全独立。(我看到您之前问过类似的问题,不清楚您是否理解区别。)

谢谢你的回答,Nemo。 我理解,“通常情况下”使用read()/write()向磁盘文件读写数据不会阻塞,因为有页面缓存的存在。 那么是因为不同的缓冲机制导致了对管道、FIFO、套接字、终端设备进行读写时可能会出现阻塞的情况吗? - kai
是的,我知道它们之间的区别~~ - kai
如果数据不可用,read 操作总是会阻塞;这包括读取尚未在页面缓存中的文件内容。如果有太多脏页(由 vm.dirty_ratio 决定),则向文件进行 write 操作可能会阻塞。除非管道缓冲区已满,否则写入管道不会阻塞。同样地,除非套接字缓冲区已满,否则写入套接字不会阻塞。也许你应该问一个更明确你实际想要做什么的问题? - Nemo
我不清楚各种类型文件的阻塞读写是在什么时候和如何发生的。 谢谢,Nemo,我会为此提出另一个问题。 - kai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接