作者: sy8111 (1 篇文章) 日期: 二月 26, 2010 在 11:39 下午

1. 背景介绍

首先简单说一下计算机中处理器-内存体系结构。由于CPU速度远大于内存访问速度,现代CPU设计中都引入了缓存(cache)作为CPU和内存两者之间交流的缓冲中介。缓存的速度也介于两者之间。缓存中存放了最经常被访问的内存数据,CPU在很大程度上只需要访问高速缓存,大大提高了系统性能。系统对缓存进行读写的单位被称作缓存行(cache line)。大家知道系统对内存的操作单位一般是word,如果对缓存操作也用word作单位,就显得太小,缺乏效率,因此一般cache line大概是8个word,这是缓存与内存沟通的最小单位。

在可以预见的几年内,计算机系统会逐渐向多核心CPU或者多CPU结构过渡,出现多个处理核心共享内存的局面。一个很自然的问题马上出现,那就是多个处理核心对单一内存资源的访问冲突。这个冲突本来不难解决,只要给内存访问加锁就可以了。但是,当把缓存纳入考虑范围时,情况就复杂了。缓存是集成在每个CPU内部的小内存,除了这个CPU,其他CPU不能访问。而按照单CPU系统的简单缓存设计,缓存并不能察觉除本CPU以外的外部因素对内存内容的修改。因此,假设出现下面的情况:处理器A将内存中某块内容C读入自己的缓存,并在缓存中修改了该内容,然后处理器B也将内存中这块内容C读入自己的缓存,那么,B看到的只是原始版本的内容,而看不到存在于A缓存中的更新的内容,这就产生了内容不一致的问题。多处理器系统一般是设计控制协议来协调各个CPU缓存读写,保证内容一致,以解决这种冲突。

2. 伪共享

顾名思义,“伪共享”就是“其实不是共享”。那什么是“共享”?多CPU同时访问同一块内存区域就是“共享”,就会产生冲突,需要控制协议来协调访问。会引起“共享”的最小内存区域大小就是一个cache line。因此,当两个以上CPU都要访问同一个cache line大小的内存区域时,就会引起冲突,这种情况就叫“共享”。但是,这种情况里面又包含了“其实不是共享”的“伪共享”情况。比如,两个处理器各要访问一个word,这两个word却存在于同一个cache line大小的区域里,这时,从应用逻辑层面说,这两个处理器并没有共享内存,因为他们访问的是不同的内容(不同的word)。但是因为cache line的存在和限制,这两个CPU要访问这两个不同的word时,却一定要访问同一个cache line块,产生了事实上的“共享”。显然,由于cache line大小限制带来的这种“伪共享”是我们不想要的,会浪费系统资源。

举例来说,当多进程程序操作同一个int型数组int a[100]时,如果进程0只访问a[0],进程1只访问a[1],进程2只访问a[2],... 那么,实际上每个进程不应该发生数据共享。但是,一般cache line可以包含几个int,因此访问同一个cache line内int数组元素的几个进程就需要系统花费额外资源和时间运用控制协议来协调,这是不必要的。在这种情况下,把每个数组元素单独放在一个cache line大小的内存区域里在时间上是最有效率的,然而空间上就变成最没效率的了。

计算机设计就是处理矛盾的艺术

原文出处:http://software.intel.com/zh-cn/blogs/2010/02/26/false-sharing/

