`O_DIRECT | 有什么区别? O_SYNC` + write() 和 `O_DIRECT` + write() + fsync()
What is the difference between `O_DIRECT | O_SYNC` + write() and `O_DIRECT` + write() + fsync()
我想知道两者的区别
char *text = (char *)malloc(4096);
memset(text, 'a', 4096);
int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT);
for(int i=0; i<1000; i++) {
write(fd, (void *)text, 4096);
fsync(fd);
}
close (fd);
和
char *text = (char *)malloc(4096);
memset(text, 'a', 4096);
int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT | O_SYNC); //<----Difference
for(int i=0; i<1000; i++) {
write(fd, (void *)text, 4096);
// fsync(fd); <--------------------------------------------------Difference
}
close (fd);
上面代码的性能比下面代码慢很多。
一方面,应该没有任何区别,因为在两种情况下都必须进行类似数量的工作(假设没有欺骗,写入然后磁盘刷新)。另一方面,第一种情况必须执行两倍的系统调用,因此(理论上)有更多的开销(特别是如果进行系统调用所花费的时间是执行操作所花费的总时间的重要部分)。很可能这取决于 disk/kernel/CPU/size 或 I/O 等,以确定两者之间是否存在差异以及哪个更快。也许在第二种情况下,内核可以发送设置了 FUA 位的写下来,这意味着差异可能取决于您打开的 file/device(因为这可以控制是否可以进行此类优化)。 .
使用 O_SYNC
也会使 write()
调用的 return 出现错误,但如其他评论所述,您没有检查 return 代码。 .
我想知道两者的区别
char *text = (char *)malloc(4096);
memset(text, 'a', 4096);
int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT);
for(int i=0; i<1000; i++) {
write(fd, (void *)text, 4096);
fsync(fd);
}
close (fd);
和
char *text = (char *)malloc(4096);
memset(text, 'a', 4096);
int fd = open(filepath, O_RDWR | O_CREAT | O_DIRECT | O_SYNC); //<----Difference
for(int i=0; i<1000; i++) {
write(fd, (void *)text, 4096);
// fsync(fd); <--------------------------------------------------Difference
}
close (fd);
上面代码的性能比下面代码慢很多。
一方面,应该没有任何区别,因为在两种情况下都必须进行类似数量的工作(假设没有欺骗,写入然后磁盘刷新)。另一方面,第一种情况必须执行两倍的系统调用,因此(理论上)有更多的开销(特别是如果进行系统调用所花费的时间是执行操作所花费的总时间的重要部分)。很可能这取决于 disk/kernel/CPU/size 或 I/O 等,以确定两者之间是否存在差异以及哪个更快。也许在第二种情况下,内核可以发送设置了 FUA 位的写下来,这意味着差异可能取决于您打开的 file/device(因为这可以控制是否可以进行此类优化)。 .
使用 O_SYNC
也会使 write()
调用的 return 出现错误,但如其他评论所述,您没有检查 return 代码。 .