记忆栅栏 - 需要帮助才能理解

2023-11-26

我正在读 Paul E. McKenney 的《记忆障碍》http://www.rdrop.com/users/paulmck/scalability/paper/whymb.2010.07.23a.pdf一切都解释得很详细,当我看到一切都清楚的时候,我遇到了一句话,它把一切都搞得一团糟,让我觉得我什么都不懂。让我举个例子

void foo(void)
{
   a = 1; #1
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   assert(a == 1); #4
}

假设这两个函数在不同的处理器上运行。 现在可能发生的情况是,在第二个处理器存储到 b #2 之后,可以看到存储到 a #1,因为第一个处理器排队存储到“a”并继续存储 b 指令。好的,没关系,我们在 #1 和 #2 之间的行中添加一个写栅栏,但是此代码仍然可能会失败,因为第二个处理器可能会将无效消息排队,因此我们在中再添加一个内存栅栏(这次是读栅栏) #4 和 #4 之间的线。

void foo(void)
{
   a = 1; #1
   write_memory_barrier();
   b = 1; #2
}

void bar(void)
{
   while (b == 0) continue; #3
   read_memory_barrier();
   assert(a == 1); #4
}

这强制第二个处理器处理所有排队的消息(使 a 无效),并通过将读取的 MESI 消息发送到 #4 上的第一个处理器来再次读取它。好的。接下来文章说

因此许多CPU架构 提供较弱的记忆屏障 只执行一项或一项的指令 这两个中的另一个。大致说来, “读内存屏障”仅标记 无效队列和“写内存 “barrier”仅标记存储缓冲区。 而一个成熟的记忆障碍 两者都做。

太好了,很清楚,但之后我看到了这个

这样做的效果是读取 内存屏障命令仅加载 执行它的CPU,所以所有 读取内存之前的加载 屏障似乎已经完成 在读取之后的任何负载之前 记忆障碍。同样,写一个 内存屏障仅命令存储, 再次在执行它的CPU上,并且 再次使之前的所有商店 写内存屏障会出现 在任何商店之前完成 遵循写内存屏障。

so

读内存屏障之前的所有加载将 似乎在任何负载之前完成 读内存屏障

这混淆了之前解释的所有内容。这是什么意思?函数“bar”中的哪个加载必须在加载“a”#4 之前完成?我知道断言可能会在这个函数中没有内存屏障的情况下失败,只是因为处理器可能读取旧值,因为它仍然无法使其对象“a”所在的缓存行无效。

详细的解释真的很有帮助,我一整天都在努力理解它。

首先十分感谢。


这是什么意思?

这意味着如果您有:

read
read
read
READ BARRIER
read
read
read

然后读取屏障充当“连接点”,将这些读取分为两批。读屏障之前的所有读取都将在读屏障之后的任何读取开始之前完成。

