gpt4 book ai didi

c - 使用 mmap 写入文件的原子性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:35:36 24 4
gpt4 key购买 nike

修改文件内容的一种方法是使用标志 MAP_SHARED 运行 mmap,然后写入返回的内存区域。例如:

struct data *data;
const int size = sizeof(struct data);
int fd = open("data_file", O_RDWR);
ftruncate(fd, size);
data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/* Access to 'data' members */

假设我使用了一个日志文件系统(ext4 with data=ordered or data=journal)。我应该采取什么预防措施才能在断电后从 data_file 恢复数据?

IMO,Linux 保证写操作是有序的,但它不保证任何原子性。因此,应用程序必须实现一种日志以恢复data_file(正如大多数数据库所做的那样)。你确认吗?

最佳答案

What precautions I should take in order to allow to recover data from data_file after a power outage?

由于无法保证对 mmap() 内存更新的真正原子性,因此您需要做两件事:

  1. 使用互斥锁或其他同步机制来保护您的数据尽可能保持一致
  2. 使用msync()在任何更新后强制将数据写入磁盘。

请注意 since you can't prevent mmap() data from being written to disk without an msync() ,这很容易受到磁盘上数据的非原子更新的影响,但如果您的更新从不跨越页面边界,则可以将这种风险降至最低。您必须在更新对象的过程中出现故障,并且您必须让操作系统在事务处理过程中将该页面写入磁盘。

如果您将互斥锁或其他同步对象放置在 mmap() 数据本身中,我怀疑获取互斥锁的行为会导致 mmap() 的内存会延迟任何数据写入。将互斥量放在数据本身中可能会使恢复复杂化,但只要您可以确保恢复是单线程的,如果不能完全忽略它,那么解决它应该不是什么大问题。

解决此恢复问题的更好方法是不使用 mmap() 并以保证全有或全无更新的方式显式写入数据,但我怀疑这会产生重大影响对您的设计的其他影响。

关于c - 使用 mmap 写入文件的原子性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49514396/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com