Java并发基础--CPU性能优化与内存屏障

2023-11-20

为了提高程序运行的性能,现代CPU在很多方面对程序进行了优化:

1.CPU高速缓存。尽可能地避免处理器访问主内存的时间开销,处理器大多会利用高速缓存以提高性能。CPU缓存分为多几缓存,如图

  • L1 Cache(一级缓存)是CPU第一层高速缓存,分为数据缓存和指令缓存。一般服务器CPU的L1缓存容量在32-4096KB。
  • L2  由于L1级高速缓存容量的限制,为了再次提高CPU的运算速度,在CPU外部放置一高速存储器,即二级缓存。
  • L3  同L2一样L3缓存可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大L3缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。L3缓存可能是多核共享的。

CPU在读数据时,先在L1中寻找,再从L2寻找,再从L3寻找,然后是内存,再后面是外存储器。

缓存一致性协议:在多CPU读取同样的数据到缓存,进行不同的运算之后,最终写入主内存以哪个CPU为准呢?在这种高速缓存回写的场景中,有一个缓存一致性协议,多数CPU厂商对它进行了实现。MESI协议,规定每条缓存有个状态位,同时定义了下面四个状态:

  • 修改态(Modified),此cache已被修改过(脏行),内容已不同于主存
  • 专有态(Exclusive),此cache内容同于主存,但不出现于其他cache中
  • 共享态(Shared),此cache内容同于主存,但也出现在其他cache中
  • 无效态(Invaild),此cache内容无效,需要重新加载。

多处理器时,单个CPU对缓存中数据进行了改动,需要通知给其他CPU。也就意味着,CPU处理不仅要控制自己的读写操作,还要监听气体CPU发出的通知,从而保证最终一致。

因此会产生一个问题,缓存中的数据与主内存中的数据并不是实时同步的,各CPU间缓存的数据也不是实时同步,在同一个时间点,各CPU所看到同一内存地址的数据的值可能不一致。

 

2.运行时指令重排

指令重排场景:当CPU写入数据时发现该区块正被其他CPU占用,为了提高CPU处理性能,可能将后面的命令优先执行。但并不能随便重排,需要遵守as-if-serial语义。

as-if-serial指的是:不管怎么重排序,单线程程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。也就是说,编译器和处理器不会对存在数据依赖关系的操作做重排序。

虽然遵守了as-if-serial语义,但仅在单CPU自己执行的情况下能保证结果正确。多核多线程中,指令逻辑无法分辨因果关联,可能出现乱序执行,导致程序运行结果错误。

 

3.内存屏障

