1. 多核处理器(SMP)系统中, 每一个处理器都有一个本地高速缓存。内存系统必须保证高速缓存的一致性。当不同处理器上的线程修改驻留再同一高速缓存中的变量时就会发生假共享(false sharing),结果导致高速缓存无效,并强制更新,进而影响系统性能。

    什么是假共享(false sharing)

    假共享是 SMP 系统上的一种常见性能问题。在SMP系统中,每个处理器均有一个高速缓存。 当不同处理器上的线程修改驻留在同一高速缓存行(Cache Block,或Cache Line)中的变量时就会发生假共享。 这种现象之所以被称为假共享,是因为每个线程并非真正共享相同变量的访问权。 访问同一变量或真正共享要求编程式同步结构,以确保有序的数据访问。

    线程 0 和线程 1 会用到不同变量,它们在内存中彼此相邻,并驻留在同一高速缓存块(Cache Block,或Cache Line)。 高速缓存行被加载到 CPU 0 和 CPU 1 的高速缓存中(灰色箭头)。 尽管这些线程修改的是不同变量(红色和蓝色箭头),高速缓存行(Cache Block,或Cache Line)仍会无效,并强制内存更新以维持高速缓存的一致性,这会降低应用性能

    避免False Sharing

    简单来说,就是用空间换时间,主动给struct填充一些字段,使它避免任意两个成员同时出现在同一个CacheLine中。

    golang示例

    • 未作优化的struct
    type noPad struct {a uint64b uint64c uint64
    }func (np *noPad)Increase() {// 原语:原子操作自增1,目的是避免自增操作被干扰atomic.AddUint64(&np.a, 1)atomic.AddUint64(&np.b, 1)atomic.AddUint64(&np.c, 1)
    }
    -----------------------------
    cpu: AMD Ryzen 7 5800H with Radeon Graphics
    BenchmarkNoPad_Increase
    BenchmarkNoPad_Increase-16      37386787            32.68 ns/op
    PASS
    
    • 在struct中使用匿名数组填充Cache Line,避免两个成员同时出现在同一个CacheLine中
    type Pad7 struct {a uint64_ [7]uint64b uint64_ [7]uint64c uint64_ [7]uint64
    }func (p *Pad7)Increase() {atomic.AddUint64(&p.a, 1)atomic.AddUint64(&p.b, 1)atomic.AddUint64(&p.c, 1)
    }
    ---------------------------
    cpu: AMD Ryzen 7 5800H with Radeon Graphics
    BenchmarkPad7_Increase
    BenchmarkPad7_Increase-16       65326725            18.37 ns/op
    PASS
    
    • 可以看到,对struct优化过的程序执行速度是未优化过的三倍还多,这个差距简直离谱。

    像上面案例中的Pad7,就是通过填充匿名数组,使得任意两个具名成员分别处在不同的CacheLine上。

    需要注意的是,这种机械处理方式仅仅针对特定的平台,比如CacheLine为64Byte的平台,要是跨平台,这样的处理很可能就是纯粹的浪费Cache。而且在当今的处理器中Cache的命中率已经非常高了,与其花大量的精力去解决False Sharing问题,不如优先专注于业务

  2. javascript:

    多核系统内存假共享问题相关推荐

    1. showdialog 尝试读取或写入受保护的内存_共享内存在不同系统的应用与优劣详解...

      共享内存是一种使计算机程序能够同时共享内存资源以实现更高性能和更少冗余数据副本的技术.共享系统内存可以在单处理器系统.并行多处理器或集群微处理器上运行.对于分布式系统会有一些差异,但共享内存也可以其上 ...

    2. linux共享内存变量 tiaojianbianliang,低压集抄系统中Linux共享内存使用分析

      1.   概述 Linux由于历史原因,其IPC分为SYSTEM V版本和POSIX版本.本文主要讨论在共享内存方面这两个版本之间的区别. 各共享内存IPC的函数对照表: IPC POSIX SYST ...

    3. Win10系统内存占用率太高的解决办法,怎么办?

      作者:1466 链接:https://www.zhihu.com/question/39716538/answer/883031599 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

    4. .NET 并行(多核)编程系列之七 共享数据问题和解决概述

      .NET 并行(多核)编程系列之七 共享数据问题和解决概述 原文:.NET 并行(多核)编程系列之七 共享数据问题和解决概述 .NET 并行(多核)编程系列之七 共享数据问题和解决概述 前言:之前的文 ...

    5. linux系统内存执行elf的多种方式

      一.前言 无文件(fileless)恶意软件攻击现在已经越来越流行,这一点并不奇怪,因为这种技术通常不会留下蛛丝马迹.本文的重点不是介绍如何在Windows RAM中执行程序,我们的目标是GNU/Li ...

    6. linux 观察应用使用内存的情况,Linux学习笔记:free和top命令查看系统内存使用情况...

      free 命令 Linux free 命令用于显示内存状态. free 指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等. 语法: free [-b ...

    7. system v和posix的共享内存对比 共享内存位置

      参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...

    8. 服务器无法通过系统非页面共享区来进行分配,因为共享区当前是空的解决办法.供参考....

      服务器无法通过系统非页面共享区来进行分配,因为共享区当前是空的. 非页面共享区是空的,通过优化内存管理器,使它在更早的时间(比如当它达到 40% 时)开始修整过程,在突发的高峰使用期间就可以满足页面缓 ...

    9. c++ fork 进程时 共享内存_linux共享内存mmap

      Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...

    最新文章

    1. TensorFlow实现多层感知机MINIST分类
    2. Ubuntu16.04下使用ufw保护docker容器
    3. android摄像头代码,Android摄像头
    4. c函数scanf(),printf()等常用格式字符串
    5. 【华为云技术分享】《跟唐老师学习云网络》— Ping喂报文
    6. python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...
    7. [禅悟人生]谦虚有助于自我消融
    8. jdeveloper12.1.3的安装与卸载
    9. Java 二叉树层次遍历
    10. android vpn 工具下载,豌豆荚塑造安卓应用墙 App下载量破20万
    11. 如何提高芝麻信用分?解读芝麻信用是怎么做的
    12. 【C】狐狸找兔子问题
    13. 扫码点餐系统可以免费使用了
    14. ANSYS预紧力螺栓连接结构(—HyperMesh添加预压力单元)
    15. JavaFX应用程序图标
    16. RN(React Native)
    17. 【CV系列】颜色恒常性理论及应用
    18. 恶搞版西游记,99%的人看完后当场含笑而死
    19. SVM——传说中的核技巧
    20. 金蝶导出明细账到计算机桌面,怎么用金蝶将所有科目的明细账导到一张表格上?...

    热门文章

    1. SM3加密与解密校验
    2. 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...
    3. 计算机专业毕业生怎么写毕业设计开题报告?
    4. H5 div 居中显示
    5. CAD增加线型(网页版)
    6. ffmpeg 使用filter_complex,colorkey和vn
    7. 《Network In Network》翻译
    8. axios 发送 x-www-form-urlencoded 请求
    9. 微软发布了 97 个漏洞的补丁,包括主动勒索软件漏洞
    10. echart移上去显示内容_echarts 使用formatter 修改鼠标悬浮事件信息操作