当前位置: 首页 > wzjs >正文

广东两学一做考试网站长春建设招标网

广东两学一做考试网站,长春建设招标网,wordpress加载变慢,怎么花最少的钱做网站文章目录 1 什么是伪共享?2 为什么对齐?3 伪共享的实际影响4 为什么必须是 64 字节?5 其他替代方案6 验证对齐效果总结 1 什么是伪共享? 伪共享是 多线程编程中的一种性能问题,其本质是: 缓存行&#xff…

文章目录

    • 1 什么是伪共享?
    • 2 为什么对齐?
    • 3 伪共享的实际影响
    • 4 为什么必须是 64 字节?
    • 5 其他替代方案
    • 6 验证对齐效果
    • 总结

1 什么是伪共享?

伪共享是 多线程编程中的一种性能问题,其本质是:

  • 缓存行(Cache Line):现代 CPU 的缓存以固定大小的块(缓存行)为单位管理数据,常见缓存行大小为 64 字节(如 x86/x64 CPU)。
  • 共享缓存行:如果两个独立的变量(如 _bottom_top)位于同一个缓存行中,即使它们被不同线程访问(如一个线程写 _bottom,另一个线程读 _top),也会导致缓存行被频繁标记为“无效”(Cache Invalidation)。
  • 性能损失:频繁的缓存同步(从 L1/L2 缓存到主存)会显著降低程序性能。

避免伪共享(False Sharing),从而提升多线程程序的性能


2 为什么对齐?

以64字节对齐为例:
通过 alignas(64) 强制变量对齐到 64 字节边界,可以确保:

  • 独占缓存行:每个变量(如 _bottom_top)独占一个完整的缓存行(64 字节),避免与其他变量共享。
  • 隔离修改:当一个线程修改 _bottom 时,不会触发其他线程中 _top 所在缓存行的无效化,反之亦然。

示例内存布局:

// 未对齐时(伪共享)
Cache Line 0: | _bottom (8 bytes) | _top (8 bytes) | ...(剩余 48 字节)|// 对齐到 64 字节后(避免伪共享)
Cache Line 0: | _bottom (8 bytes) | padding (56 bytes)            |
Cache Line 1: | _top (8 bytes)    | padding (56 bytes)            |

32 位 ARM 系统中,为了避免伪共享(False Sharing),通常建议的对齐大小为 32 字节64 字节,具体取决于目标处理器的缓存行(Cache Line)大小。

  1. ARM 系统的缓存行大小
    32 位 ARM 处理器的缓存行大小因架构和型号而异:
  • 较旧 ARMv6/ARMv7 处理器(如 Cortex-A8/A9)通常使用 32 字节 的缓存行。
  • 较新 ARMv7/ARMv8 处理器(如 Cortex-A53/A72)可能采用 64 字节 的缓存行(与 x86/x64 对齐)。

具体需查阅目标 CPU 的文档(如 Technical Reference Manual)确认。

  1. 对齐建议
  • 通用保守方案:32 字节对齐
    若不确定目标处理器的缓存行大小,可保守对齐到 32 字节(覆盖旧型号的 32 字节缓存行):
alignas(32) std::atomic<size_t> _bottom;
alignas(32) std::atomic<size_t> _top;
  • 针对新型号:64 字节对齐
    若目标处理器为较新的 ARMv8 或已知缓存行为 64 字节(如部分 Cortex-A 系列),可直接对齐到 64 字节
alignas(64) std::atomic<size_t> _bottom;
alignas(64) std::atomic<size_t> _top;
  • C++17 自适应方案
    若支持 C++17,使用 std::hardware_destructive_interference_size 自动适配缓存行大小:
#include <new>
alignas(std::hardware_destructive_interference_size) std::atomic<size_t> _bottom;
alignas(std::hardware_destructive_interference_size) std::atomic<size_t> _top;

  1. 验证对齐效果
    通过代码检查变量地址是否为对齐值的整数倍:
#include <iostream>
#include <cstdint>int main() {alignas(32) std::atomic<size_t> _bottom;alignas(32) std::atomic<size_t> _top;// 检查对齐是否成功auto check_alignment = [](const auto& var, size_t alignment) {uintptr_t addr = reinterpret_cast<uintptr_t>(&var);return (addr % alignment == 0) ? "Success" : "Failed";};std::cout << "_bottom 对齐 32: " << check_alignment(_bottom, 32) << "\n";std::cout << "_top 对齐 32: " << check_alignment(_top, 32) << "\n";return 0;
}
  1. 实际性能对比
场景32 字节缓存行(对齐 32)64 字节缓存行(对齐 64)未对齐(伪共享)
线程竞争开销低(若缓存行为 64)高(频繁缓存失效)
内存占用略高(填充空间)更高(填充空间)

  1. 适用场景总结
  • 嵌入式/IoT 设备(旧款 ARMv6/v7):优先对齐 32 字节
  • 高性能 ARM 处理器(如 Cortex-A72):对齐 64 字节
  • 跨平台代码:使用 C++17 的 std::hardware_destructive_interference_size

32 位 ARM 系统中,若无明确缓存行信息,默认对齐到 32 字节是安全选择。
若针对新型处理器或已知缓存行为 64 字节,则对齐到 64 字节。通过合理对齐,可显著减少伪共享带来的性能损失。

3 伪共享的实际影响

假设 _bottom_top 是一个无锁队列的头尾指针:

  • 线程 A 频繁修改 _bottom(入队操作)。
  • 线程 B 频繁修改 _top(出队操作)。
  • 如果它们共享同一个缓存行,每次修改都会导致对方线程的缓存失效,性能可能下降 数倍甚至数十倍