处理器提供了两个内存屏障指令(Memory Barrier)用于解决上述两个问题。

  • 写内存屏障(Store Memory Barrier):在指令后插入写内存屏障,能让写入缓存中的最新数据强制更新写入主内存,让其他线程可见。强制写入主内存,这种显示调用,CPU就不会因为性能考虑而去对指令重排序。
  • 读内存屏障(Load Memory Barrier):在指令前插入读内存屏障,可以让缓存中的数据失效,强制重新从主内存加载数据。强制读取主内存数据,让CPU缓存与主内存保持一致,避免缓存导致的一致性问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java并发基础--CPU性能优化与内存屏障 的相关文章

  • 单例模式之懒汉式

    在上篇文章中 我们讲了单例模式中的饿汉式 今天接着来讲懒汉式 1 懒汉式单例模式的实现 public class LazySingleton private static LazySingleton instance null 让构造函数为
  • Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)

    并发编程已完结 章节如下 Java 并发编程上篇 Synchronized 原理 LockSupport 原理 ReentrantLock 原理 Java 并发编程中篇 JMM CAS 原理 Volatile 原理 Java 并发编程下篇
  • Java并发编程学习12-任务取消(上)

    任务取消 上 任务取消 由于篇幅较多 拆分了两篇来介绍各种实现取消和中断的机制 以及如何编写任务和服务 使它们能对取消请求做出响应 如何理解任务是可取消的 如果外部代码能在某个任务正常完成之前将其置入 完成 状态 那么这个任务就被认为是可取
  • 线程池任务队列和拒绝策略

    1 任务队列 BlockingQueue
  • volatile概念详解及使用场景

    文章目录 一 volatile关键字特性 1 概念 2 特性 可见性 有序性 禁止指令重排序 原子性 二 使用场景 模式1 状态标志 模式2 独立观察 independent observation 模式3 一次性安全发布 模式4 vola
  • 生产者消费者模型你知道多少

    背景 进入正题之前先说点故事 从最开始学java的那里开始 我是从08年下半年开始学Java 在 我的六年程序之路 中提到了一些 当时比较简单 每天看尚学堂的视频 对于初学者而言看视频好一些 然后写代码 比较清楚的记得马士兵讲到生产者消费者
  • android 实现一个按钮按下时总触发一个事件

    一 简单的思路为 生产者 消费者模式来实现 1 重写这个对象的触摸事件 对触摸事件与事件分发机制的同学不了解的可以查阅其他资料 2 在MotionEvent ACTION DOWN 事件中启动一个线程 这个线程类似生产者 它不停的生产想要的
  • 带你解决java内存爆炸和CPU100%的问题

    文章目录 java 内存爆炸 CPU100 问题分析 定位与解决 背景 堆内存溢出 问题思路整理 堆外内存分析 问题思路整理 CPU 100 问题排查 引发原因 java 内存爆炸 CPU100 问题分析 定位与解决 背景 今天给java开
  • Java并发总结之Java内存模型

    本文主要参考 深入理解Java虚拟机 和 Java并发编程的艺术 对Java内存模型进行简单总结 一 CPU和缓存一致性 1 CPU高速缓存 为了解决CPU处理速度和内存处理速度不对等的问题 就是在CPU和内存之间增加高速缓存 当程序在运行
  • 深入详解ThreadLocal内存泄漏问题

    1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线程自己所拥有的threadLocalMap中 这样每个线程使用自己的对象实例 彼此不会影响达
  • Java并发编程的相关知识(7)-阻塞队列

    阻塞队列 ArrayBlockingQueue LinkedBlockingQueue ProiorityBlockingQueue DelayQueue SynchronousQueue LinkedTransferQueue Linke
  • java并发编程:CopyOnWrite容器介绍

    前言 Copy On Write简称COW 是一种用于程序设计中的优化策略 其基本思路是 从一开始大家都在共享同一个内容 当某个人想要修改这个内容的时候 才会真正把内容Copy出去形成一个新的内容然后再改 这是一种延时懒惰策略 从JDK1
  • JAVA并发编程学习笔记10-volatile

    JAVA并发编程学习笔记10 volatile 概念 JMM JAVA内存模型 常见概念 可见性 指令重排序 happens before规则 synchronized volatile Thread start 方法 Thread int
  • Java并发编程之CyclicBarrier详解

    简介 栅栏类似于闭锁 它能阻塞一组线程直到某个事件的发生 栅栏与闭锁的关键区别在于 所有的线程必须同时到达栅栏位置 才能继续执行 闭锁用于等待事件 而栅栏用于等待其他线程 CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集
  • Java并发编程学习16-线程池的使用(上)

    线程池的使用 上 引言 1 任务和执行策略间的隐性耦合 1 1 线程饥饿死锁 1 2 运行时间较长的任务 2 设置线程池的大小 总结 引言 前面的章节介绍了任务执行框架及其实际应用的一些内容 本篇开始将分析在使用任务执行框架时需要注意的各种
  • 【并发编程】CPU cache结构和缓存一致性(MESI协议)

    一 cache cpu cache已经发展到了三级缓存结构 基本上现在买的个人电脑都是L3结构 1 cache的意义 为什么需要CPU cache 因为CPU的频率太快了 快到主存跟不上 这样在处理器时钟周期内 CPU常常需要等待主存 浪费
  • Amdahl定律

    计算机科学中的一个重要定律 描述 系统中某部件由于采用某种方式使系统性能改进后 整个系统系能的提高与该方式的使用频率或占总的执行时间的比例有关 主要应用 改善 系统瓶颈 性能 Amdahl定律定义了加速比 加速比 采用改进措施后性能 未采用
  • 高性能中间件-RabbitMQ

    高性能中间件 RabbitMQ 高性能中间件 RabbitMQ 1 RabbitMQ是什么 2 RabbitMQ的整体结构 3 SpringBoot集成RabbitMQ 4 RabbitMQ丢失消息和解决方案 5 RabbitMQ的应用实践
  • Java并发编程学习1-并发简介

    Java并发编程学习系列 Java并发编程学习 简介 线程的优势 发挥多处理器的强大能力 建模的简单性 异步事件的简化处理 响应更灵敏的用户界面 线程的风险 安全性问题 活跃性问题 性能问题 结语 简介 在早期的计算机中不包含操作系统 它们
  • c3p0数据库连接池死锁问题和mysql重连,连接丢失

    c3p0参数解释 最常用配置 initialPoolSize 连接池初始化时创建的连接数 default 3 取值应在minPoolSize与maxPoolSize之间 c3p0 initialPoolSize 10 minPoolSize

