繁体   English   中英

在ext4上覆盖一个小文件原子?

[英]Is overwriting a small file atomic on ext4?

假设我们有一个FILE_SIZE字节的文件,并且:

  • FILE_SIZE <= min(page_size, physical_block_size) ;
  • 文件大小永远不会改变(即从不执行truncate()或append write() );
  • 仅通过使用以下方式完全覆盖其内容来修改文件:

    \n pwrite(fd,buf,FILE_SIZE,0);\n

ext4上保证:

  1. 这种写入对于并发读取是原子的吗?
  2. 这样的写操作是关于系统崩溃的事务性的吗?

    (即,崩溃后文件的内容完全来自某些先前的写入,我们永远不会看到部分写入或空文件)

第二个是真的:

  • data=ordered
  • 使用data=journal或者为单个文件启用data=journal功能?

    (使用ioctl(fd, EXT4_IOC_SETFLAGS, EXT4_JOURNAL_DATA_FL)

  • physical_block_size < FILE_SIZE <= page_size


我发现相关问题链接了2011年的讨论 。但是:

  • 我的问题2没有找到明确的答案。
  • 我想知道,如果上述情况属实,是否记录在某处?

从我的实验来看,这不是原子的。

基本上我的实验是有两个过程,一个作家和一个读者。 编写器在循环中写入文件,读取器从文件中读取

作家流程:

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]
}

运行两个进程一段时间后,我可以看到readbufxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyxx

所以它明确地表明写入不是原子的。 在我的情况下,16byte写入总是原子的。

答案是:除了管道之外,POSIX不要求写入/读取的原子性。 我看到的16字节原子性是内核特定的,将来可能会改变。

实际帖子中的答案细节: 写入(2)/读取(2)linux中进程之间的原子性

我对文件系统的理论很熟悉,而不是Ext4的实现。 以此作为有根据的猜测。

是的,我相信一个扇区的读写将是原子的,因为

  • 您提供的链接引号“当前并发读/写只是单个页面的原子,但不在系统调用上。”
  • 根据Stephen Tweedie的说法,磁盘扇区(512字节)写入是原子的。 在与他的私人电子邮件对话中 ,他承认这种保证与硬件一样好。
  • Ext文件系统就地覆盖数据,写入时没有副本。 没有分配。
  • 一些努力来实现内联数据,非常小的文件数据可以适合inode本身。 如果您只需要存储几个字节,那可能会产生影响。

不确定一个页面,但在完整的日记模式下,在提交之前将少于一页的内容发送到日志是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM