关于多核CPU的x86 LOCK问题

2023-12-21

当执行“LOCK”后面的指令时,x86 ASM“LOCK”命令前缀是否会导致所有内核冻结?

我在一篇博客文章中读到了这一点,但它没有意义。我找不到任何东西表明这是否属实。


这是关于锁定该地址的内存总线。Intel 64 和 IA-32 架构软件开发人员手册 - 第 3A 卷:系统编程指南,第 1 部分 http://download.intel.com/design/processor/manuals/253668.pdf告诉我们:

7.1.4 LOCK 操作对内部处理器高速缓存的影响。

对于 Intel486 和 Pentium 处理器,LOCK# 信号始终为 在 LOCK 期间在总线上置位 操作,即使内存区域 被锁定被缓存在 处理器。

对于 P6 和更新的处理器 家庭,如果内存区域是 在 LOCK 操作期间锁定的是 缓存在处理器中 执行 LOCK 操作为 写回存储器并完全 包含在缓存行中, 处理器可能无法断言 LOCK# 公交车上的信号。相反,它会 内部修改内存位置 并允许[其]缓存一致性 机制保证运行 是原子地执行的。这 操作称为“缓存锁定”。 缓存一致性机制 自动阻止两个或多个 具有相同面积的处理器 同时修改内存 该区域的数据。 (强调已添加)

在这里我们了解到,P6 和更新的芯片足够智能,可以确定它们是否真的必须阻塞总线,或者只能依靠智能缓存。我认为这是一个巧妙的优化。

我在我的博客文章中对此进行了更多讨论“锁是怎样锁的? http://www.moserware.com/2008/09/how-do-locks-lock.html"

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

关于多核CPU的x86 LOCK问题 的相关文章

  • 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
  • 如何将 x86 GCC 风格的 C 内联汇编转换为 Rust 内联汇编?

    我在 C 中有以下内联汇编 unsigned long long result asm volatile byte 15 byte 49 shlq 32 rdx orq rdx rax a result rdx return result
  • linux x86 汇编语言 sys_read 调用的第一个参数应为 0 (stdin)

    我正在编写一个简单的汇编程序来从标准输入读取 如 scanf 这是我的代码 section bss num resb 5 section txt global start start mov eax 3 sys read mov ebx 0
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 如何仅使用单个数组在 JavaScript 中模拟调用堆栈

    我正在看维基百科页面 https en wikipedia org wiki Call stack在调用堆栈上 并尝试理解这个图像 据我所知 哈哈 const memory memory 0 3 top of stack pointer m
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • NodeJS CPU 一次飙升至 100%

    我有一个用 NodeJS 编写的 SOCKS5 代理服务器 我正在使用原生net and dgram打开 TCP 和 UDP 套接字的库 它可以正常工作大约 2 天 所有 CPU 的最大利用率约为 30 两天没有重新启动后 一个 CPU 峰
  • 是否可以在VM内使用VMX CPU指令?

    VM guest 内部的进程是否有可能使用 VMX AMD V VT x CPU 指令 然后由外部 VMM 处理而不是直接在 CPU 上处理 Edit 假设外部VM使用VMX本身来管理其虚拟客户机 即它在Ring 1中运行 如果可能的话 是
  • 在 x86 汇编中将 64 位常量移至内存

    我正在使用 Intel x64 程序集 NASM 编译器 尝试将 0x4000000000000000 常量移至内存 该常量在 ieee 754 标准双精度中应等于 2 0 我正在使用的代码是 define two 0x4000000000
  • 长多字节 NOP:通常理解的宏或其他符号

    x86 和 x86 64 处理器不仅具有单字节 这不是什么大秘密NOP指令 还包括各种类型的多字节类 NOP 指令 这些是我设法找到的 AMD 推荐 参考 AMD 系列 15h 处理器的 AMD 软件优化指南 文档 47414 http s
  • 添加冗余赋值可以在未经优化的情况下编译时加快代码速度

    我发现一个有趣的现象 include
  • 避免 gcc 函数序言开销?

    我最近遇到了很多 gcc 在 x86 上生成非常糟糕的代码的函数 它们都符合以下模式 if some condition do something really simple and return else something comple
  • 为什么X86中没有NAND、NOR和XNOR指令?

    它们是您可以在计算机上执行的最简单的 指令 之一 它们是我亲自实施的第一个指令 执行 NOT AND x y 会使执行时间和依赖链长度和代码大小加倍 BMI1 引入了 andnot 这是一个有意义的补充 是一个独特的操作 为什么不是这个问题
  • 分支预测器和分支目标缓冲区如何共存?

    我的问题是它们如何在现代 CPU 架构中共存并协同工作 你把它稍微颠倒了 每次获取时 您都会索引到分支预测器 它会告诉您刚刚收到的指令是否will be解码为已采取的分支 如果没有 则获取下一个连续地址 但是 如果您的分支预测器说它将是一个
  • std::lock 仍然导致死锁

    std lock 是用来防止死锁的 对吗 但在我的测试中 它仍然导致死锁 你能检查一下我的测试代码 看看我是否使用了错误的代码吗 std mutex m1 std mutex m2 void func1 std unique lock
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中意味着什么?

    我想我明白 movzbl rdi rcx 1 ecx 意思是 将零扩展字节移至长整型 并表示将 ecx 扩展为 32 位 但我不完全确定语法 rdi rcx 1 指的是什么 我在某处看到该语法指的是 Base Index Scale 但我找
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • CISC 机器 - 它们不只是将复杂指令转换为 RISC 吗?

    也许我在架构上存在误解 但如果机器有 比如说 乘法指令 该指令是否未转换为更小的指令 或者过于复杂以至于最终与等效的 RISC 指令具有相同的速度 乘法是一个不好的例子 它在两种体系结构中都是一条指令 将上面的 乘法 替换为 CISC 中更

