2011-10-30 115 views
4

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

谢谢

回答

6

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

它不用于TTY,FIFO,管道或套接字。每个人都会根据自己的性质提供自己的缓冲;例如,写入管道的数据在再次读回之前必须驻留在某处。但是这种缓冲与虚拟机子系统无关。

[更新]

注意,该缓冲是完全独立于由(例如)提供fwrite()用户空间的缓冲。 (我之前看到你问过类似的问题,目前还不清楚你是否理解这个区别。)

+0

感谢你的回答,Nemo。 据我所知,由于这个页面缓存,“正常”read()/ write()到磁盘文件不会被阻塞。 那么是因为不同的缓冲机制,使读/写管道,FIFO,套接字,TTY可能会阻止? – kai

+0

是的,我知道它们的区别~~ – kai

+0

如果数据不可用,'read'总是可以被阻塞;包括读取其内容尚未存在于页面缓存中的文件。如果有太多脏页面(由'vm.dirty_ratio'确定),则将'write'写入文件_may_块。写入管道不会阻塞,除非管道缓冲区已满。同样,写入套接字不会阻塞,除非套接字缓冲区已满。也许你应该问一个问题,说明你实际上想要做什么? – Nemo