随机推荐

  • Git提交代码步骤

    目录 1 Git提交代码步骤 1 1 第1步 同步远程仓库代码 git pull 1 2 第1步 查看当前状态 git status 1 3 第2步 提交代码到本地git缓存区 git add 1 4 第3步 推送代码到本地git库 git
  • 让csdn中的静态图动起(firemonkey)

    缘起 错过了登月50周年的日子 7 20 看到了如下卡通图童心大发 让它动起来 https blog csdn net csdnnews article details 96403350 代码下载 链接 https pan baidu co
  • CI/CD

    CICD 是 持续集成 Continuous Integration 持续交付和持续部署 Continuous Deployment 简称 指在开发过程中自动执行一系列从开发到部署的过程中 尽量减少人工的介入 CI CD AND CD CI
  • C++学习笔记12:输入输出流实例整理(文本文件读写,二进制文件读写,一组数据的文件读写,随机访问文件实例

    这也太难记了555老阔疼 文件读写示例 include
  • Kubernetes APIServer,Etcd,controller manager,scheduler 高可用原理

    高可用背后的原理 这两个月和博云合作的项目是要用于客户生产环境的 这个和我以前做的东西有很大的不同 所有基础架构必须给出高可用的解决方案 在这之前我只做过一些流量较小的用户产品或者一些原型项目 一开始基础架构都只给出了单节点的解决方案 结果
  • 微信小程序--给头像添加logo(生成海报同理)

    实现给图片添加logo或者生成海报 其原理是使用canvas 用canvas绘制出想要的图片进行保存 1 在wxml文件中添加canvas canvs层级太高 所以将它定位到屏幕外 不影响页面
  • 嵌入式资源网站

    原题地址 http blog csdn net ce123 article details 6724127 一 MailList 1 MailList大全 网址 http news gmane org 描述 可以查到绝大部分开源项目的Mai
  • LVGL学习(3):页面切换原理和页面管理实现

    在LVGL中 大多情况下是有多个页面的 一般来说页面的切换有两种情况 删除当前的页面 创建新页面加载 保留当前的页面 创建新页面加载 我们来分析一下这两种情况 比如页面1有一个列表框 有三个选项 每个选项对应进入一个页面 假设此时我们的焦点
  • VScode 怎么设置成中文

    1 打开 vscode 2 按快捷键 Ctrl Shift P 3 在 vscode 顶部会出现一个搜索框 4 在搜索栏输入 Configure Display Language 然后回车 5 vscode 里面就会打开一个语言配置文件 6
  • // SPDX-License-Identifier: MIT

    上述声明是指明你写的智能合约采用什么样的对外开放标准 该标准规定了别人是否拥有各种使用权利 其中 MIT 标准说明其他人可以随便用该源码 但出问题不负责
  • SQL各种日期转换代码大全

    select CONVERT varchar getdate 120 2004 09 12 11 06 08 select replace replace replace CONVERT varchar getdate 120 200409
  • html5 亲子模板,亲子阅读手抄报精美模板

    陪着孩子一起读 这点至关重要 不要丢下孩子一人读书 这样孩子很快就会失去读书的兴趣 今天学习啦小编给大家带来了亲子阅读手抄报精美模板 供大家阅读和参考 亲子阅读手抄报图片欣赏 亲子阅读手抄报图片1 亲子阅读手抄报图片2 亲子阅读手抄报图片3
  • 4、动态代理的缓存机制

    1 背景 上一节大致介绍了Proxy动态代理的原理 从几个疑问上面分析 这一节介绍一下动态代理的缓存机制 网上的资源比较少 可以怀着下面几个问题阅读源码 为什么要缓存 缓存的内容是什么 哪里调用的缓存 缓存的实现机制 缓存的过期机制 2 属
  • PTP/IP协议

    PTP IP PTP over IP 是一个通过IP连接 建立在 Picture Transfer Protocol PTP 上的传输层 我之所以在了解这个东西是因为有一台 Nikon 相机支持 WLAN 和手机传输相片 但是APP设计得极
  • 读取Properties配置文件

    读取Properties文件 File ReadHttpUrlProperties java User jiangefng li Date 2015年5月22日10 30 56 public class ReadHttpUrlPropert
  • R语言与多元线性回归方程及各种检验

    R语言与多元线性回归方程及各种检验 文章目录 R语言与多元线性回归方程及各种检验 一 模型建立 二 多重共线性 1 产生的背景 2 多重共线性的检验 1 简单相关系数法 2 方差膨胀因子 vif 法 3 矩阵 X T X
  • 一、eladmin学习笔记之common层相关注解上

    文章目录 eladmin使用的相关注解 1 Inherited 2 Documnet 3 Target 用来表示注解的作用范围 4 Retention 5 Component 6 RequestMapping 8 AliasFor 9 Ma
  • C#学习笔记 控制流

    C 是一门命令式的语言 默认语句以顺序方式执行 利用控制流语句可以改变程序的执行流程 以实现复杂的算法 条件语句 if语句 如果如果是单条件判断 可以使用if语句 if语句的执行体 既可以是单条语句也可以是由 花括号括起来的语句块 bool
  • SQLite解决插入特殊字符导致插入失败的问题

    SQLite解决插入特殊字符导致插入失败的问题 背景 在使用SQLite数据库时 我们经常会遇到插入的数据里面有单引号之类的特殊字符 如果不能正确处理 会导致插入数据失败 解决方法 方法一 对特殊字符进行转义 INSERT INTO tim
  • Java并发基础--CPU性能优化与内存屏障

    为了提高程序运行的性能 现代CPU在很多方面对程序进行了优化 1 CPU高速缓存 尽可能地避免处理器访问主内存的时间开销 处理器大多会利用高速缓存以提高性能 CPU缓存分为多几缓存 如图 L1 Cache 一级缓存 是CPU第一层高速缓存