简单介绍一下什么是“工作内存”和“主内存”(JMM中的概念)

news2024/11/22 15:27:47

在学习Java多线程编程里, volatile 关键字保证内存可见性的要点时,看到网上有些资料是这么说的:线程修改一个变量,会把这个变量先从主内存读取到工作内存;然后修改工作内存中的值,最后再写回到主内存

内存可见性问题的表述为:t1 频繁读取主内存,效率比较低,就被优化成直接读自己的工作内存;t2 修改了主内存的结果,但由于 t1 没有读主内存,导致修改不能被识别到,最终导致代码出现bug。

上面这段话中提到的“工作内存”、“主内存”这两个概念,这里作一下简单的介绍。

与我们平时的使用习惯有些不同:“工作内存”指的并不是真正的内存(内存条),而是CPU寄存器与缓存;而“主内存”,才是我们所说的内存条。

这两个词语翻译自英文 work memory(工作内存) 和 main memory(主内存)。但事实上,memory 这个英文单词并不一定就特指内存条,它也可以翻译成“存储区”,单纯地表示“一个用来存储的空间”。不过虽然如此,在进行中文翻译的时候,一般还是将 memory 翻译为“内存”更多一些。因此,work memory 就仍然被翻译为了“工作内存”。

这样一来就容易让我们误会:难道内存条还分为不同的种类,有工作用的内存和主的内存之分吗?其实不然,实际上我们所说的“工作内存”,应该理解为“工作存储区”更合适,它只是CPU寄存器和缓存,而与内存条无关。

上面的这一套的说法,也称为JMM(Java Memory Model),即Java内存模型。JMM的概念来自于 jvm 规范文档,相当于是官方给出的这套说法。

为什么 Java 官方使用的是主内存、工作内存这样自己发明的新术语,而不直接使用 CPU 寄存器,缓存,内存这样更为通用术语呢?主要考虑到的一点是:Java是跨平台的。

Java 是跨平台的,这意味着它必须:

1、兼容多种操作系统。

2、兼容多种硬件设备,尤其是 CPU。

而不同的硬件之间,CPU会有比较大的差异。例如,以前的CPU上只有寄存器,而现在的CPU上除了寄存器,还有缓存;并且有的CPU还有好几个缓存(常见的是三级缓存:L1、L2、L3)。

博主电脑的三级缓存及空间

这样,Java官方文档中要指代相关的概念,如果只提“CPU寄存器”,那就太不严谨了,因为还有各种缓存;如果使用“CPU寄存器和缓存”这一指代,则又过于麻烦。因此,官方干脆发明了一个新的术语:work memory 来代表CPU寄存器和缓存(CPU内部的存储空间)。


下面再简单介绍一下CPU缓存(Cache)。

CPU 读寄存器的速度很快,要比读内存快 3 到 4 个数量级。

缓存的读取速度介于寄存器和内存之间:三级缓存中,L1 最快(仍然比寄存器慢),但空间最小;L3 最慢(仍然比内存快很多),但空间最大。

(任务管理器 -> 性能 中可以查看本机的三级缓存的空间信息。)

实际中, CPU 尝试读一个内存数据,会经历以下步骤:

1、先看看寄存器里有没有;

2、没有,再看下 L1 有没有;

3、没有,再看下 L2有没有;

4、没有,再看下 L3 有没有;

5、没有,再看下内存有没有……

CPU这样做的目标是为了效率更高。CPU访问缓存的速度要比访问内存更快,即使有了上述几个步骤,也要比直接在内存中找数据更快。

缓存的大小对于程序效率的具体影响,也看实际的应用场景。例如,AMD 7950x3D 相比于之前的型号,没有什么大的更改,主要就是提升了 L3 的缓存空间(提升到了256MB)。这样一来,在游戏场景下电脑性能的提升就很大了。

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

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

相关文章

【基于gcc】手把手教你移植RT-Thread到STM32

前言 网上大多数移植RT-Thread系统的教程都是基于Keil的,下面将带来基于gcc版本的移植教程,若你还没有基于gcc的环境,可以查看我的这篇文章:VSCode搭建STM32开发环境 1、下载RT-Thread源码 RT-Thread有好几个版本,我…

小程序路由跳转

小程序中的路由只是单纯页面地址的跳转,一般在页面中使用 navigator 组件来实现,也有很多场景需要在 js 中根据逻辑的执行结果跳转到某个页面,比如:如果检测到用户尚未登录就需要给他跳转到登录页面 1.1navigate navigate 跳转到…

软件工程开发文档写作教程(04)—开发文档的编制策略

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 开发文档编制策略 文档策略是由上级(资深)管理者制订的,对下级开发单位或开发人…

银河麒麟 Server V10 离线源建立+部署

前言 这国产操作系统真神奇,docker CentOS7, MySQL CentOS8 简直了,这缝合技术真是绝了! docker CentOS7 能装最新版 23 很顺利的! MySQL CentOS8 也是最新版8.0.33的,也很顺利! 系统版本 …