通过对齐到 64 字节,两者的修改完全隔离,避免不必要的缓存同步。


4 为什么必须是 64 字节?

  • 缓存行大小:x86/x64 CPU 的缓存行大小通常为 64 字节,ARM 架构也普遍采用 64 字节。对齐到缓存行大小是最直接的方法。
  • 兼容性:即使某些 CPU 的缓存行更小(如 32 字节),对齐到 64 字节也能覆盖所有常见情况。

5 其他替代方案

  1. 填充字节(Padding)
    手动在变量间插入填充数据,强制隔离:
struct AlignedData {std::atomic<size_t> _bottom;char padding[64 - sizeof(std::atomic<size_t>)];std::atomic<size_t> _top;
};
  • 缺点:需手动计算填充大小,不够灵活。
  1. C++17 std::hardware_destructive_interference_size
    C++17 提供了表示缓存行大小的常量:
#include <new>
alignas(std::hardware_destructive_interference_size) std::atomic<size_t> _bottom;
alignas(std::hardware_destructive_interference_size) std::atomic<size_t> _top;
  • 优点:代码可移植,自动适配不同平台的缓存行大小。
  • 缺点:需要 C++17 支持。

6 验证对齐效果

可以通过以下方式验证变量是否对齐到 64 字节:

#include <iostream>
#include <cstdint>int main() {alignas(64) std::atomic<size_t> _bottom;alignas(64) std::atomic<size_t> _top;// 检查地址是否为 64 的倍数std::cout << "Address of _bottom: " << &_bottom << " (aligned: "<< ((reinterpret_cast<uintptr_t>(&_bottom) % 64 == 0) << ")\n";std::cout << "Address of _top: " << &_top << " (aligned: "<< ((reinterpret_cast<uintptr_t>(&_top) % 64 == 0) << ")\n";return 0;
}

总结

  • 对齐到 64 字节:通过独占缓存行,避免 _bottom_top 之间的伪共享。
  • 适用场景:高频并发访问的原子变量(如无锁数据结构、计数器等)。
  • 推荐方法:优先使用 alignas(64) 或 C++17 的 std::hardware_destructive_interference_size

文章转载自:

http://cz4ppkcw.xrftt.cn
http://8PDjJK4D.xrftt.cn
http://QipWwaHv.xrftt.cn
http://fnjMroGR.xrftt.cn
http://fzmKz2Ri.xrftt.cn
http://dQPnsrXl.xrftt.cn
http://TNQmOpDn.xrftt.cn
http://Pn2Kc15x.xrftt.cn
http://7UAG291x.xrftt.cn
http://ZopD1Jyb.xrftt.cn
http://Krctv23Q.xrftt.cn
http://dCBxpxfy.xrftt.cn
http://aRf6fy4h.xrftt.cn
http://Sou5kYUX.xrftt.cn
http://PXZTtO9o.xrftt.cn
http://qxIK349B.xrftt.cn
http://7IhyhiSD.xrftt.cn
http://BogQURPV.xrftt.cn
http://8uTXLyAH.xrftt.cn
http://RRz7LO6q.xrftt.cn
http://CYIlueQN.xrftt.cn
http://sdTLSGOu.xrftt.cn
http://e8vruDJx.xrftt.cn
http://75btXYO6.xrftt.cn
http://c7vxphvp.xrftt.cn
http://sACcZMaF.xrftt.cn
http://vgUg4Gwa.xrftt.cn
http://GrZAOYXQ.xrftt.cn
http://ua5QHuLl.xrftt.cn
http://p0PhmweX.xrftt.cn
http://www.dtcms.com/wzjs/695270.html

相关文章:

  • 张家界seo网站优化背景墙图片2023新款
  • 外边做一个网站要多少钱山东省住房建设厅网站首页
  • 网站建设职业规划廊坊哪里有制作手机网站的
  • 梧州网站建设the7企业中英文wordpress模板
  • 怎么给客户推广自己的产品简述seo的基本步骤
  • 聊城做网站推广哪家好淘宝客网站建好了没有数据库
  • 网站推广苏州无限观影次数的app软件
  • 网站怎样建设才叫人性化成都定制网站建
  • 网站首页做很多个关键词网站前台右侧怎么做二维码
  • 广告型网站怎么更换wordpress主题
  • 网站备案流程是什么商城平台网站开发深圳
  • 做这种灰色的网站犯法厦门地税网站建设
  • 网站流量图怎么做的外网设计网站
  • 免费网站收录拍个宣传片大概要多少钱
  • 淘宝做网站的如何做网站域名
  • 手机网站后台管理系统计算机网络技术是干什么的
  • seo网站编辑蜗牛星际做网站
  • 无网站做cpa教育网站制作软件
  • 上海公司建立网站网站退出率
  • 网站方案书建设家具网站的目的及功能定位
  • 鲜花品牌网站建设百度域名是多少
  • 网站备案的服务器租用万网域名优惠口令
  • 网站公司建站福州网站设计服务
  • 网站开发有哪些新技术seochan是什么意思
  • 淘宝网站推广策略大气 网站模板
  • 广州城市建设规划局网站北京开发网站建设
  • 做文字云的网站wordpress 悬浮 插件
  • 网站如何做静态化企业网站建设原因
  • 箱包东莞网站建设wordpress分级菜单显示
  • 建设报名系统是正规网站吗网页顶部导航栏