java - 为什么 java8'annotation @Contened 使用 128 字节,这是大多数硬件上缓存行大小的两倍
问题描述
大多数硬件上的cacheline大小是64字节。</p>
我不知道为什么@Contened 在字段或对象之前和之后填充 128 个字节?
我已经尝试阅读以下两篇文章来缓解我的困惑。</p>
悲观地处理启用相邻缓存行预取器的情况
请注意,我们使用 128 字节,是大多数硬件上缓存行大小的两倍,以针对相邻扇区预取器进行调整,将错误共享冲突扩展到两个缓存行
他们都说使用 128 字节的原因是为了调整相邻扇区预取器,将错误共享冲突扩展到两个缓存行。</p>
但是启用相邻缓存行预取器的情况是什么?
解决方案
我通过阅读以下两篇文章解决了我的困惑
我总结了为什么使用 128 字节(两倍缓存线大小)来填充的两个原因
大多数现代主流处理器的缓存线大小是64字节或128字节。如果我们用64字节填充,这也会在缓存线大小为128字节的处理器中造成错误分片。
CPU Adjacent Sector Prefetch是 Intel 处理器特有的 BIOS 功能,启用此功能后,处理器会读取包含当前请求数据的缓存行,并预取下一个缓存行,预取可以同时占用两条缓存行,
由于这两个原因,我们必须将填充大小加倍。
推荐阅读
- python - “微秒”是 replace() 的无效关键字参数
- dashboard - Dash 未成功导入。确保当前目录中没有名为“dash.py”的文件
- google-sheets - 使用带有 ImportRange 的 Query 计算文本
- python - 在 Numpy 中将值填充到给定索引数组和值数组的数组中
- python - 使用正则表达式获取两个字符串之间的字符串
- amazon-ec2 - ec2启动实例策略云形成错误
- python - 同一日期当我尝试从 tweepy 获取推文时
- java - Java - 有一个长时间运行的方法返回它的执行状态
- oracle - TO_TIMESTAMP_TZ 忽略时区
- javascript - 官方角度谷歌地图组件不显示地图