多处理器系统下的伪共享(false sharing)问题相关推荐

  1. 从缓存行出发理解volatile变量、伪共享False sharing、disruptor

    volatile关键字 当变量被某个线程A修改值之后,其它线程比如B若读取此变量的话,立刻可以看到原来线程A修改后的值 注:普通变量与volatile变量的区别是volatile的特殊规则保证了新值能 ...

  2. 伪共享(False Sharing)

    原文地址:http://ifeve.com/false-sharing/ 作者:Martin Thompson  译者:丁一 缓存系统中是以缓存行(cache line)为单位存储的.缓存行是2的整数 ...

  3. 从Java视角理解伪共享(False Sharing)

    从我的前一篇博文中, 我们知道了CPU缓存及缓存行的概念, 同时用一个例子说明了编写单线程Java代码时应该注意的问题. 下面我们讨论更为复杂, 而且更符合现实情况的多核编程时将会碰到的问题. 这些问 ...

  4. @sun.misc.Contended避免伪共享(false sharing)

    转载自:http://www.myexception.cn/program/1630142.html Java8中使用sun.misc.Contended注解来避免伪共享(false sharing) ...

  5. Java8中用sun.misc.Contended避免伪共享(false sharing)

    转自:http://budairenqin.iteye.com/blog/2048257 关于伪共享这个概念,请先参照http://ifeve.com/falsesharing/ 伪共享的样子: Ja ...

  6. C语言多线程教程(pthread)(线程创建pthread_t,指定线程run方法pthread_create,加mutex锁,解锁,伪共享 false sharing【假共享】)

    [C语言]多线程程序入门教程 文章目录 查看pthread_create()函数文档 · Demo1 单线程(创建线程pthread_t .创建线程run方法pthread_create) · Dem ...

  7. 好理解的Java内存虚假共享(False Sharing)性能损耗以及解决方案

    虚假共享(False Sharing)也有人翻译为伪共享 参考 https://en.wikipedia.org/wiki/False_sharing 在计算机科学中,虚假共享是一种性能降低的使用模式 ...

  8. Mac OS X系统下修改wifi共享的默认网段

    Mac OS X系统下修改wifi共享的默认网段 Mac OS X的wifi共享功能(internet sharing)的默认网段是192.168.2.0/24,这个网段比较常用,容易冲突.本文提供的 ...

  9. CPU Cache下的伪共享和缓存行

    本文转载自https://blog.csdn.net/karamos/article/details/80126704 认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存 ...

  10. Windows系统下查看已共享的文件夹的方法

    电脑使用时间比较长,共享过好几次文件夹,现在想取消共享,但共享文件夹的路径隐藏得太深,要怎么样才能快速找到共享文件夹的实际路径呢?" "其实现在单位常见的方法都是用网上邻居的共享文 ...

最新文章

  1. NLP专栏|图解 BERT 预训练模型!
  2. 嵌入式编程与c语言有何区别,有的嵌入式设备也提供C++编译器,那还有理由坚持使用C语言吗?...
  3. Java消息服务思维导图笔记
  4. java方法调用的格式_Java基础(一)---方法的调用
  5. python加法例子_第二讲 做加法的例子
  6. SQL Server2005的XML数据类型之基础篇 (4)
  7. linux删除一个目录下的所有空文件
  8. DEM数字高程数据之高程网格格式转换
  9. 21世纪将淘汰的八种人
  10. 非科班无实习如何入职腾讯?后台开发岗个人校招学习路线分享!
  11. pytracking系列跟踪算法的配置(LWL, KYS, PrDiMP, DiMP and ATOM Trackers)(windows10版本)
  12. python两个csv表数据合并_python 如何把两个表格数据,合并为一个呢?
  13. 图像加密-安全性分析
  14. 关于互联网流量劫持分析及可选的解决方案
  15. java applet编程_JavaApplet编程技巧
  16. 纺织服装业如何利用技术进行数字化转型
  17. 2021-07-24博物馆展览馆应用蓝牙AOA高精度定位导航导览的真实商用案例介绍
  18. 谷歌浏览器和火狐浏览器的12px字体显示大小不一样
  19. xmlHttp.send(null)与xmlHttp.send…
  20. 【编译原理系列】词法分析与有限自动机

热门文章

  1. Luogu1712 [NOI2016] 区间
  2. 记录开发过程中第一次遇到的回调地狱
  3. 天体运行轨迹_都说运动是天体的基本特性,那么银河系是绕着什么运动的呢?...
  4. 群晖 上传 源文件不存在_群晖NAS配多大容量硬盘合适?
  5. python生成wifi字典_用Python自带的itertools生成穷举字典
  6. python能编译成exe文件吗_python编译成exe文件
  7. java 文件夹不存在则创建_java判断文件不存在就创建的方法
  8. StanfordDB class自学笔记 (12) Constraints and Triggers
  9. java web打印 闪退_tomcat闪退解决方案
  10. 汇编语言·易遗忘知识点汇总ing