内存对齐为何会提高性能?

news2024/7/4 4:39:44

文章目录

  • 前言
  • 一、内存对齐是什么?
  • 二、这一行是什么?
    • 高速缓存行: CacheLine
    • 为啥补齐到64?
  • 总结


前言

著名的Java并发编发锁编程大师Doug lea在JDK 7的并发包里新增一个队列集合LinkedTransferQueue,它在使用volatile变量时,用一种追加字节的方式来优化队列出队和入队的性能;

意思是,通过追加字符串,然后提升性能;这种方式看起来很神奇,但如果深入理解处理器架构就能理解其中的奥秘。


一、内存对齐是什么?

LinkedTransferQueue的代码如下:

	/** 队列中的头部节点 */
	private transient f?inal PaddedAtomicReference<QNode> head;
	/** 队列中的尾部节点 */
	private transient f?inal PaddedAtomicReference<QNode> tail;
	static f?inal class PaddedAtomicReference <T> extends AtomicReference T> {
		// 使用很多4个字节的引用追加到64个字节
		Object p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, pa, pb, pc, pd, pe;
		PaddedAtomicReference(T r) {
			super(r);
		}
	}
	public class AtomicReference <V> implements java.io.Serializable {
		private volatile V value;
		// 省略其他代码

LinkedTransferQueue这个类,它使用一个内部类类型来定义队列的头节点(head)和尾节(tail),而这个内部类PaddedAtomicReference相对于父类AtomicReference只做了一件事情,就是将共享变量追加到64字节。我们可以来计算下,一个对象的引用占4个字节,它追加了15个变量(共占60个字节),再加上父类的value变量,一共64个字节;

上述内容用图表示,大概如下
对齐

为什么追加到64字节能够提高并发编程的效率呢?因为对于英特尔酷睿i7、酷睿、Atom和NetBurst,以及Core Solo和Pentium M处理器的L1、L2或L3缓存的高速缓存行是64个字节宽,不支持部分填充缓存行,这意味着,如果队列的头节点和尾节点都不足64字节的话,处理器会将它们都读到同一个高速缓存行中,在多处理器下每个处理器都会缓存同样的头、尾节点,当一个处理器试图修改头节点时,会将整个缓存行锁定,那么在缓存一致性机制的作用下,会导致其他处理器不能访问自己高速缓存中的尾节点,而队列的入队和出队操作则需要不停修改头节点和尾节点,所以在多处理器的情况下将会严重影响到队列的入队和出队效率。Doug lea使用追加到64字节的方式来填满高速缓冲区的缓存行,避免头节点和尾节点加载到同一个缓存行,使头、尾节点在修改时不会互相锁定。

说人话就是: head 与tail 不在同一行,当修改的head 和tail的时候,应该是两个线程在操作; 如果不追加,将导致head 和tail 在同一行,那么修改head 和tail 的两个线程,需要相互通知,等待,因为相当于在操作同一个资源; 这就是内存补齐(补齐到计算机的进制位数大小),能提高速度的原因;

未补齐

未补齐的大致样子

二、这一行是什么?

没错,这一行是什么,就是上面我画的这一行是什么东西?

高速缓存行: CacheLine

这篇文章写的不错 传送门
我做出如下总结:

  • 每一行其实都是从内存中读取的数据的缓存,相当于从主内存获取的数据,然后放到自己的工作线程中的一个缓存;

为啥补齐到64?

这个不是绝对的,看你使用的计算机,如果是64位,那么做如上处理就没问题了~~


总结

来自: java并发编程的艺术~

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

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

相关文章

用于鲁棒分割的矢量量化

文章目录 Vector Quantisation for Robust Segmentation摘要本文方法Quantisation for RobustnessPerturbation Bounds 实验结果 Vector Quantisation for Robust Segmentation 摘要 背景 医学领域中分割模型的可靠性取决于模型对输入空间中扰动的鲁棒性。鲁棒性是医学成像中…

读SQL进阶教程笔记16_SQL优化让SQL飞起来

1. 查询速度慢并不只是因为SQL语句本身&#xff0c;还可能是因为内存分配不佳、文件结构不合理等其他原因 1.1. 都是为了减少对硬盘的访问 2. 不同代码能够得出相同结果 2.1. 从理论上来说&#xff0c;得到相同结果的不同代码应该有相同的性能 2.2. 遗憾的是&#xff0c;查…

MySQL 高级语句

实验准备&#xff1a; 第一张表&#xff1a; create table location (Region char(20),Store_Name char(20)); insert into location values(East,Boston); insert into location values(East,New York); insert into location values(West,Los Angeles); insert into location…

基于html+css的图展示70

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

【3.0版本】用ChatGPT开发一个书籍推荐微信小程序(三)

文章目录 1 前言1.1 实现原理1.2 在小程序如何衔接1.3 技术架构 2 爬取数据2.1 根据书名爬取信息2.2 根据作者爬取信息2.3 根据类型爬取信息 3 讨论 1 前言 1.1 实现原理 万变不离其宗&#xff0c;还是相当于与ChatGPT交互问答&#xff0c;然后映射到小程序中&#xff0c;以下…

Linux -- 进程信号

文章目录 1. 信号量1.1 进程互斥概念1.2 认识信号量 2. 信号入门2.1 信号概念2.2 见一见2.3 signal()系统调用2.4 宏定义信号 3. 信号产生方式3.1 键盘产生信号3.2 系统调用产生信号3.3 软件条件产生信号3.4 硬件异常产生信号3.5 Core dump 4. 阻塞信号4.1 相关概念4.2 信号在内…

Raspberry Pi OS 2023-05-03 版本发布

导读树莓派 Raspberry Pi Foundation 今天发布了用于 Raspberry Pi 计算机的官方 Raspberry Pi OS 发行版新版本&#xff0c;带来了更新的组件、错误 Bug 修复和各种性能改进。 Raspberry Pi OS 2023-05-03 版本最大变化是内核从长期支持的 Linux 5.15 LTS 到长期支持的 Linux …

【为什么可以相信一个HTTPS网站】

解决信用&#xff0c;仅仅有加密和解密是不够的。加密解密解决的只是传输链路的安全问题&#xff0c;相当于两个人说话不被窃听。可以类比成你现在生活 的世界——货币的信用&#xff0c;是由政府在背后支撑的&#xff1b;购房贷款的信用&#xff0c;是由银行在背后支撑的&…

### Cause: dm.jdbc.driver.DMException: 列[URI]长度超出定义

### Cause: dm.jdbc.driver.DMException: 列[URI]长度超出定义 报错信息&#xff1a; ### Cause: dm.jdbc.driver.DMException: 列[URI]长度超出定义 ; 列[URI]长度超出定义; nested exception is dm.jdbc.driver.DMException: 列[URI]长度超出定义at org.springframework.jdb…

计算机毕业论文内容参考|基于Python的互联网金融产品交易平台的设计与实现

文章目录 导文摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析需求分析技术分析技术设计系统架构技术实现产品管理模块订单管理模块支付管理模块总结与展望导文 基于Python的互联网金融产品交易平台的设计与实现 摘要 本文提出并实现了一种基于Pytho…

《计算机网络—自顶向下方法》 Wireshark实验(六):IP 协议分析

IP 协议&#xff08;Internet Protocol&#xff09;&#xff0c;又译为网际协议或互联网协议&#xff0c;是用在 TCP/IP 协议簇中的网络层协议。主要功能是无连接数据报传送、数据报路由选择和差错控制。IP 协议是 TCP/IP 协议族的核心协议&#xff0c;其主要包含两个方面&…

Vue入门学习笔记:TodoList(三):实例中的数据、事件和方法

目录&#xff1a; Vue入门学习笔记&#xff1a;TodoList&#xff08;一&#xff09;&#xff1a;HelloWorld Vue入门学习笔记&#xff1a;TodoList&#xff08;二&#xff09;&#xff1a;挂载点、模板、实例 Vue入门学习笔记&#xff1a;TodoList&#xff08;三&#xff09;&a…

有关浪涌保护器的基础知识

浪涌和瞬态电压浪涌是电路上电压和电流的临时上升。它们的电压范围大于 2000 伏&#xff0c;电流范围大于 100 安培。典型的上升时间在1到10微秒范围内。瞬态或浪涌是最常见的电源问题&#xff0c;其瞬时破坏性会造成重大损坏&#xff0c;例如电气或电子设备故障、频繁停机、数…

MySQL正则表达式与存储过程

一、正则表达式&#xff08;REGEXP&#xff09; 1、正则表达式匹配符 字符解释举列^匹配文本的开始字符’ ^aa ’ 匹配以 aa 开头的字符串$匹配文本的结束字符’ aa$ ’ 匹配以aa结尾的字符串.匹配任何单个字符’ a.b 匹配任何a和b之间有一个字符的字符串*匹配零个或多个在它…

Webpack4 核心概念

文章目录 Webpack4 核心概念概述安装webpack简单使用配置webpack.config.js配置package.json打包 核心概念modeentry 和 outputentry配置说明output配置说明配置单入口配置多入口 loader安装babel、babel-loader、core-js配置.babelrc配置webpack.config.js配置package.json编写…

107.(cesium篇)cesium椎体上下跳动

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <html lang="en"> <

等保2.0常见问题汇总

等保2.0发布后&#xff0c;整个网络安全行业积极学习并按照新规范进行网络系统的部署。然而许多人仍然对等保制度的来历、发展、演变以及贯彻重点存在疑问。等保2.0依然在整个实施流程上由五个标准环节构成&#xff1a;定级、备案、建设整改、等级测评、监督检查五个方面。本文…

Science文章复现(Python):图1 - Aircraft obs(机载的观测 CO2)

之前有写过science文章后处理的复现Science文章复现&#xff08;Python&#xff09;&#xff1a;在机载观测中明显的强烈南大洋碳吸收 在这里是针对图细节的理解&#xff1a; 首先需要下载这个项目 https://github.com/NCAR/so-co2-airborne-obs 这里的环境配置会比较麻烦 con…

Java设计模式 13-命令模式

命令模式 一、智能生活项目需求 看一个具体的需求 1)我们买了一套智能家电&#xff0c;有照明灯、风扇、冰箱、洗衣机&#xff0c;我们只要在手机上安装 app 就可以控制对这些家电工作。 2)这些智能家电来自不同的厂家&#xff0c;我们不想针对每一种家电都安装一个 App&…

怎样实现RPC框架

随着微服务架构的盛行&#xff0c;远程调用成了开发微服务必不可少的能力&#xff0c;RPC 框架作为微服务体系的底层支撑&#xff0c;也成了日常开发的必备工具。当下&#xff0c;RPC 框架已经不仅是进行远程调用的基础工具&#xff0c;还需要提供路由、服务发现、负载均衡、容…