zoukankan      html  css  js  c++  java
  • Java程序员应该掌握的底层知识

    硬件基础知识
    CPU的制作过程
     
    Intel cpu的制作过程
     
    CPU是如何制作的(文字描述)
     
    CPU的原理
     
    计算机需要解决的最根本问题:如何代表数字
    晶体管是如何工作的:
    晶体管的工作原理:
     
    汇编语言(机器语言)的执行过程
     
    汇编语言的本质:机器语言的助记符 其实它就是机器语言
    计算机通电 -> CPU读取内存中程序(电信号输入)->时钟发生器不断震荡通断电 ->推动CPU内部一步一步执行(执行多少步取决于指令需要的时钟周期)
    ->计算完成->写回(电信号)->写给显卡输出(sout,或者图形)
     
     
    CPU的基本组成
     
    PC -> Program Counter 程序计数器 (记录当前指令地址)
    Registers -> 暂时存储CPU计算需要用到的数据
    ALU -> Arithmetic & Logic Unit 运算单元
    CU -> Control Unit 控制单元
    MMU -> Memory Management Unit 内存管理单元
    cache
     
     

     

    缓存
     
     
    缓存行:
    缓存行越大,局部性空间效率越高,但读取时间慢
    缓存行越小,局部性空间效率越低,但读取时间快
    取一个折中值,目前多用:
    64字节
     
     
     
    public class CacheLinePadding {
     
    public volatile static long[] arr=new long[2];
     
    public static void main(String[] args) throws Exception{
    Thread t1=new Thread(()->{
    for (long i=0;i< 10_0000_0000L;i++){
    arr[0]=i;
    }
    });
     
    Thread t2=new Thread(()->{
    for (long i=0;i< 10_0000_0000L;i++){
    arr[1]=i;
    }
    });
     
    t1.start();
    t2.start();
    final long start = System.nanoTime();
    t1.join();
    t2.join();
    final long end = System.nanoTime();
    System.out.println((end-start)/1000000);
    }
    }
     
    //执行时间在4s左右
     
     
    public class T02_CacheLinePadding {
     
    public volatile static long[] arr=new long[16];
    public static void main(String[] args) throws Exception{
    Thread t1=new Thread(()->{
    for (long i=0;i< 10_0000_0000L;i++){
    arr[0]=i;
    }
    });
     
    Thread t2=new Thread(()->{
    for (long i=0;i< 10_0000_0000L;i++){
    arr[8]=i;
    }
    });
     
    t1.start();
    t2.start();
    final long start = System.nanoTime();
    t1.join();
    t2.join();
    final long end = System.nanoTime();
    System.out.println((end-start)/1000000);
    }
    }
     
    //执行在2s左右
     
     
    缓存行对齐:对于有些特别敏感的数字,会存在线程高竞争的访问,为了保证不发生伪共享,可以使用缓存航对齐的编程方式
    JDK7中,很多采用long padding提高效率
    eg:
     
     
    JDK8,加入了@Contended注解(实验)需要加上:JVM -XX:-RestrictContended
     
     
    public class T03_CacheLinePading {
     
     
    @Contended
    volatile long x;
     
    @Contended
    volatile long y;
     
    public static void main(String[] args) throws Exception{
     
    T03_CacheLinePading t3=new T03_CacheLinePading();
    Thread t1=new Thread(()->{
    for (long i=0;i< 1_0000_0000L;i++){
    t3.x=i;
    }
    });
     
    Thread t2=new Thread(()->{
    for (long i=0;i< 1_0000_0000L;i++){
    t3.y=i;
    }
    });
     
    t1.start();
    t2.start();
    final long start = System.nanoTime();
    t1.join();
    t2.join();
    final long end = System.nanoTime();
    System.out.println((end-start)/1000000);
    }
    }
    //0.6s
  • 相关阅读:
    后缀表达式
    约瑟夫环
    能手进阶:Linux操作琐细驱动编译与运转
    VLC 0.8.5
    Gimpshop 2.2.11
    Blender 2.42
    有助于数据确立平安环境的次要效率阐明');
    DivFix 0.20
    Ubuntu Dapper 提速脚本
    你值得知道的五佳非主流阅读器
  • 原文地址:https://www.cnblogs.com/wangyang1991/p/13169760.html
Copyright © 2011-2022 走看看