并发框架Disruptor译文

  1. 剖析Disruptor:为什么会这么快?(一)锁的缺点
  2. 剖析Disruptor:为什么会这么快?(二)神奇的缓存行填充
  3. 剖析Disruptor:为什么会这么快?(三)伪共享
  4. 剖析Disruptor:为什么会这么快?(四)揭秘内存屏障

七个例子帮你更好地理解 CPU 缓存

缓存行

为了简化与RAM之间的通信,高速缓存控制器是针对数据块,而不是字节进行操作的。
从程序设计的角度讲,高速缓存其实就是一组称之为缓存行(cache line)的固定大小的数据块,其大小是以突发读或者突发写周期的大小为基础的。
每个高速缓存行完全是在一个突发读操作周期中进行填充或者下载的。
即使处理器只存取一个字节的存储器,高速缓存控制器也启动整个存取器访问周期并请求整个数据块。
缓存行第一个字节的地址总是突发周期尺寸的倍数。缓存行的起始位置总是与突发周期的开头保持一致。
现代处理器有专门的功能单元来执行加载和存储操作。
加载单元每个时钟周期只有启动一条加载操作;与加载操作一样,在大多数情况下,存储操作能够在完整流水线化的模式中工作,每个周期开始一条新的存储。

共享内存的并行计算,有可能会出现"伪共享"问题.

比如,两个处理器各要访问一个word,这两个word却存在于同一个cache line大小的区域里,
这时,从应用逻辑层面说,这两个处理器并没有共享内存,因为他们访问的是不同的内容(不同的word)。
但是因为cache line的存在和限制,这两个CPU要访问这两个不同的word时,却一定要访问同一个cache line块,产生了事实上的“共享”。
显然,由于cache line大小限制带来的这种“伪共享”是我们不想要的,会浪费系统资源。
05-11 22:17