为什么会有c++内存模型

news2024/10/6 10:31:02
1. 引言

c++的内存模型主要解决的问题是多线程的问题。怎么理解多线程呢?单核时候,只有1个CPU内核处理多线程,各线程之间随着时间的推进,会不断的切换,如下图形便于理解。

实际上线程间的切换是非常快的,所以从人感受的视角,感觉到3个进程独占cpu在执行各自的任务。如果每个线程的变量是独立的,那么多个线程间的运行结果则不会出现问题。但是,如果有一个变量同时被多个线程更改,那么就可能出现问题。

   实际上,高级语言的一行代码,编译成机器码,则需要多个机器码指令。当线程切换时,CPU会保存上个线程的一套通用寄存器和状态寄存器,之后切换到下一个线程的通用寄存器和状态寄存器。打个比方,a的初始值5,线程1执行到以下高级语言代码时,切换下一线程2,此时通用寄存器会保存现场,a变量在线程1中通用寄存器值为5。

a += 10;   (线程1中更改变量a))

恰巧线程2会执行以下代码也修改了变量a。

a + =20; (线程2中更改变量a)

线程2完整的执行了以上代码,此时a的值为25。但是再次切换到线程1的时候,恢复线程1的现场,保存变量a的通用寄存器并不知道a的值已经被改变成25了,它仍然以为变量a的值为5,经过运行后,把变量的值变成了15。然而,编写代码的人的预期值可能是35,因为他认为变量a的初始值为5,线程1执行+10指令,线程2执行+20指令,所以他认为a的值为35。

出现以上不符合预期的结果,总结如下,

多个线程同时修改同一个变量,且在更改变量的时刻,发生了线程切换的事情,cpu内部的通用寄存器保存了现场,而再次返回现场时,这个共享变量已经被别的线程修改过了,不再是原来的值了,但是,当前线程并不知道。

2. CPU和编译器的优化

       然而,高级语言的代码逻辑和实际执行的机器码指令情况并不相同,但是产生的效果是一样。先从CPU架构的硬件差异性说起。一般而言,单核的CPU的理想原型如下:

多核的CPU的理想原型如下

       实际上,CPU核中大面积的集成电路是内核Cache。 在CPU Core和RAM之间,还有共三层的Cache结构(L1/L2/L3),此外还有Store Buffer (SB),且SB和L1 是每个Core独享,而L2是两个Core共享,L3是所有Core共享,模型总结如下

     引入Cache也是有原因了,CPU执行指令速度非常快,只占用几个指令周期,但是从RAM加载机器指令的几百个指令周期。如果CPU直接从RAM中加载机器指令的话,会严重的拖慢CPU的效率,因为CPU等待指令加载。

      引入了Cache,解决了CPU等待的问题,但却产生了很多新的问题,例如Cache的一致性,Cache的缺失,Cache的乒乓效应等等,为了解决这些问题,各CPU平台( X86 / IA64 / ARM / Power…)都有自己的解决方案,软件层面(编译器)也会有对应的优化。这导致了CPU执行的程序,并不是你写的那个版本,只是从结果上看不出差别而已。如果你曾经单步调试过一个release版本的程序,你会发现运行过程很怪异,居然没有沿着你的代码顺序执行。因为,要是严格按照你的代码顺序执行,编译器和CPU都会抱怨,说执行效率很低速度很慢。
       要了解内存模型,还是要先谈谈一些重要的优化,包括编译器和CPU/Cache方面。优化主要包括

  • Reorder
  • Invent
  • Remove

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1595494.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenHarmony实战开发-异步并发概述 (Promise和async/await)。

Promise和async/await提供异步并发能力,是标准的JS异步语法。异步代码会被挂起并在之后继续执行,同一时间只有一段代码执行,适用于单次I/O任务的场景开发,例如一次网络请求、一次文件读写等操作。 异步语法是一种编程语言的特性&…

信息系统项目管理师——管理类计算

风险管理——风险曝光度 风险曝光度概率*影响,概率指风险发生的概率,影响指风险一旦发生,受到影响的项。 题号【GX20061101](61) 知识点[风险曝光度] 风险的成本估算完成后,可以针对风险表中每个风险计算其风险曝光度。某软件小…

h5 笔记4 表格与表单

<table></table>设置表格&#xff1b; <tr></tr>设置行数&#xff1b; <td></td>设置列数&#xff1b; <caption></caption>设置表格标题&#xff1b; <th></th>设置列标题。 直列&#xff1a;column&#xf…

LeetCode 678——有效的括号字符串

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 需要两个栈&#xff0c;一个用来保存左括号所在的位置索引&#xff0c;一个用来保存星号所在的位置索引。 从左往右遍历字符串&#xff0c;如果是左括号或者星号&#xff0c;则将位置索引分别入栈&#xff0c;如…

【网站项目】面向企事业单位的项目申报小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

精通技术写作:如何写出高质量技术文章?

CSDN 的朋友你们好&#xff0c;我是未来&#xff0c;今天给大家带来专栏【程序员博主教程&#xff08;完全指南&#xff09;】的第 7 篇文章“如何撰写高质量技术文章”。本文深入探讨了如何写好一篇技术文章。文章给出了好的技术文章的定义和分析&#xff0c;并提供了从选题、…