哪个加载在bar()必须在加载之前完成a(#4) 开始了吗?

所有阅读的b(#3) 被迫先于任何读取a(#4)。这意味着a直到之后才阅读b不再是0。因为foo()使用写屏障来确保a已经改为1(#1) 到那时b已更改(#2)。因此,这两个屏障共同作用以确保断言语句始终成功。

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

记忆栅栏 - 需要帮助才能理解 的相关文章

随机推荐

  • 如何使用ffmpeg淡入淡出两个图像

    我有两个图像 我想在它们之间创建一个简单的淡入淡出过渡 我还希望最终输出是图像序列而不是视频 因此 如果淡入淡出过渡的长度为 10 帧 我希望输出为 10 个图像的序列 我怎样才能用 ffmpeg 实现这个目标 See the blend视
  • macOS php71 通过brew 变得[电子邮件受保护]

    一天前 我用brew命令安装了正常的php71brew install php71 我试图安装 gmp 扩展 例如brew install php71 gmp但它不起作用 所以我使用了谷歌搜索中的某种代码 并使我的 php71 成为 电子邮
  • 在运行时修改类属性

    我不确定我是否见过 在运行时更改属性的参数 我的情况非常相似 但我试图在运行时更改类的属性 Category Change me public class Classic public string Name get set 其中一个答案是
  • 如何在不抗锯齿的情况下拉伸图像

    所以我最近遇到了这个 http www nicalis com 我很好奇 有没有办法用较小的图像来做这种事情 我的意思是 它是像素艺术 而不是使用每个像素大小四倍的图像 我们不能用代码拉伸它们吗 所以我开始努力实现它 我尝试了 CSS Ja
  • Angular 6 HttpClient 返回类的实例

    在引入 Angular 的新 HttpClient 之前 我们可以使用以下方法验证从 http api 调用返回的对象instanceof关键词 他们不再可以使用 HttpClient 模块 我正在尝试一些简单的方法 但类型检查每次都返回
  • 动态 CMS,如 ruby​​ on Rails 中的路线

    我想创建一个类似 CMS 的网站 用户从一些通用页面开始 即 homepage about contact etc 并从那里可以动态添加子页面 例如 homepage articles article1 something 其他的东西 ar
  • SDK 中的 Android 电池

    有没有办法从Android SDK获取电池信息 比如电池剩余寿命等等 我无法通过文档找到它 这是一个简单的示例 可以让您了解电池的使用量 电池电压及其温度 将以下代码粘贴到活动中 Override public void onCreate
  • 在 Sympy 中创建形式线性函数

    我在 Sympy 中有一个表达式 比如 M n x n 我会 f 说 就像创建一个正式的线性函数 并将其应用到我的表达式中 以便在简化后得到 f M f n f x n 是否可以告诉 sympy 诸如线性之类的属性已得到验证 一种非常巧妙的
  • Joomla 3.X - 从标题中删除工具提示脚本?

    我正在尝试从自定义 joomla 模板标头中删除不需要的脚本 我已成功删除除此之外的所有内容 我已经搜索了几个小时 并尝试了很多方法来将其删除 但我似乎无法摆脱它 以下是我删除不需要的其他脚本的方法 对于遇到此问题的其他人 unset fr
  • 用 C/C++ 编写的语法突出显示库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在寻找一个免费的 用于商业用途 库 用于用 c c 编写的语法着色 那里有吗 我不确定您是否正在寻找为现有控件或内置文本着色的控件着色的东西 如果您正在寻找后者 您可以查看 Sc
  • Winforms - 如何更改 ListView 控件中行的颜色?

    使用 C Winforms 3 5 是否可以将行颜色设置为在列表视图中自动交替 或者每次将新行添加到列表视图时是否需要手动设置行颜色 基于一个MSDN文章手动方法如下所示 alternate row color if i 2 0 lvi B
  • 如何在“宽高比”模式下将 UIImageView 裁剪为新的 UIImage?

    我想通过裁剪 UIImageView 内的图像来创建一个新的 UIImage 例如 在上图中 我想要一个绿色轮廓区域的新 UIImage 我找到了执行此操作的代码 通常它看起来像这样 作为 UIImage 类别 UIImage croppe
  • 智能 gwt 教程和指导 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我是 smart gwt 的新手 我需要一些帮助 请帮助提供一些好的 smart gwt 教程以及一些我可以购买来学习这一点的好书 我做了一些搜索
  • 当网络完全收敛时停止 Keras 训练

    如何配置 Keras 停止训练直到收敛或损失为 0 时 我故意想要过度拟合它 我不想设置纪元数 我只是想让它在收敛时停止 Use an 提前停车打回来 您可以自由选择要观察的损失 指标以及何时停止 通常 您会查看 验证损失 val loss
  • 清空关系数据库架构

    我有一个已备份的数据库 现在我试图删除原始数据库中的所有内容并将其恢复到空状态 因为它是一个关系数据库 所以它有关键的约束 我可以使用任何工具吗 最简单的方法可能是禁用外键检查 然后截断表 由于外键已禁用 因此截断表的顺序并不重要 set
  • App Engine:传输密码并将其安全存储在 Google App Engine 中的最佳做法是什么?

    我想知道从网络表单传输密码并将其存储在数据存储中的最先进技术是什么 最近的很多帖子都指出bcrypt但是 没有纯 Python 实现 而这是 App Engine 的要求 有什么建议么 最佳实践 将 Users API 与 Google 帐
  • 恢复 .orig 文件的简单方法?

    我刚走一不小心就跑了hg revert Mercurial 是否附带一个工具来移动所有 orig文件放回原处 不 如果你在 bash 中 你可以随时执行以下操作 for thefile in orig do cp v thefile the
  • 在 WordPress 中集成 Bootstrap 轮播,无需插件

    我已将 bootstrap carousel 集成到我的 WordPress 中 幻灯片将从标记为 精选 的帖子中获取 因此只会显示 5 个最近输入的 精选 帖子 下面是我的代码 div class carousel slide bs do
  • 如何将之前的路线作为 Angular 中的路径?

    如何将之前的路线作为 Angular 中的路径 我尝试使用解决方案这个链接 但它不会在首页加载时执行 constructor router Router router events pipe filter event gt event in
  • 记忆栅栏 - 需要帮助才能理解

    我正在读 Paul E McKenney 的 记忆障碍 http www rdrop com users paulmck scalability paper whymb 2010 07 23a pdf一切都解释得很详细 当我看到一切都清楚的