权威解析,软件测试的当下分析现状

Parasoft是一家专门提供软件测试解决方案的公司,Parasoft通过其经过市场验证的自动化软件测试工具集成套件,帮助企业持续交付高质量的软件。Parasoft的技术支持嵌入式、企业和物联网市场,通过将静态代码分析和单元测试、Web UI和API测试等所有…

详解树与二叉树的概念,结构,及实现(下篇)

目录 一, 二叉树链式实现 1. 前置说明 2. 二叉树遍历(主打的就是一个分治思想) 2. 1 前序遍历 2. 2 中序遍历 2. 3 后序遍历 2. 4 层序遍历 3. 二叉树结点个数及高度 3. 1 二叉树节点个数 3. 2 二叉树叶子节点个数 3. 3 二叉树第…

数字信号处理技术(三)自适应噪声完备集合经验模态分解(CEEMDAN)-Python代码

本文仅对自适应噪声完备集合经验模态分解(CEEMDAN)的原理简单介绍和重点介绍模型的应用。 1. CEEMDAN原理 CEEMDAN(Complete Ensemble Empirical Mode Decomposition with Adaptive Noise)的中文名称是自适应噪声完备集合经验模…

一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

文章目录 一:概述二:间隔与支持向量三:对偶问题(1)什么是对偶问题(2)SVM对偶问题(3)SMO算法 四:核函数(1)核函数的概述和作用&#xf…

车载应用生态:小程序容器技术成为保障安全的有力措施

随着智能交通和车联网技术的快速发展,越来越多的车载应用程序(APP)进入人们的视野,从而推动了车载业务生态的不断发展。然而,车载应用程序的安全问题也引起了人们的广泛关注。为此,小程序容器技术作为一种有…

4.24每日一练

题目 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 来源:力扣(LeetCode) 链接:https://leetcod…

毕业设计 医学图像阅读器 DICOM CT MRI 阅读器 三维重建 可视化编程技术及应用

一、 概述 此系统实现了常见 VTK 四视图,实现了很好的 DICOM 图像显示,可用于 DICOM 超声 X线 CT MR 三维重建 拾取像素值 窗宽 窗位 像素,距离测量,角度测量,提供源码; 并且通过三维重建实现可视化。使用…

客快物流大数据项目(一百一十七):网关 Spring Cloud Gateway

文章目录 网关 Spring Cloud Gateway 一、简介 1、功能特性

OSCP-Exfiltrated(Subrion、exiftool提权)

目录 扫描 WEB 提权 其他方法 扫描 WEB 添加 host信息 访问了该网站,并立即注意到该网站上制作的CMS(Subrion CMS)。

机器学习笔记之密度聚类——DBSCAN方法

机器学习笔记之密度聚类——DBSCAN方法 引言基本思想概念介绍算法过程完整算法描述 DBSCAN \text{DBSCAN} DBSCAN的优点和缺陷 引言 本节将介绍密度聚类—— DBSCAN \text{DBSCAN} DBSCAN方法。 对于其他聚类任务的笔记: K-Means \text{K-Means} K-Means聚类算法&…

PXE高效批量网络装机

PXE 定义 PXE(预启动执行环境,在操作系统之前运行)是由Intel公司开发的网络引导技术,工作在client /server模式,允许客户机通过网络从远程服务器下载引导镜像,并加载安装文件或者整个操作系统。 具备以下三个优点 1 规模化: 同时…

高通 Android 12 framework添加自定义按键上报应用层

Android下添加新的自定义键值和按键处理流程 首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值…

Linux系统应用编程(五)Linux网络编程(上篇)

本篇主要内容: Linux系统应用编程(五)Linux网络编程(上篇)一、网络基础1.两个网络模型和常见协议(1)OSI七层模型(物数网传会表应)(2)TCP/IP四层模…

详解C语言string.h中常用的14个库函数(一)

我计划讲解C语言string.h这个头文件中,最常用的14个库函数。为了让大家更加深入的理解这些函数,部分函数我会模拟实现。篇幅所限,如果文章太长了,可能会较难坚持读完,所以我会分几篇博客来讲述。本篇博客主要讲解的函数…

FPGA时序约束(三)时序约束基本路径的深入分析

系列文章目录 FPGA时序约束(一)基本概念入门及简单语法 FPGA时序约束(二)利用Quartus18对Altera进行时序约束 文章目录 系列文章目录前言基本时序路径时钟偏差寄存器到寄存器(reg2reg)建立时间余量保持时…

PHP实现以数组var_dump,array_combine等函数的方法功能举例

目录 前言 一、什么是数组 二、把两个数组合并成一个数组 1.1运行流程(思想) 1.2代码段 1.3运行截图 三、自动创建数组的一个案例 1.1运行流程(思想) 1.2代码段 1.3运行截图 前言 1.若有选择,可实现在目录里…