SlideShare a Scribd company logo
了解CPU



        作者:周忱 | 淘宝综合业务
        微博:@MinZhou
        邮箱:zhouchen.zm@taobao.com
为什么Java程序员也需要了解CPU




                         关于我
 •   花名:周忱(chén)
 •   真名:周敏
 •   微博: @MinZhou
 •   Twitter: @minzhou
 •   2010年6月加入淘宝
 •   曾经淘宝Hadoop&Hive研发
     组Leader
 •   目前专注分布式实时计算
 •   Hive Contributor
 •   自由、开源软件热爱者




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                         关于我
 •   花名:周忱(chén)
 •   真名:周敏
 •   微博: @MinZhou
 •   Twitter: @minzhou
 •   2010年6月加入淘宝
 •   曾经淘宝Hadoop&Hive研发
     组Leader
 •   目前专注分布式实时计算
 •   Hive Contributor
 •   自由、开源软件热爱者




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                 什么是volatile?




                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                  Puzzle 1
  下面哪个程序跑得更快?

    private static long value;         private static volatile long value;

    public static void increment() {   public static void increment() {
      while (value < 100000000L) {       while (value < 100000000L) {
        value++;                           value++;
      }                                  }
    }                                  }



                                         如果换成AtomicLong呢?

                                                            Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                     Puzzle 2
   下面哪个程序跑得更快?

AtomicIntegerFieldUpdater state = …          AtomicIntegerFieldUpdater state= …

public void lock() {                         public void lock() {
  while(state.getAndSet(true)) {} ; //spin     while (true) {
}                                                while(state.get()) {}; //spin
                                                 if(!state.getAndSet(true))
                                                    return;
                                               }
                                             }

                                                      如果换成多线程呢?

                                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




           Intel 十年计划:Tick-Tock




                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                         CPU微架构变革
•   Hyper-threading
•   32KB L1d 与32KB L1i
•   256KB L2 Cache
•   4–12 MB L3 cache
•   QPI 代替FSB
•   PCI E和DMI整合入
    处理器, 北桥消失
