Java程序员应该掌握的底层知识

硬件基础知识
CPU的制作过程
 
Intel cpu的制作过程
https://haokan.baidu.com/v?vid=11928468945249380709&pd=bjh&fr=bjhauthor&type=video
 
CPU是如何制作的(文字描述)
https://www.sohu.com/a/255397866_468626
 
CPU的原理
 
计算机需要解决的最根本问题:如何代表数字
晶体管是如何工作的:
https://haokan.baidu.com/v?vid=16026741635006191272&pd=bjh&fr=bjhauthor&type=video
晶体管的工作原理:
https://www.bilibili.com/video/av47388949?p=2
 
汇编语言(机器语言)的执行过程
 
汇编语言的本质:机器语言的助记符 其实它就是机器语言
计算机通电 -> CPU读取内存中程序(电信号输入)->时钟发生器不断震荡通断电 ->推动CPU内部一步一步执行(执行多少步取决于指令需要的时钟周期)
->计算完成->写回(电信号)->写给显卡输出(sout,或者图形)
 
 
CPU的基本组成
 
PC -> Program Counter 程序计数器 (记录当前指令地址)
Registers -> 暂时存储CPU计算需要用到的数据
ALU -> Arithmetic & Logic Unit 运算单元
CU -> Control Unit 控制单元
MMU -> Memory Management Unit 内存管理单元
cache
 
 
Java程序员应该掌握的底层知识_第1张图片

 

 Java程序员应该掌握的底层知识_第2张图片

 

 

缓存
 
一致性协议:https://www.cnblogs.com/z00377750/p/9180644.html
 
缓存行:
缓存行越大,局部性空间效率越高,但读取时间慢
缓存行越小,局部性空间效率越低,但读取时间快
取一个折中值,目前多用:
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

你可能感兴趣的:(Java程序员应该掌握的底层知识)