O_DIRECT的最小写入大小

时间:2012-01-18 14:03:02

标签: c linux

我正在用C语言编写Linux 2.6.X内核的自定义数据库引擎,我需要知道使用O_DIRECT标志打开的文件的write()系统调用的最小写入大小是多少?在文档中它说,自Linux 2.6内核版本以来,你可以使用512字节块。但是,如果我的硬盘使用8K块怎么办?在这种情况下,它会在写入时返回EINVAL错误吗?我听说512字节扇区的磁盘已经过时,新磁盘使用8K扇区,所以我需要确保我的应用程序在用户在这样的磁盘上试用时不会崩溃。 如果可以在具有8k扇区的磁盘上使用512字节写入,当我写入时会发生什么,比如2块512字节,linux内核从磁盘读取8k扇区,替换我告诉它的1k块写入然后写回8k扇区的磁盘?这真的很慢!

此外,我还有另外一个问题,如果我在打开文件时使用原始设备或ext3文件系统,最小写入大小是否会有所不同?

2 个答案:

答案 0 :(得分:1)

不幸的是,没有通用的方法来了解O_DIRECT的约束。这个手册页似乎扼杀了任何希望:

http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html

另外,我很确定块大小可能会根据底层文件系统而改变

答案 1 :(得分:-1)

稍微OT,“我听说512字节扇区的磁盘已经过时,新磁盘使用8K扇区,” - 那里有任何8K扇区磁盘。我相信较新的磁盘使用4K扇区大小,也称为高级格式磁盘。 8K扇区磁盘正在考虑未来,但我怀疑是否有任何制造商已经推出它们

关于您的查询,我认为它是磁盘的扇区大小。因此,如果您有4K磁盘,则需要发出4K大小的读/写。在O_DIRECT的情况下,读/写直接传递到磁盘,磁盘可以读取/写入粒度==扇区大小(磁盘报告的逻辑块大小)