gpt4 book ai didi

atomic - 内存映射文件和单个 block 的原子写入

转载 作者:行者123 更新时间:2023-12-02 05:33:10 27 4
gpt4 key购买 nike

如果我使用普通 IO API 读取和写入单个文件,则保证每个 block 的写入都是原子的。也就是说,如果我的写入仅修改单个 block ,则操作系统保证要么写入整个 block ,要么什么也不写入。

如何在内存映射文件上实现相同的效果?

内存映射文件只是字节数组,因此如果我修改字节数组,操作系统无法知道我何时考虑写入“完成”,因此它可能(即使不太可能)交换内存就在我的 block 写入操作的中间,实际上我写了半个 block 。

我需要某种“进入/离开关键部分”,或者在写入文件时将文件页面“固定”到内存中的某种方法。存在这样的东西吗?如果是这样,它可以在常见的 POSIX 系统和 Windows 之间移植吗?

最佳答案

保持 journal 的技巧似乎是唯一的办法。我不知道这对于多个应用程序写入同一文件是如何工作的。 Cassandra 项目有 good article关于如何通过日记获得绩效。关键是要确保日志只记录积极 Action (我的第一个方法是将每次写入的原像写入日志,允许您回滚,但它太过分了复杂)。

所以基本上你的内存映射文件在 header 中有一个 transactionId ,如果你的 header 适合一个 block ,你就知道它不会被损坏,尽管很多人似乎用一个校验和:[header[cksum]] [header[cksum]]。如果第一个校验和失败,则使用第二个。

日记看起来像这样:

[beginTxn[txnid]] [offset, length, data...] [commitTxn[txnid]]

您只需不断附加日志记录,直到它变得太大,然后在某个时候将其滚动。当您启动程序时,您将检查文件的事务 ID 是否为日志的最后一个事务 ID,如果不是,您将回放日志中的所有事务以进行同步。

关于atomic - 内存映射文件和单个 block 的原子写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759311/

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