02 MySQL 之 DQL专题

3. 数据库中仅有月薪字段&#xff08;month_salary&#xff09;&#xff0c;要求查询所有员工的年薪&#xff0c;并以年薪(year_salary)输出&#xff1a; 分析&#xff1a; 查询操作中&#xff0c;字段可以参与数学运算as 起别名&#xff0c;但实际上可以省略 #以下两句效果…

202209青少年软件编程(scratch图形化) 等级考试试卷(四级)

第1题&#xff1a;【 单选题】 运行下列程序&#xff0c;说法正确的是&#xff1f;&#xff08;&#xff09; A:列表中的数字全部小于11 B:列表的长度为 10 C:变量i最终值为 20 D:列表中有大于 10 的数字 【正确答案】: D 【试题解析】 : 程序运行后&#xff0c;变量i最…

SSRF+Redis未授权getshell

SSRFRedis未授权getshell 1.前言 当一个网站具有ssrf漏洞&#xff0c;如果没有一些过滤措施&#xff0c;比如没过滤file协议&#xff0c;gophere协议&#xff0c;dict等协议&#xff0c;就会导致无法访问的内网服务器信息泄露&#xff0c;甚至可以让攻击者拿下内网服务器权限 …

Hadoop 3.1.3

第1章 Hadoop概述 1.1 Hadoop是什么 1.2 Hadoop发展历史&#xff08;了解&#xff09; 1.3 Hadoop三大发行版本&#xff08;了解&#xff09; Hadoop三大发行版本&#xff1a;Apache、Cloudera、Hortonworks。 Apache版本最原始&#xff08;最基础&#xff09;的版本&#x…

【学习笔记十一】EWM上架目标仓位确定过程及配置

一、EWM确定目标区域概述 1.EWM从仓库处理类型获取源仓库类型&#xff08;Source storage type&#xff09;和源仓位&#xff08;Source Bin&#xff09;2.EWM根据仓库类型&#xff08;storage type&#xff09;、仓库分区&#xff08;storage section&#xff09;和上架策略&a…

待研究技术

Fabric.js H5 Canvas的js库 Fabric.js是一个用于创建交互式的HTML5 Canvas应用程序的JavaScript库。它提供了一个简单而强大的API&#xff0c;用于在Web浏览器中绘制和操作图形对象。Fabric.js可以用于创建各种图形应用程序&#xff0c;例如绘图编辑器、图像编辑器、流程图、地…

做产品,我的转行+转岗经历

许多小伙伴在后台留言提到数据产品经理这个岗位&#xff0c;今天来给大家介绍一下数据产品的一些基本工作内容和流程&#xff0c;帮助大家了解。 之前写了一篇转行PM的历程文章&#xff0c;有很多像我当年一样在求职中的小伙伴私信我&#xff0c;这其中有应届生也有程序员&…

基于Springboot+Vue的Java项目-房产销售系统(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

雅虎、乐天、煤炉、国际站、newegg、wish等跨境卖家如何提升店铺销量?深度解析自养号测评的价值

一、如何提升销量&#xff1f; 优化产品描述和图片&#xff1a;确保您的产品描述准确、详细&#xff0c;图片清晰、美观。这将有助于提高产品的吸引力&#xff0c;增加潜在买家的购买意愿。 提供良好的客户服务&#xff1a;及时回复买家的咨询和问题&#xff0c;解决他们的疑…

Mixed-Query Transformer:统一的图像分割架构

Mixed-Query Transformer:统一的图像分割架构 摘要IntroductionRelated WorkMethodMQ-Former ArchitectureObject Query Strategies Mixed-Query Transformer: A Unified Image Segmentation Architectur 摘要 在现有的一体化图像分割模型中&#xff0c;要么在多个任务上采用统…

Linux系统编程---文件系统

一、文件存储 一个文件主要由两部分组成&#xff0c;dentry(目录项)和inode inode本质是结构体&#xff0c;存储文件的属性信息&#xff0c;如&#xff1a;权限、类型、大小、时间、用户、盘块位置… 也叫做文件属性管理结构&#xff0c;大多数的inode都存储在磁盘上。 少量…

NSA发布《在数据支柱中推进零信任成熟度》报告

4月9日&#xff0c;美国国家安全局&#xff08;NSA&#xff09;发布了题为《在数据支柱中推进零信任成熟度》的报告&#xff0c;旨在于数据安全层面提供指导&#xff0c;以增强数据整体安全性并保护静态和传输中的数据。(如下图&#xff09; 一、主要内容 报告中的建议侧重于将…

程序员可以兼职的项目

程序员可以兼职的项目 私信联系我&#xff1a;15049723876&#xff08;V&#xff09;

搜索引擎广告滥用的威胁日益严重

BlueVoyant 的一份新报告发现&#xff0c;威胁行为者正在利用搜索引擎内置的广告基础设施来对毫无戒心的用户进行网络钓鱼。该博客概述了日益增长的威胁以及如何保护自己。 恶意搜索引擎广告的使用呈上升趋势&#xff0c;对全球互联网用户和公司构成重大威胁。它不是将广告中的…