boy-learning-thread | 1.1.3 内存屏障和CPU缓存

相关源码:boy-learning-thread
个人博客:http://bruce.bugmakers.club
内容来自《网易微专业 - 高性能编程章节》

CPU 性能优化手段 - 缓存

为了提高程序运行的性能,现代 CPU 在很多方面对程序进行了优化。

例如:CPU高速缓存。尽可能的避免处理器访问主内存的时间开销,处理器大多会利用缓存(cache)以提高性能。

CPU 多级缓存

L1 Cache 一级缓存:CPU 第一层高速缓存,分为数据缓存和指令缓存。一般服务器 CPU 的 L1 缓存的容量通常在 32~4096KB。

L2 由于 L1 级高速缓存容量的限制,为了再次提高 CPU 的运算速度,在 CPU 外部放置一高速存储器,即二级缓存。

L3 现在的都是内置的。而它的实际作用即是,L3 缓存的应用可以进一步降低内存延迟,同时提升大数据量计算时处理器的性能。具有较大 L3 缓存的处理器提供更有效的文件系统缓存行为及较短消息和处理器队列长度。一般是多核共享一个 L3 缓存!

cpu 在读取数据时,现在L1中寻找,再从L2中寻找,再从L3中寻找,然后是内存,再后是外存储器。

缓存同步协议

多 CPU 读取同样的数据进行缓存,进行不同的运算之后,最终写入主内存以哪个 CPU 为准?

在这种高速缓存回写的场景下,有一个缓存一致性协议多数 CPU 厂商对他进行了实现。

MESI 协议,他规定每条缓存有个状态位,同时定义了下面四个状态:

  • 修改态(Modified)——此 cache 行已被修改过(脏行),内容已不同于主存,为此 cache 专有;

  • 专有态(Exclusive)——此 cache 行内容同于主存,但不出现与其他 cache 中;

  • 共享态(Shared)——此 cache 行同于主存,但也出现于其他 cache 中;

  • 无效态(Invalid)——此 cache 行内容无效(空行)。

多处理器时,单个 CPU 对缓存中的数据进行了改动,需要通知给其他 CPU。
也就是意味着,CPU 处理要控制自己的读写操作,还要监听其他 CPU 发出的通知,从而保证最终一致。

CPU 性能优化手段 - 运行时指令重排

指令重排场景:当 CPU 写缓存时,发现缓存区块正在被其他 CPU 占用,为了提高 CPU 处理性能,可能将后面的读缓存命令优先执行。

并非随便重排,需要遵守 as-if-serial 语义。

as-if-serial 语义指的是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。
编译器,runtime 和处理器都必须遵守 as-if-serial 语义。也就是说,编译器和处理器不会对存在数据依赖关系的操作做重排序。

两个问题

1、CPU 高速缓存下,有一个问题:

缓存中的数据与主内存的数据并不是实时同步的,各 CPU (或 CPU 核心)间缓存的数据也不是实时同步。

在同一个时间点,各 CPU 所看到同一内存地址的数据的值可能是不一致的。

2、CPU 执行指令重排序优化下,有一个问题:

虽然遵守了 as-if-serial 语义,但仅在单 CPU 自己执行的情况下能保证结果正确。

多核多线程中,指令逻辑无法分辨因果关联,可能出现乱序执行,导致程序运行结果错误。

处理方式 —— 内存屏障

处理器提供了两个内存屏障指令(Memory Barrier)用于解决上述两个问题。

写内存屏障(Store Memory Barrier)

在指令后插入 Store Barrier,能让写入缓存中的最新数据更新写入主内存,让其他线程可见。

强制写入主内存,这种显示调用,CPU 就不会因为性能问题考虑而去对指令重排。

读内存屏障(Load Memory Barrier)

在指令前插入 Load Barrier,可以让高速缓存中的数据失效,强制重新从主内存中加载数据。

强制读取主内存内容,让 CPU 缓存与主内存保持一致,避免了缓存导致的一致性问题。

小结

本章节内容主要是对后续 JVM 线程安全问题做的铺垫。

同时,也看到了现代 CPU 不断演进,在程序运行优化中做出的努力。

不同 CPU 厂商所付出的人力物力成本,最终体现在不同 CPU 性能差距上。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,427评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,551评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,747评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,939评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,955评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,737评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,448评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,352评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,834评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,992评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,133评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,815评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,477评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,022评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,147评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,398评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,077评论 2 355

推荐阅读更多精彩内容