网站建设公司一年多少钱,网站建设高校,如何学习网站开发,惠州网站建设技术外包文章目录 一、C 内存模型1、为什么需要内存模型#xff1f; 前言 C 11标准中最重要的特性之一#xff0c;是大多数程序员都不会关注的东西。它并不是新的语法特性#xff0c;也不是新的类库功能#xff0c;而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方… 文章目录 一、C 内存模型1、为什么需要内存模型 前言 C 11标准中最重要的特性之一是大多数程序员都不会关注的东西。它并不是新的语法特性也不是新的类库功能而是新的多线程感知内存模型。本文介绍的内存模型是指多线程编程方面而非对象的内存布局与内存对齐之类。 一、C 内存模型
1、为什么需要内存模型 要回答这个问题需要从CPU架构说起下面是一个的多核CPU架构图如下 Core每个Core独享SB与L1SBStore BufferStore Buffer是一个缓冲区用于暂存CPU的写操作它允许CPU把数据先写入Store Buffer然后继续执行其他操作而不是等待数据被写入缓存或内存后再进行下一步。这样设计的好处是显著降低了内存写延迟对CPU性能的影响。L1 Cache存储了CPU近期可能访问的数据和指令且两个L1 Cache独享一个L2 Cache 注意上面的CPU架构只是部分CPU采用的架构并不能代表全部。 为什么需要使用Cache 如果没有CacheCPU每执行一条指令就要到内存中取数据。执行一条指令只需要几个时钟周期而取指令需要上百个时钟周期这就将导致CPU大部分时间都处于等待状态进而导致执行效率低下引入了Cache主要解决CPU等待问题。 使用Cache会引入一些新的问题例如Cache的一致性、Cache的缺失等为了解决这些问题各CPU平台ARM/X86/IA64都有自己的解决方案。软件层面编译器也会有对应的优化这导致了CPU执行的程序并不是你写的那个版本只是从结果上看不出差异而已。 编译器和CPU优化都遵循了一个同样的原则即优化后的代码若是单线程执行要与原有代码行为保持一致再加之多线程环境我们使用的互斥锁其对编译器与CPU优化做了很多限制可以让我们对线程间的执行顺序进行同步进而保证即使被优化成了另一个程序仍然有相同的执行结果。 若是我们从比互斥锁更为底层地去了解线程间的同步机制我们势必会看到CPU平台ARM/X86和编译器的差异进而可以知道优化的存在。现代C的内存模型便是为了屏蔽这些差异而让你可以不用去了解特定平台特定编译器也不用依赖互斥锁从更为底层的层面就可以完成线程间的同步。C 11开始提供的std::atomic模版便可以作为更为底层的同步工具这也是内存模型起作用的地方。