Skip to content

Commit ccf60d8

Browse files
committed
更新内存模型的内容,不同指令集架构的基础常识普及
1 parent f7bad1e commit ccf60d8

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

md/05内存模型与原子操作.md

+28-1
Original file line numberDiff line numberDiff line change
@@ -765,11 +765,34 @@ inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
765765
修改顺序:写写连贯、读读连贯、读写连贯、写读连贯;以及各种操作,消费操作、获得操作、释放操作,还是肯定得说一下的。
766766
-->
767767
768-
### `x86` 和 `ARM` 内存模型:强一致性与弱一致性
768+
### `x86` 和 `ARM` 的内存模型:强一致性与弱一致性
769+
769770
<!--
770771
聊最广泛的 `x86` 与 `ARM` 这种,也顺便扯扯其它的架构,如 `RISC-V` 之类的,主要还是想稍微介绍下,聊点常识长长见识。
771772
-->
772773
774+
**内存模型是软件与实现之间的一种约定契约**。它定义了在多线程或并发环境中,如何对内存操作的顺序和一致性进行规范,以确保程序的正确性和可靠性。
775+
776+
C++ 标准为我们定义了 C++ 标准内存模型,使我们能够无需关心底层硬件环境就编写出跨平台的应用程序。不过,了解底层硬件架构的内存模型对扩展知识面和深入理解编程细节也非常有帮助。
777+
778+
最经典与常见的两种 CPU 指令集架构就是:`x86` 与 `ARM`。
779+
780+
- `x86` 架构:是一种复杂指令集计算([CISC](https://zh.wikipedia.org/wiki/%E8%A4%87%E9%9B%9C%E6%8C%87%E4%BB%A4%E9%9B%86%E9%9B%BB%E8%85%A6))架构,因其强大的性能被广泛应用于桌面电脑、笔记本电脑和服务器中。`x86` 架构采用的是 TSO(Total Store Order)[**内存一致性模型**](https://jamesbornholt.com/blog/memory-models/),是一种**强一致性模型**,**简化了多线程编程中的内存同步问题**(后文中会提到)。
781+
782+
- `ARM` 架构:是一种精简指令集计算([RISC](https://zh.wikipedia.org/wiki/%E7%B2%BE%E7%AE%80%E6%8C%87%E4%BB%A4%E9%9B%86%E8%AE%A1%E7%AE%97%E6%9C%BA))架构,因其高能效和低功耗特点广泛应用于移动设备、嵌入式系统和物联网设备中。`ARM` 架构采用的是**弱序内存模型**([weakly-ordered memory](https://developer.arm.com/documentation/102336/0100/Memory-ordering)),允许**更灵活**的内存优化,但这需要程序员使用内存屏障等机制来确保正确性。
783+
784+
这两种架构在设计理念和应用领域上存在显著差异,这也是它们在不同应用场景中表现出色的原因。
785+
786+
如果你从事嵌入式系统或者学术研究等,可能也听说过 `RISC-V` 架构,它目前在国内的应用也逐渐增多。
787+
788+
RISC-V 是一种开源的精简指令集计算(RISC)架构,旨在提供一种高效、模块化且开放的指令集。与 x86 和 ARM 架构不同,RISC-V 的设计目标是简化指令集,同时保持高度的灵活性和扩展性。它在内存模型方面也有自己独特的特性。
789+
790+
RISC-V 采用的也是**弱序内存模型**(weakly-ordered memory model),这与 x86 的强一致性模型(TSO)和 ARM 的弱一致性模型有所不同。你可能会有疑问:
791+
792+
- `ARM` 和 `RISC-V` 都是弱序内存模型,为什么不同?
793+
794+
各位一定要区分,这种强弱其实也只是一种分类而已,不同的指令集架构大多都还是有所不同的,并不会完全一样。例如: `x86` 的 TSO(Total Store Order)是强一致性模型的一种,但并不是所有强一致性模型都是 TSO
795+
773796
### 宽松定序
774797
775798
### 释放-获取定序
@@ -779,3 +802,7 @@ inline constexpr memory_order memory_order_seq_cst = memory_order::seq_cst;
779802
### 序列一致定序
780803
781804
### 与 `volatile` 的关系
805+
806+
<!--
807+
以上 5 节是根据 cppreference 的顺序,我们参考 cppreference 的描述,并根据自己的想法和语言
808+
-->

0 commit comments

Comments
 (0)