【发布时间】:2020-07-30 18:16:22
【问题描述】:
我正在尝试解析一些适用于 O_DIRECT 文件的代码。
ssize_t written = write(fd, buf, size);
令人困惑的是大小可以小于磁盘的扇区大小,因此write(fd,buf,size) 是否将整个buf 写入fd 或仅将size 的第一个字节buf 写入磁盘?
没有 O_DIRECT 这只是第二种情况,但我找不到关于 O_DIRECT 情况的任何文档,从我读过的内容来看,它仍然会将buf 发送到磁盘,所以我唯一的事情能想到的是它还告诉磁盘只写size...
【问题讨论】:
-
"写整个
buf" -->buf有多大,一个扇区大小? -
@stark 理想情况下,但 IME Linux 文件系统不能可靠地处理对使用
O_DIRECT打开的文件的大小不正确(或非页面对齐)的 I/O 请求,几乎没有关于什么是“尺寸不合适”的文档。请参阅the NOTES section of the Linuxopen(2)man page 中的O_DIRECT段落。 -
@AndrewHenle 我删除了我的评论。很确定我看到的 RMW 在应用程序中。未对齐的写入将始终返回 EINVAL。
-
@stark IME 未对齐缓冲区也会导致 EINVAL,但
open(2)手册页确实说“可能完全不存在大小和对齐限制”。今天最常见的硬件应该能够处理具有任何大小的未对齐缓冲区的直接 IO,但我对低端硬件上的未对齐直接 IO 持怀疑态度,尤其是磁盘控制器/HBA。 Even expensive high-end hardware can have bugs in such situations.。鉴于那里糟糕的磁盘控制器...... -
读取或写入未对齐的磁盘将永远无法正常工作。最小的可寻址单元是扇区。问题是关于文件访问的 O_DIRECT,其实现取决于文件系统代码。请注意,文件不必在磁盘上进行扇区对齐,尽管它们经常如此,因此文件系统可能已经有用于缓冲和修复对齐的代码。