假设我们有一个FILE_SIZE
字节的文件,并且:
FILE_SIZE <= min(page_size, physical_block_size)
; truncate()
或附加write()
); 文件仅通过使用以下方式完全覆盖其内容进行修改:
pwrite(fd, buf, FILE_SIZE, 0);
ext4
是否保证:
这种写入是关于系统崩溃的事务性的吗?
(即,在崩溃后,文件的内容完全来自之前的一些写入,我们永远不会看到部分写入或空文件)
第二个是真的吗?
data=ordered
?data=journal
或者为单个文件启用了日记功能?
(使用ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL)
)
何时physical_block_size < FILE_SIZE <= page_size
?
我发现related question与2011年的discussion相关联。但是:
2
的明确答案。答案 0 :(得分:4)
从我的实验来看,这不是原子的。
基本上我的实验是有两个过程,一个作家和一个读者。编写器在循环中写入文件,读取器从文件中读取
作家流程:
char buf[][18] = {
"xxxxxxxxxxxxxxxx",
"yyyyyyyyyyyyyyyy"
};
i = 0;
while (1) {
pwrite(fd, buf[i], 18, 0);
i = (i + 1) % 2;
}
读者流程
while(1) {
pread(fd, readbuf, 18, 0);
//check if readbuf is either buf[0] or buf[1]
}
运行这两个流程一段时间后,我可以看到readbuf
是xxxxxxxxxxxxxxxxyy
或yyyyyyyyyyyyyyyyxx
。
因此它明确表明写入不是原子的。在我的情况下,16byte写入总是原子的。
答案是:除了管道之外,POSIX不会要求写入/读取的原子性。我看到的16字节原子性是内核特定的,将来可能会改变。
实际帖子中的答案详情: write(2)/read(2) atomicity between processes in linux
答案 1 :(得分:2)
我对文件系统的理论很熟悉,而不是Ext4的实现。以此作为有根据的猜测。
是的,我相信一个扇区的读写将是原子的,因为
不确定是否有一个页面,但在完整日记模式下,在提交之前将少于一页的内容发送到日志中是没有意义的。