•   支持 2/3通道DDR3




                                    Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                现代CPU微架构




                           Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




              Intel Nehalem 排布




                                 Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU



               Intel Sandy Bridge




                                    Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                      Puzzle 3
   下面哪个程序跑得更快?

 private static long[][] longs;              private static long[][] longs;

 for (int i = 0; i < DIMENSION_1; i++) {     for (int j = 0; j < DIMENSION_2; j++) {
   for (int j = 0; j < DIMENSION_2; j++) {     for (int i = 0; i < DIMENSION_1; i++){
       sum += longs[i][j];                         sum += longs[i][j];
    }                                           }
 }                                           }




                                                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU



                            CPU Cache




   cat /sys/devices/system/cpu/cpu0/cache/index0/*
                                                     Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




           Cache Coherence & MESI协议
  •   M: 修改
  •   E : 独占
  •   S : 共享
  •   I : 失效




  发音: messy




                               Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                        Puzzle 4
   下面程序有什么问题?
 public final static class VolatileLong {    longs = new VolatileLong[NUM_THREADS];
   public volatile long value = 0L;          for (int i = 0; i < longs.length; i++) {
 }                                              longs[i] = new VolatileLong();
                                             }
 public class FS implements Runnable {       // 每个线程更新独立的变量
   public void run() {                       for (int i = 0; i < NUM_THREADS; i++) {
     long i = ITERATIONS + 1;                   threads[i] = new Thread(new FS(i)));
     while (0 != --i) {                      }
        longs[arrayIndex].value = i;        for (Thread t : threads) {
     }                                          t.start();
   }                                         }
 }                                          for (Thread t : threads) {
                                                t.join();
                                             }
                                                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     False Sharing
                            public final static class VolatileLong {
                              public volatile long value = 0L;
                            }


                            =>

                            public final static class VolatileLong {
                              public volatile long value = 0L;
                              public long p1, p2, p3, p4, p5, p6;
                            }




                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




         Cache Consistency & 乱序执行
  •   CPU指令重排序




  •   编译重排序




                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                 Memory Ordering
  •   程序顺序(Program ordering): 读写和指令编制一致, 也称强顺序.
  •   处理器顺序(Processor ordering): 加快指令执行速度, 例如读可跨越它之前
      的buffered写

  •   Intel386及之前内存顺序模型: 程序顺序
  •   Pentium和Intel486内存顺序模型:大多数情况下遵循程序顺序
  •   P6及以后内存顺序模型:处理器顺序, 同时提供其它加强或弱化内存顺序
      模型的特殊指令




                                         Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     内存屏障
  •   Load Buffer
  •   Store Buffer
  •   CPU串行化指令
       – CPUID
       – SFENCE
       – LFENCE
       – MFENCE
  •   Lock系指令




                            Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                        Java内存模型
  •   Happens-Before       // Lock
  •   StoreStore          pthread_mutex_lock(&lock);
  •   LoadStore           sequence = i;
                          pthread_cond_signal(&condition);
  •   StoreLoad
                          pthread_mutex_unlock(&lock);
  •   LoadLoad
  •   Full Fence          // Soft Barrier
  •   锁和synchronized块     asm volatile(“” ::: “memory”);
  •   volatile 关键字        sequence = i;
  •   final 关键字
                          // Fence
                          asm volatile(“” ::: “memory”);
                          sequence = i;
                          asm volatile(“lock addl $0x0,(%rsp)”);

                                                      Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                     Java内存模型
                                           需要内存屏
  重排序                次操作                                                           次操作
                                             障
            Normal   Volatile   Volatile                                            Volatile
            Load     Load       Store                       Normal     Normal       Load         Volatile
 首操作                                       首操作
            Normal   Monitor    Monitor                     Load       Store        MonitorEnt   Store
                                                                                    er
            Store    Enter      Exit
 Normal                                    Normal Load                                           LoadStore
 Load
                                No
 Normal                                    Normal Store                                          StoreStore
 Store
 Volatile
 Load                                      Volatile Load
            No       No         No                          LoadLoad   LoadStore    LoadLoad     LoadStore
                                           MonitorEnter
 Monitor
 Enter
 Volatile
 store                                     Volatile Store
                     No         No                                                  StoreLoad    StoreStore
 Monitor                                   MonitorExit
 Exit

                                                                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                           Example
1. class X {                   $ java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=hsdis-print-bytes -
2.   int a, b;                 XX:CompileCommand=print,X.f X
3.   volatile int v, u;
4.   void f() {                …
5.     int i, j;
6.
7.     i = a; // load a
                               [Verified Entry Point]
8.     j = b; // load b         0xb3a1e28c: push %ebp ;...55
9.     i = v; // load v         0xb3a1e28d: sub $0x8,%esp ;...81ec0800 0000
10.            // LoadLoad      0xb3a1e293: mov 0x10(%ecx),%ebx ;...8b5910 ; i = v
11.    j = u; // load u         0xb3a1e296: mov 0x14(%ecx),%edi ;...8b7914 ; j = u
12.            // LoadStore     0xb3a1e299: mov %ebx,0x8(%ecx) ;...895908 ; a = i
13.    a = i; // store a        0xb3a1e29c: mov %edi,0xc(%ecx) ;...89790c      ;b=j
14.    b = j; // store b        0xb3a1e29f: mov %ebx,0x10(%ecx) ;...895910 ; v = i
15.            // StoreStore    0xb3a1e2a2: mov %edi,0x14(%ecx) ;...897914 ; u = j
16.    v = i; // store v        0xb3a1e2a5: lock addl $0x0,(%esp) ;...f0830424 ; memory barrier
17.            // StoreStore
                                0xb3a1e2aa: mov 0x14(%ecx),%ebp ;...8b6914 ; i = u
18.    u = j; // store u
19.            // StoreLoad
                                0xb3a1e2ad: mov %ebp,0x8(%ecx) ;...896908 ; a = i
20.    i = u; // load u         0xb3a1e2b0: add $0x8,%esp ;...83c408
21.            // LoadLoad      0xb3a1e2b3: pop %ebp ;...5d
22.            // LoadStore     0xb3a1e2b4: test %eax,0xb78ab000 ;...850500b0 8ab7
23.    j = b; // load b
24.    a = i; // store a       …
25. }
26.}
                               参考: jdk/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp
                                                                                       Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                        Puzzle 5


  为什么有volatile还需要AtomicXX及
  Unsafe.compareAndSwapXX?




                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                            原子指令
  •   CompareAndSwap: LOCK XCHG
  •   LOCK XADD
  •   ABA问题




                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                       让步锁

 public class BackoffLock {                   if (!state.getAndSet(true)) {
  private AtomicBoolean state = new                  return;
 AtomicBoolean(false);                             } else {
  private static final int MIN_DELAY = ...;          backoff.backoff();
  private static final int MAX_DELAY = ...;        }
                                                 }
  public void lock() {                         }
   Backoff backoff = new Backoff(MIN_DELAY,
 MAX_DELAY);                                      public void unlock() {
   while (true) {                                   state.set(false);
    while (state.get()) {};                       }

                                              }

                                                                  Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                                   队列锁
  •   BackOff锁的问题
       – Cache-coherence Traffic
       – 临界区利用率
       – 公平性问题
       – 饥饿
  •   基于数组的队列
  •   CLH队列
  •   MCS队列
  •   NUMA-Aware变种




                    https://blogs.oracle.com/dave/entry/flat_combining_numa_locks
                                                             Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     Puzzle 6


     为什么j.u.c或者jvm里面在加锁的时候, 喜欢用先
     CAS spin尝试N次, 如果失败则yield多次(可选), 如果
     最后还是失败则park, 同时把线程加到队列里?




                                Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                              工具
   •   top
   •   vmstat
   •   lscpu
   •   perf
   •   Valgrind tools suite
   •   OProfile
   •   SystemTap
   •   numactl
   •   Intel Vtune
   •   MAT


                                   Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                             推荐读物
   •   What every programmer should know about memory
   •   Intel® 64 and IA-32 Architectures Software Developer Manuals
   •   The Art of Multiprocessor Programming
   •   The JSR-133 Cookbook for Compiler Writers (Java Memory Model)
   •   本人博客: http://coderplay.javaeye.com




                                                       Taobao Java Team | zhouchen.zm
为什么Java程序员也需要了解CPU




                     Q&A




                           作者:周忱 | 淘宝综合业务
                           微博:@MinZhou
                           邮箱:zhouchen.zm@taobao.com



                                   Taobao Java Team | zhouchen.zm
Ad

Recommended

Btrace intro(撒迦)
Btrace intro(撒迦)
ykdsg
 
JVM内容管理和垃圾回收
JVM内容管理和垃圾回收
Tony Deng
 
Android开发基础
Android开发基础
ykdsg
 
为啥别读HotSpot VM的源码(2012-03-03)
为啥别读HotSpot VM的源码(2012-03-03)
Kris Mok
 
Ali-tomcat
Ali-tomcat
wang hongjiang
 
Jvm内存管理基础
Jvm内存管理基础
wang hongjiang
 
Java Crash分析(2012-05-10)
Java Crash分析(2012-05-10)
Kris Mok
 
Java trouble shooting
Java trouble shooting
Min Zhou
 
Exodus2 大局观
Exodus2 大局观
wang hongjiang
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
wang hongjiang
 
Aswan&hump
Aswan&hump
wang hongjiang
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closures
wang hongjiang
 
IOS入门分享
IOS入门分享
zenyuhao
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查
bluedavy lin
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
wang hongjiang
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
Kris Mok
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
wang hongjiang
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
wang hongjiang
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息
Shihpeng Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
 
並行與平行
並行與平行
Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
yoehfa
 
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
pesaxu
 

More Related Content

What's hot (20)

Exodus2 大局观
Exodus2 大局观
wang hongjiang
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
wang hongjiang
 
Aswan&hump
Aswan&hump
wang hongjiang
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closures
wang hongjiang
 
IOS入门分享
IOS入门分享
zenyuhao
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查
bluedavy lin
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
wang hongjiang
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
Kris Mok
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
wang hongjiang
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
wang hongjiang
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息
Shihpeng Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
 
並行與平行
並行與平行
Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
Effective linux.3.(diagnosis)
Effective linux.3.(diagnosis)
wang hongjiang
 
深入剖析Concurrent hashmap中的同步机制(上)
深入剖析Concurrent hashmap中的同步机制(上)
wang hongjiang
 
Java7 fork join framework and closures
Java7 fork join framework and closures
wang hongjiang
 
IOS入门分享
IOS入门分享
zenyuhao
 
高性能的Java代码编写及常见问题排查
高性能的Java代码编写及常见问题排查
bluedavy lin
 
Exodus重构和向apollo迁移
Exodus重构和向apollo迁移
wang hongjiang
 
Nashorn on JDK 8 (ADC2013)
Nashorn on JDK 8 (ADC2013)
Kris Mok
 
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Java SE 8 技術手冊第 11 章 - 執行緒與並行API
Justin Lin
 
UseNUMA做了什么?(2012-03-14)
UseNUMA做了什么?(2012-03-14)
Kris Mok
 
千呼萬喚始出來的 Java SE 7
千呼萬喚始出來的 Java SE 7
Justin Lin
 
Shell,信号量以及java进程的退出
Shell,信号量以及java进程的退出
wang hongjiang
 
Hash map导致cpu100% 的分析
Hash map导致cpu100% 的分析
wang hongjiang
 
如何用JDK8實作一個小型的關聯式資料庫系統
如何用JDK8實作一個小型的關聯式資料庫系統
なおき きしだ
 
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Java SE 7 技術手冊第二章草稿 - 從 JDK 到 IDE
Justin Lin
 
Spock:願你的測試長長久久、生生不息
Spock:願你的測試長長久久、生生不息
Shihpeng Lin
 
如何在 Java App 中導入 Scala
如何在 Java App 中導入 Scala
javatwo2011
 
並行與平行
並行與平行
Justin Lin
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 

Recently uploaded (20)

加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
yoehfa
 
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
pesaxu
 
澳洲毕业证(Curtin毕业证书)科廷大学毕业证海外大学文凭
澳洲毕业证(Curtin毕业证书)科廷大学毕业证海外大学文凭
oseazda
 
美国学位证书,加利福尼亚大学洛杉矶分校毕业证学历认证UCLA毕业证办理
美国学位证书,加利福尼亚大学洛杉矶分校毕业证学历认证UCLA毕业证办理
yamuf
 
英国学位证书,伦敦大学国王学院毕业证学历认证King's毕业证办理
英国学位证书,伦敦大学国王学院毕业证学历认证King's毕业证办理
unfemyw
 
澳洲毕业证(WSU毕业证书)西悉尼大学毕业证电子图
澳洲毕业证(WSU毕业证书)西悉尼大学毕业证电子图
vymwew
 
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证咨询
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证咨询
eweczy
 
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证加急办理
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证加急办理
comeozz
 
美国学位证书,UIUC毕业证香槟分校毕业证学历认证UIUC毕业证哪里买
美国学位证书,UIUC毕业证香槟分校毕业证学历认证UIUC毕业证哪里买
xnonq
 
澳洲毕业证(Monash毕业证书)莫纳什大学毕业证transcript信封
澳洲毕业证(Monash毕业证书)莫纳什大学毕业证transcript信封
yoehfa
 
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证哪里买
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证哪里买
zfyho
 
英国学位证书,谢菲尔德大学毕业证学历认证TUOS毕业证购买
英国学位证书,谢菲尔德大学毕业证学历认证TUOS毕业证购买
wadad4
 
加拿大毕业证(uOttawa毕业证书)渥太华大学毕业证学校邮寄信封
加拿大毕业证(uOttawa毕业证书)渥太华大学毕业证学校邮寄信封
yoehfa
 
英国学位证书,伦敦大学学院毕业证学历认证UCL毕业证加急办理
英国学位证书,伦敦大学学院毕业证学历认证UCL毕业证加急办理
wadad4
 
加拿大毕业证(Concordia毕业证书)康卡迪亚大学毕业证学历认证怎么认证
加拿大毕业证(Concordia毕业证书)康卡迪亚大学毕业证学历认证怎么认证
yoehfa
 
加拿大学位证书,维多利亚大学毕业证学历认证UVic毕业证办理
加拿大学位证书,维多利亚大学毕业证学历认证UVic毕业证办理
ocyvxun
 
英国学位证书,阿伯丁大学毕业证学历认证UoA毕业证制做
英国学位证书,阿伯丁大学毕业证学历认证UoA毕业证制做
acozz2
 
英国学位证书,爱丁堡龙比亚大学毕业证学历认证Napier毕业证加急购买
英国学位证书,爱丁堡龙比亚大学毕业证学历认证Napier毕业证加急购买
acozz2
 
加拿大学位证书,不列颠哥伦比亚大学毕业证学历认证UBC毕业证加急购买
加拿大学位证书,不列颠哥伦比亚大学毕业证学历认证UBC毕业证加急购买
ocyvxun
 
澳洲学位证书,悉尼大学毕业证学历认证USYD毕业证加急办理
澳洲学位证书,悉尼大学毕业证学历认证USYD毕业证加急办理
yeazu
 
加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
加拿大毕业证(UVic毕业证书)维多利亚大学毕业证学校邮寄信封
yoehfa
 
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
加拿大学位证书,麦克马斯特大学毕业证学历认证Mac毕业证咨询
pesaxu
 
澳洲毕业证(Curtin毕业证书)科廷大学毕业证海外大学文凭
澳洲毕业证(Curtin毕业证书)科廷大学毕业证海外大学文凭
oseazda
 
美国学位证书,加利福尼亚大学洛杉矶分校毕业证学历认证UCLA毕业证办理
美国学位证书,加利福尼亚大学洛杉矶分校毕业证学历认证UCLA毕业证办理
yamuf
 
英国学位证书,伦敦大学国王学院毕业证学历认证King's毕业证办理
英国学位证书,伦敦大学国王学院毕业证学历认证King's毕业证办理
unfemyw
 
澳洲毕业证(WSU毕业证书)西悉尼大学毕业证电子图
澳洲毕业证(WSU毕业证书)西悉尼大学毕业证电子图
vymwew
 
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证咨询
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证咨询
eweczy
 
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证加急办理
澳洲学位证书,昆士兰科技大学毕业证学历认证QUT毕业证加急办理
comeozz
 
美国学位证书,UIUC毕业证香槟分校毕业证学历认证UIUC毕业证哪里买
美国学位证书,UIUC毕业证香槟分校毕业证学历认证UIUC毕业证哪里买
xnonq
 
澳洲毕业证(Monash毕业证书)莫纳什大学毕业证transcript信封
澳洲毕业证(Monash毕业证书)莫纳什大学毕业证transcript信封
yoehfa
 
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证哪里买
澳洲学位证书,南澳大学毕业证学历认证UniSA毕业证哪里买
zfyho
 
英国学位证书,谢菲尔德大学毕业证学历认证TUOS毕业证购买
英国学位证书,谢菲尔德大学毕业证学历认证TUOS毕业证购买
wadad4
 
加拿大毕业证(uOttawa毕业证书)渥太华大学毕业证学校邮寄信封
加拿大毕业证(uOttawa毕业证书)渥太华大学毕业证学校邮寄信封
yoehfa
 
英国学位证书,伦敦大学学院毕业证学历认证UCL毕业证加急办理
英国学位证书,伦敦大学学院毕业证学历认证UCL毕业证加急办理
wadad4
 
加拿大毕业证(Concordia毕业证书)康卡迪亚大学毕业证学历认证怎么认证
加拿大毕业证(Concordia毕业证书)康卡迪亚大学毕业证学历认证怎么认证
yoehfa
 
加拿大学位证书,维多利亚大学毕业证学历认证UVic毕业证办理
加拿大学位证书,维多利亚大学毕业证学历认证UVic毕业证办理
ocyvxun
 
英国学位证书,阿伯丁大学毕业证学历认证UoA毕业证制做
英国学位证书,阿伯丁大学毕业证学历认证UoA毕业证制做
acozz2
 
英国学位证书,爱丁堡龙比亚大学毕业证学历认证Napier毕业证加急购买
英国学位证书,爱丁堡龙比亚大学毕业证学历认证Napier毕业证加急购买
acozz2
 
加拿大学位证书,不列颠哥伦比亚大学毕业证学历认证UBC毕业证加急购买
加拿大学位证书,不列颠哥伦比亚大学毕业证学历认证UBC毕业证加急购买
ocyvxun
 
澳洲学位证书,悉尼大学毕业证学历认证USYD毕业证加急办理
澳洲学位证书,悉尼大学毕业证学历认证USYD毕业证加急办理
yeazu
 
Ad

Java cpu

  • 1. 了解CPU 作者:周忱 | 淘宝综合业务 微博:@MinZhou 邮箱:[email protected]
  • 2. 为什么Java程序员也需要了解CPU 关于我 • 花名:周忱(chén) • 真名:周敏 • 微博: @MinZhou • Twitter: @minzhou • 2010年6月加入淘宝 • 曾经淘宝Hadoop&Hive研发 组Leader • 目前专注分布式实时计算 • Hive Contributor • 自由、开源软件热爱者 Taobao Java Team | zhouchen.zm
  • 3. 为什么Java程序员也需要了解CPU 关于我 • 花名:周忱(chén) • 真名:周敏 • 微博: @MinZhou • Twitter: @minzhou • 2010年6月加入淘宝 • 曾经淘宝Hadoop&Hive研发 组Leader • 目前专注分布式实时计算 • Hive Contributor • 自由、开源软件热爱者 Taobao Java Team | zhouchen.zm
  • 4. 为什么Java程序员也需要了解CPU 什么是volatile? Taobao Java Team | zhouchen.zm
  • 5. 为什么Java程序员也需要了解CPU Puzzle 1 下面哪个程序跑得更快? private static long value; private static volatile long value; public static void increment() { public static void increment() { while (value < 100000000L) { while (value < 100000000L) { value++; value++; } } } } 如果换成AtomicLong呢? Taobao Java Team | zhouchen.zm
  • 6. 为什么Java程序员也需要了解CPU Puzzle 2 下面哪个程序跑得更快? AtomicIntegerFieldUpdater state = … AtomicIntegerFieldUpdater state= … public void lock() { public void lock() { while(state.getAndSet(true)) {} ; //spin while (true) { } while(state.get()) {}; //spin if(!state.getAndSet(true)) return; } } 如果换成多线程呢? Taobao Java Team | zhouchen.zm
  • 7. 为什么Java程序员也需要了解CPU Intel 十年计划:Tick-Tock Taobao Java Team | zhouchen.zm
  • 8. 为什么Java程序员也需要了解CPU CPU微架构变革 • Hyper-threading • 32KB L1d 与32KB L1i • 256KB L2 Cache • 4–12 MB L3 cache • QPI 代替FSB • PCI E和DMI整合入 处理器, 北桥消失 • 支持 2/3通道DDR3 Taobao Java Team | zhouchen.zm
  • 9. 为什么Java程序员也需要了解CPU 现代CPU微架构 Taobao Java Team | zhouchen.zm
  • 10. 为什么Java程序员也需要了解CPU Intel Nehalem 排布 Taobao Java Team | zhouchen.zm
  • 11. 为什么Java程序员也需要了解CPU Intel Sandy Bridge Taobao Java Team | zhouchen.zm
  • 12. 为什么Java程序员也需要了解CPU Puzzle 3 下面哪个程序跑得更快? private static long[][] longs; private static long[][] longs; for (int i = 0; i < DIMENSION_1; i++) { for (int j = 0; j < DIMENSION_2; j++) { for (int j = 0; j < DIMENSION_2; j++) { for (int i = 0; i < DIMENSION_1; i++){ sum += longs[i][j]; sum += longs[i][j]; } } } } Taobao Java Team | zhouchen.zm
  • 13. 为什么Java程序员也需要了解CPU CPU Cache cat /sys/devices/system/cpu/cpu0/cache/index0/* Taobao Java Team | zhouchen.zm
  • 14. 为什么Java程序员也需要了解CPU Cache Coherence & MESI协议 • M: 修改 • E : 独占 • S : 共享 • I : 失效 发音: messy Taobao Java Team | zhouchen.zm
  • 15. 为什么Java程序员也需要了解CPU Puzzle 4 下面程序有什么问题? public final static class VolatileLong { longs = new VolatileLong[NUM_THREADS]; public volatile long value = 0L; for (int i = 0; i < longs.length; i++) { } longs[i] = new VolatileLong(); } public class FS implements Runnable { // 每个线程更新独立的变量 public void run() { for (int i = 0; i < NUM_THREADS; i++) { long i = ITERATIONS + 1; threads[i] = new Thread(new FS(i))); while (0 != --i) { } longs[arrayIndex].value = i; for (Thread t : threads) { } t.start(); } } } for (Thread t : threads) { t.join(); } Taobao Java Team | zhouchen.zm
  • 16. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 17. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 18. 为什么Java程序员也需要了解CPU False Sharing public final static class VolatileLong { public volatile long value = 0L; } => public final static class VolatileLong { public volatile long value = 0L; public long p1, p2, p3, p4, p5, p6; } Taobao Java Team | zhouchen.zm
  • 19. 为什么Java程序员也需要了解CPU Cache Consistency & 乱序执行 • CPU指令重排序 • 编译重排序 Taobao Java Team | zhouchen.zm
  • 20. 为什么Java程序员也需要了解CPU Memory Ordering • 程序顺序(Program ordering): 读写和指令编制一致, 也称强顺序. • 处理器顺序(Processor ordering): 加快指令执行速度, 例如读可跨越它之前 的buffered写 • Intel386及之前内存顺序模型: 程序顺序 • Pentium和Intel486内存顺序模型:大多数情况下遵循程序顺序 • P6及以后内存顺序模型:处理器顺序, 同时提供其它加强或弱化内存顺序 模型的特殊指令 Taobao Java Team | zhouchen.zm
  • 21. 为什么Java程序员也需要了解CPU 内存屏障 • Load Buffer • Store Buffer • CPU串行化指令 – CPUID – SFENCE – LFENCE – MFENCE • Lock系指令 Taobao Java Team | zhouchen.zm
  • 22. 为什么Java程序员也需要了解CPU Java内存模型 • Happens-Before // Lock • StoreStore pthread_mutex_lock(&lock); • LoadStore sequence = i; pthread_cond_signal(&condition); • StoreLoad pthread_mutex_unlock(&lock); • LoadLoad • Full Fence // Soft Barrier • 锁和synchronized块 asm volatile(“” ::: “memory”); • volatile 关键字 sequence = i; • final 关键字 // Fence asm volatile(“” ::: “memory”); sequence = i; asm volatile(“lock addl $0x0,(%rsp)”); Taobao Java Team | zhouchen.zm
  • 23. 为什么Java程序员也需要了解CPU Java内存模型 需要内存屏 重排序 次操作 次操作 障 Normal Volatile Volatile Volatile Load Load Store Normal Normal Load Volatile 首操作 首操作 Normal Monitor Monitor Load Store MonitorEnt Store er Store Enter Exit Normal Normal Load LoadStore Load No Normal Normal Store StoreStore Store Volatile Load Volatile Load No No No LoadLoad LoadStore LoadLoad LoadStore MonitorEnter Monitor Enter Volatile store Volatile Store No No StoreLoad StoreStore Monitor MonitorExit Exit Taobao Java Team | zhouchen.zm
  • 24. 为什么Java程序员也需要了解CPU Example 1. class X { $ java -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=hsdis-print-bytes - 2. int a, b; XX:CompileCommand=print,X.f X 3. volatile int v, u; 4. void f() { … 5. int i, j; 6. 7. i = a; // load a [Verified Entry Point] 8. j = b; // load b 0xb3a1e28c: push %ebp ;...55 9. i = v; // load v 0xb3a1e28d: sub $0x8,%esp ;...81ec0800 0000 10. // LoadLoad 0xb3a1e293: mov 0x10(%ecx),%ebx ;...8b5910 ; i = v 11. j = u; // load u 0xb3a1e296: mov 0x14(%ecx),%edi ;...8b7914 ; j = u 12. // LoadStore 0xb3a1e299: mov %ebx,0x8(%ecx) ;...895908 ; a = i 13. a = i; // store a 0xb3a1e29c: mov %edi,0xc(%ecx) ;...89790c ;b=j 14. b = j; // store b 0xb3a1e29f: mov %ebx,0x10(%ecx) ;...895910 ; v = i 15. // StoreStore 0xb3a1e2a2: mov %edi,0x14(%ecx) ;...897914 ; u = j 16. v = i; // store v 0xb3a1e2a5: lock addl $0x0,(%esp) ;...f0830424 ; memory barrier 17. // StoreStore 0xb3a1e2aa: mov 0x14(%ecx),%ebp ;...8b6914 ; i = u 18. u = j; // store u 19. // StoreLoad 0xb3a1e2ad: mov %ebp,0x8(%ecx) ;...896908 ; a = i 20. i = u; // load u 0xb3a1e2b0: add $0x8,%esp ;...83c408 21. // LoadLoad 0xb3a1e2b3: pop %ebp ;...5d 22. // LoadStore 0xb3a1e2b4: test %eax,0xb78ab000 ;...850500b0 8ab7 23. j = b; // load b 24. a = i; // store a … 25. } 26.} 参考: jdk/hotspot/src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp Taobao Java Team | zhouchen.zm
  • 25. 为什么Java程序员也需要了解CPU Puzzle 5 为什么有volatile还需要AtomicXX及 Unsafe.compareAndSwapXX? Taobao Java Team | zhouchen.zm
  • 26. 为什么Java程序员也需要了解CPU 原子指令 • CompareAndSwap: LOCK XCHG • LOCK XADD • ABA问题 Taobao Java Team | zhouchen.zm
  • 27. 为什么Java程序员也需要了解CPU 让步锁 public class BackoffLock { if (!state.getAndSet(true)) { private AtomicBoolean state = new return; AtomicBoolean(false); } else { private static final int MIN_DELAY = ...; backoff.backoff(); private static final int MAX_DELAY = ...; } } public void lock() { } Backoff backoff = new Backoff(MIN_DELAY, MAX_DELAY); public void unlock() { while (true) { state.set(false); while (state.get()) {}; } } Taobao Java Team | zhouchen.zm
  • 28. 为什么Java程序员也需要了解CPU 队列锁 • BackOff锁的问题 – Cache-coherence Traffic – 临界区利用率 – 公平性问题 – 饥饿 • 基于数组的队列 • CLH队列 • MCS队列 • NUMA-Aware变种 https://blogs.oracle.com/dave/entry/flat_combining_numa_locks Taobao Java Team | zhouchen.zm
  • 29. 为什么Java程序员也需要了解CPU Puzzle 6 为什么j.u.c或者jvm里面在加锁的时候, 喜欢用先 CAS spin尝试N次, 如果失败则yield多次(可选), 如果 最后还是失败则park, 同时把线程加到队列里? Taobao Java Team | zhouchen.zm
  • 30. 为什么Java程序员也需要了解CPU 工具 • top • vmstat • lscpu • perf • Valgrind tools suite • OProfile • SystemTap • numactl • Intel Vtune • MAT Taobao Java Team | zhouchen.zm
  • 31. 为什么Java程序员也需要了解CPU 推荐读物 • What every programmer should know about memory • Intel® 64 and IA-32 Architectures Software Developer Manuals • The Art of Multiprocessor Programming • The JSR-133 Cookbook for Compiler Writers (Java Memory Model) • 本人博客: http://coderplay.javaeye.com Taobao Java Team | zhouchen.zm
  • 32. 为什么Java程序员也需要了解CPU Q&A 作者:周忱 | 淘宝综合业务 微博:@MinZhou 邮箱:[email protected] Taobao Java Team | zhouchen.zm