随机推荐

  • C# mvc 从 AJAX 调用返回 JSON 或文件

    我的观点中有这样的东西 var url Url Action DownloadZip Program programNums selectedRow ajax url url dataType json async false succes
  • Firebase 托管自定义域错误

    我最近获得了一个 tk 域名 并愿意将其作为自定义域名链接到 Firebase 托管 阅读文档并遵循教程后 我成功地将我的第一个应用程序部署到 Firebase 托管 可通过默认的 firebaseapp com url 访问它 但是 在尝
  • ASP.net 会员添加自定义列

    在我的母版页中 我有 MembershipUser thisUser Membership GetUser loggedInUserID thisUser ProviderUserKey ToString thisUser让我可以访问所有字
  • ionic 3 深度链接用于重置密码

    我正在使用 ionic 3 创建一个移动应用程序 我需要知道实现重置密码功能的逻辑 到目前为止 我可以向用户发送一封带有重置令牌的电子邮件 我在想 id 用户点击电子邮件中的链接 如果安装了应用程序 那么它应该打开专用于重置密码的应用程序页
  • 如何将轴标题的部分(一个或两个单词)设置为斜体

    有没有办法改变轴标题部分的样式 同时保持其余部分不变 就我而言 我怎样才能斜体y 轴标题中的 细菌 X 据我所知 该命令theme axis title y element text face italic 只能改变整个y轴标题 是吗 gg
  • Openerp 7 到 Odoo 8 - 如何转换数据库

    我正在尝试将 openerp7 迁移到 odoo 8 您知道如何将数据库版本 7 转换为较新的版本 8 吗 谢谢 选项1 要求odoo公 司做开放升级 https upgrade odoo com database upload通过有效的合
  • Ruby 浮点乘法的奇怪问题

    有人在 ruby 中解决这个问题吗 假设我们有 a 8 1999999 我们想将其四舍五入到小数点后两位 即 8 20 然后乘以 1 000 000 得到 8 200 000 我们这样做 a round 2 1000000 to i 但是我
  • NSString 长度和保留计数。需要澄清

    根据以下代码 请指教 NSString str NSString alloc initWithString Hello world NSLog Length lu n str length 11 NSLog Retain count is
  • numpy 负索引 a[:-0]

    我想使用数组切片来修剪我的数组 IE a trimmed a trim left trim right 这太棒了 除非trim right是 0 我得到a trim left 0 这是一个空数组 我想我可以 a trim left a sh
  • TransformClassesWithDesugarForDebug 出错

    我在编译 APK 调试或发布 时遇到问题 Android Studio 3 0 Beta 5 这是我的构建 gradle app buildscript repositories maven url https maven fabric i
  • Sql Server 中的按位与

    我有一个非常典型的情况 我们有一个名为 Users 的表 其中有一列名为 Branches varchar 1000 该组织可以有 1000 个分支机构 因此 如果用户有权访问分支 1 5 和 10 则分支字符串将如下所示 10001000
  • 为 JavaScript 代码创建循环[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想为以下 js 代码创建一个循环
  • 主键身份值因唯一键约束违规而增加

    我有一个 Sql Server 2008 表 其中有一个主键 Identity Yes 和构成唯一键约束的其他三个字段 此外 我有一个存储过程 用于将记录插入表中 并使用 SqlConnection 对象通过 C 调用存储过程 C 存储过程
  • 如何更新 Angular Array 中的现有项目(已从外部更改)?

    我是 Angular 新手 正在努力更新 Angular 数组中已从外部更改 不是通过 Angular 支持的 UI 的现有项目 这是用例 我的网页是通过服务器端调用填充的 我将数组加载到 Angular 中并显示在列表上 现在 如果服务器
  • 采访中的任务。我们该如何解决呢?

    以这种方式转换字符串 let initialString atttbcdddd result must be like this at3bcd4 但重复次数必须大于2 例如 如果我们有 aa 结果将是 aa 但如果我们有 aaa 结果将是
  • 使用模式中的数组复制到 postgres 中?

    我正在使用 Ruby Rails Postgres 我的表看起来像这样 架构方面 CREATE TABLE my table name my num double precision NOT NULL my string arr chara
  • BST 中的第二个最大值

    这是一道面试题 找到 BST 中的第二个最大值 最大元素是 BST 中最右边的叶子 第二个最大值是其父级或其左子级 所以解决方案是遍历 BST 找到最右边的叶子并检查其父节点和左子节点 是否有意义 不 那是错误的 考虑这个 BST 137
  •  内容不收缩的 Flex 项目[重复]                
                

    这个问题在这里已经有答案了 我有一个需要握住的布局
  • 手动安装 Ruby 1.8.7(和其他东西)

    我不想再依赖一键安装程序 我想学习如何手动安装 Ruby 有这方面的资源吗 在此处下载 Ruby 1 8 7 的 Windows 二进制文件 http www ruby lang org en downloads http www ruby
  • 关于多核CPU的x86 LOCK问题

    当执行 LOCK 后面的指令时 x86 ASM LOCK 命令前缀是否会导致所有内核冻结 我在一篇博客文章中读到了这一点 但它没有意义 我找不到任何东西表明这是否属实 这是关于锁定该地址的内存总线 Intel 64 和 IA 32 架构软件