cpu缓存与并发

转自独立blog《Adrop的自留地

 

最近手头没什么需求,除了关注服务部署情况和机器负载之外,深入了解了并发编程的一些东西,了解习一些并发的底层技术,对之前了解的并发实现做了补充,记录并总结如下。

 

Disruptor框架

Java实现的一个并发处理框架,其核心是一个无锁、高效、基于数组实现的RingBuffer数据结构,可以在线程间交换数据,根据Martin Fowler的说法,处理能力可以达到600w tps,比Java中的LinkedBlockngQueue效率高很多

 

false cacheing和cache line padding,伪共享和缓存行填充

 

cache line是cpu加载主存数据到缓存中的最小单位,一般为64 bytes,假如head、tail为long类型的变量,cpu加载head从主存到缓存中时,由于head和tail在同一个缓存行,也被加载到缓存中。如果head变量在某个cpu内核被更新,数据被写回主存中,则其他cpu内核缓存的整个缓存行失效,需要重新从主存中读取。

 

带来的问题就是,如果只是想更新head值,但是因为tail和head在同一个缓存行中,tail也失效整个缓存行被同步到主存,由于缓存行数据变化而其他cpu内核的对应缓存行也会失效需要从主存中重新加载整个缓存行。只是更新head,但是导致tail也被写回主存和缓存失效。

 

更差的情况时,如果其他cpu内核也同时更新了tail,就会多次在多级缓存和主存之间来回同步数据,影响了cpu缓存性能,这就是伪共享。

 

如何避免伪共享?这就是缓存行填充(cahce line padding)。

引用译文来阐述:

image02

 

 

如下两图分别解释了缓存行和伪共享

image01

image00

 

 

cpu的缓存

L1/L2 cache是每个核心各自有一个,L3 cache是所有核心共享,主存也是共享。I5 CPU缓存如下:

image03

image04

参考

http://coolshell.cn/articles/9169.html

转载于:https://www.cnblogs.com/adrop/archive/2013/03/15/2962129.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值