内存映射文件和单个块的原子写入

2024-02-02

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

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

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

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


保持一个的技术journal http://onjava.com/pub/a/onjava/2002/02/06/atomic.html似乎是唯一的办法。我不知道这对于多个应用程序写入同一文件是如何工作的。 Cassandra 项目有一个好文章 http://wiki.apache.org/cassandra/Durability关于如何通过日记获得绩效。关键是要确保日志只记录positive动作(我的第一个方法是将每次写入的原像写入日志,允许您回滚,但它变得过于复杂)。

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

该日记看起来像这样:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存映射文件和单个块的原子写入 的相关文章

  • Haskell:Yesod 和状态

    我正在阅读代码玩具 URL 缩短器 http flygdynamikern blogspot com au 2011 06 toy url shortener with yesod and acid html 然而 有一些重要的部分我就是无
  • std::memory_order 和指令顺序,澄清

    这是一个后续问题this one https stackoverflow com questions 59626494 understanding memory order acquire and memory order release
  • 为什么原子操作被认为是线程安全的?

    原子操作如何成为线程安全的 我读过有关该主题的内容维基百科关于线程安全的文章 http en wikipedia org wiki Thread safety 但文章并没有真正解释幕后的过程 换句话说 为什么线程A执行的 原子 操作不能被线
  • 在 x86-64 上,“movnti”指令是原子指令吗?

    在 x86 64 CPU Intel 或 AMD 上 将 4 8 字节写入 32 64 位对齐地址的 movnti 指令是原子的吗 Yes movnti在自然对齐的地址上是原子的 就像 x86 上所有其他自然对齐的 8 16 32 64b
  • 为什么 CAS(原子)操作比同步或易失性操作更快

    据我了解 synchronized关键字将本地线程缓存与主内存同步 volatile 关键字基本上总是在每次访问时从主内存中读取变量 当然 访问主内存比本地线程缓存要昂贵得多 因此这些操作的成本很高 然而 CAS 操作使用低级硬件操作 但仍
  • C++20 内存模型中释放序列定义的更改有何影响?

    考虑这个程序 Initially std atomic
  • 如何保证成员4字节对齐?

    为了使用 OSAtomicDecrement mac 特定的原子操作 我需要提供一个 4 字节对齐的 SInt32 这样的煮法有用吗 还有其他方法可以解决对齐问题吗 struct SomeClass SomeClass member sto
  • 领域驱动设计:处理原子操作和事务

    必须保证每个聚合内部的一致性 在存储库中执行此操作很容易 因为我始终可以使用数据库或框架中的事务 我对存储库之外发生的事情表示怀疑 一项服务可能需要使用多个聚合来处理请求 在服务处理过程中或在保留聚合时可能会出现问题 如果服务处理过程中出现
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • mmap() 和锁定文件

    考虑以下代码片段 故意缺少错误处理 void foo const char path off t size int fd void ret fd open path O RDWR lockf fd F LOCK 0 ret mmap NUL
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • C++11:atomic::compare_exchange_weak 是否支持非原始类型?

    我有以下代码 include
  • 我应该如何以非 root 身份读取 Linux 上的 Intel PCI 非核心性能计数器?

    我想要一个库 允许对 Linux 可执行文件的关键部分进行 自我分析 就像人们可以使用一个部分计时一样获取当日时间 http linux die net man 2 gettimeofday or RDTSC http www strchr
  • 在 Node.js 中以事务方式写入文件

    我有一个 Node js 应用程序 它将一些配置数据存储在文件中 如果更改某些设置 配置文件将写入磁盘 目前 我正在使用一个简单的fs writeFile 现在我的问题是 当 Node js 在写入文件时崩溃时会发生什么 磁盘上是否有可能存
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • 对原子变量的非原子操作,反之亦然[重复]

    这个问题在这里已经有答案了 给出以下代码 static int x static void f for int i 0 i lt 100 i atomic fetch add x 3 进一步 假设f由两个线程同时调用 C C 内存模型是否保
  • 如何映射内存中的_特定_区域?

    我有一个程序 我希望它能够在不同的运行中映射特定的内存区域 我有该程序的源代码 C C 我控制程序的编译方式 海湾合作委员会 我控制程序的链接方式 海湾合作委员会 我控制程序的运行方式 Linux 我只想拥有这个特定的内存区域 比如 0xa
  • mmap 和 gzip 可以协作吗?

    我试图弄清楚如何将 mmap 与 gzip 压缩文件一起使用 这可能吗 import mmap import os import gzip filename r C temp data gz file gzip open filename
  • 环回:原子读取和更新

    有没有办法在环回中实现类似的东西 LOCK READ INCREMENT UNLOCK 我想将计数器保留为数据库值 每个键都是一个计数器 或一个设置 并且它们不应该同时访问我的多个请求 此外 这也应该适用于本地请求 无 RemoteHook
  • memory_order_consume 和 memory_order_acquire 之间的区别

    我有一个关于GCC Wiki 文章 https gcc gnu org wiki Atomic GCCMM AtomicSync 在 总体摘要 标题下给出了以下代码示例 主题 1 y store 20 x store 10 话题2 if x

随机推荐