CacheLine对齐
CacheLine
总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来
这样一次读取的一组数据就叫做CacheLine
,每一级缓存中都能放很多的CacheLine
多核CUP
- L1、L2、L3指一级缓存,二级缓存,三级缓存
- CUP中的每个核均可单独处理一个线程
- 每个核公用L3
超线程
一个核中有多套PC和Register
,他们公用一个ALU
,这样一个核可以处理多个线程
如四核八线程就由此而来
Volatile的可见性
x
被标记了volatile
- 两个线程运算时是将缓存中要被运算数所在的整条CacheLine复制到线程自己的存储,并进行运算,运算之后写回缓存
- 假设
线程1
修改了x
并写回,但是线程2
中的x
还是未修改的x
- 由于
x
被标记了volatile
,在线程1
写回x
缓存时,线程1
会通知线程2
重新读取缓存中的x
伪共享
线程1、2
公共使用同一个CacheLine
x、y
在同一个CacheLine
x、y
都是volatile
- 如果
线程1
不断修改x
,线程2
不断修改y
,那么修改的时候线程1
就要不断通知线程2
更新x
、线程2
就要不断通知线程1
更新y
- 这样的不断通知不断重新读取很浪费性能
- 这就叫伪共享
CacheLine对齐
多线程会有上面的伪共享的问题,如果在缓存读取数据到CacheLine
时,两个volatile
的数被读取到不同的CacheLine
中的话,就不需要一直通知另一个线程更新数据了,因为另一个线程根本没有这个数据
那么如何让两个数据一定在不同的CacheLine
呢,方法就是Cache Line对齐
一般一个CacheLine
是64
位,也就是8
个long
,我们可以把x
定义为long
,并同时定义7个没有用的long变量,这样这8
个数就在同一个CacheLine
中
之后再定义y
,y
自然也就在下一个CacheLine中了
这就叫CacheLine对齐,这样两线程就不会出现伪共享的现象了
CacheLine对齐相关推荐
- CPU高速缓存行对齐和代码优化
CacheLine 众所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine 两 ...
- 基于持久内存的 单机上亿(128B)QPS -- 持久化 k/v 存储引擎
文章目录 性能数据 设计背景 设计架构 Hash 索引结构 及 PMEM空间管理形态 基本API 及 实现 API 初始化流程 写流程 读流程 删除流程 PMEM Allocator设计 主要组件 空 ...
- 跟着Rocskdb 学 存储引擎:读写链路的代码极致优化
文章目录 1. 读链路 1.1 FileIndexer 1.1.1 LevelDB sst查找实现 1.1.2 Rocksdb FileIndexer实现 1.2 PinnableSlice 减少内存 ...
- 面经 cisco 2
1. cpu中的cache结构及cache一致性 一. 引子 在多线程环境中,经常会有一些计数操作,用来统计线上服务的一些qps.平均延时.error等.为了完成这些统计,可以实现一个多线程环境下的计 ...
- Linux kernel 3.10内核源码分析--slab原理及相关代码
1.基本原理 我们知道,Linux保护模式下,采用分页机制,内核中物理内存使用buddy system(伙伴系统)进行管理,管理的内存单元大小为一页,也就是说使用buddy system分配内存最少需 ...
- 深入理解Memory Order
深入理解Memory Order cpu 保证 cache 编程技术 lock-free wait-free Read–modify–write Compare-And-Swap(CAS) cas原理 ...
- 深入理解cache对写好代码至关重要
There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Ka ...
- nginx开发笔记_ngx_hash源码解析
ngx_hash源码解析 ngx_hash是nginx中的hash表结构,具有以下特点: 静态结构,hash表创建后无法动态添加/删除KV. 采用连续存储方式解决碰撞问题.即出现碰撞的KV存放在连续地 ...
- 高吞吐低时延日志系统需要注意的方面
可能需要注意的方面: 无锁化:CAS,内存屏障: TLS:pthread_key,__thread变量: CacheLine:数据结构的cacheline对齐: TSC寄存器:代替gettimeofd ...
最新文章
- Asp.net控件开发学习笔记(三)-控件开发基础
- Android 亲测源码分享
- 部分和问题 (dfs搜索 尺取)
- 【设计模式】依赖倒转原则
- Mysql迁移到Oracle方法
- win7 asp虚拟服务器,win7怎么利用ASP获取服务器IP地址 win7利用ASP获取服务器IP地址教程...
- rpm如何卸载mysql_Linux下卸载和安装MySQL[rpm包]
- 【ZOJ - 2836 】Number Puzzle (容斥原理)
- Linux操作Oracle(5)——Oracle11g 卸载OPatch安装补丁的方法【rollback已安装的补丁】及报错问题解决
- H3C交换机MAC VLAN原理及配置示例
- openstack instance bootmgr is missing 问题 修复
- 元胞自动机小团体matlab,元胞自动机matlab程序代码
- 如何获取Python字符串长度?
- 小米8的usb计算机连接不上,小米手机usb已连接电脑不显示怎么办
- vue-quill-editor 富文本 自定义图片上传操作
- 微信web开发者工具、网易云音乐、为知笔记等软件崩溃无法打开等问题的解决
- 聊聊如何在华为云IoT平台进行产品开发
- 华为、荣耀笔记本如何开启或关闭虚拟化技术(Virtual Technology)
- 原生JavaScript实现对象的完全深度拷贝
- OLED显示文字,字母,数字
热门文章
- Android 接口回调实例
- 在线markdown生成html,从markdown生成静态html页面的最简单的方法
- 关于使用burp suite后访问https页面出现“建立安全连接失败”问题的解决方法
- SLAM学习:DWA算法原理和编程实现(PYTHON)
- YOLOV3 模型训练及模型部署(YOLO动态链接库的封装和调用)
- 利用python PIL库进行图像模式的转换
- linux中MariaDB数据库保存中文成几个问号解决方法
- php风格goweb框架,go语言 web框架比较
- 大敌将至:互联网造车大逃杀 200亿都不够花
- 软件测试工程师是青春饭吗?已过32的测试老鸟带你分析:软件测试职业发展规划