分类: LINUX
2008-12-10 11:23:34
Linux上的块设备的操作可以分为两类:
具体的I/O path如下
Application<->Library Buffer<->Operation System Cache<->File System/Volume Manager<->Device
library buffer是标准库提供的用户空间的buffer,可以通过setvbuf改变其大小。
I/O Path
Application<-> Operation System Cache <->File System/Volume Manager<->Device
此外,我们可以通过设置open的O_DIRECT标志来实现Direct I/O(或者叫Raw I/O),即绕过OS Cache,直接读取Device ( that's what we want^o^ ), 等于将OS cache换成自己管理的cache。不过,Linus在邮件列表中建议不这么做,而是使用posix_fadvice, madvice。中表明Direct I/O比buffered I/O的性能高很多。
在使用O_DIRECT的注意buffer的address必须是block alignment的(i.e. 初始地址必须是boundary), 可以用posix_memalign()函数分配内存以得到这样的buffer。至于为什么要这样,与实现的mmap有关,参见.
参考: