CPU Notes

来源:互联网 发布:淘宝新店引流量 编辑:程序博客网 时间:2024/06/07 21:55
  • Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存,那么按照64B的缓存单位大小来算,这个一级缓存所能存放的缓存个数就是512/64 = 8个
    http://cenalulu.github.io/linux/all-about-cpu-cache/

  • 对于伪共享,我们在实际开发中该怎么做
    首先就是多次强调的,伪共享是很隐蔽的,我们暂时无法从系统层面上通过工具来探测伪共享事件。其次,不同类型的计算机具有不同的微架构(如 32 位系统和 64 位系统的 java 对象所占自己数就不一样),如果设计到跨平台的设计,那就更难以把握了,一个确切的填充方案只适用于一个特定的操作系统。还有,缓存的资源是有限的,如果填充会浪费珍贵的 cache 资源,并不适合大范围应用。最后,目前主流的 Intel 微架构 CPU 的 L1 缓存,已能够达到 80% 以上的命中率。
    综上所述,并不是每个系统都适合花大量精力去解决潜在的伪共享问题。
    http://www.cnblogs.com/cyfonly/p/5800758.html

  • CAS操作比单线程无锁慢了1个数量级;有锁且多线程并发的情况下,速度比单线程无锁慢3个数量级。可见无锁速度最快。
    单线程情况下,不加锁的性能 > CAS操作的性能 > 加锁的性能。
    在多线程情况下,为了保证线程安全,必须使用CAS或锁,这种情况下,CAS的性能超过锁的性能,前者大约是后者的8倍。
    CAS是CPU的一个指令,由CPU保证原子性
    disruptor在需要保证线程安全的地方,用到了CAS操作,这是一个CPU级别的指令,类似于乐观锁,即Campare and Set/Swap. JAVA 从1.5版本新引入了AtomicLong等支持CAS指令的数据结构。

  • Disruptor通过精巧的无锁设计实现了在高并发情形下的高性能。
    http://tech.meituan.com/disruptor.html
    Disruptor通过以下设计来解决队列速度慢的问题:

    • 环形数组结构
      为了避免垃圾回收,采用数组而非链表。同时,数组对处理器的缓存机制更加友好。
    • 元素位置定位
      数组长度2^n,通过位运算,加快定位的速度。下标采取递增的形式。不用担心index溢出的问题。index是long类型,即使100万QPS的处理速度,也需要30万年才能用完。
    • 无锁设计
      每个生产者或者消费者线程,会先申请可以操作的元素在数组中的位置,申请到之后,直接在该位置写入或者读取数据。
0 0
原创粉丝点击