Java程序员需要掌握的底层知识

本文详细介绍了Java程序员需要掌握的底层知识,包括汇编语言执行过程、CPU组成、存储器层次结构、缓存机制、操作系统基础如进程调度、中断、内存管理,特别是volatile的实现细节和内存屏障。此外,还探讨了超线程、NUMA、ZGC等高级主题,对于深入理解Java编程和系统性能优化具有重要意义。
摘要由CSDN通过智能技术生成

汇编语言(机器语言)的执行过程


汇编语言的本质:机器语言的助记符 其实它就是机器语言
过程:计算机通电 ---> CPU读取内存中程序(电信号输入)--->时钟发生器不断震荡通断电--->推动CPU内部一步一步执行(执行多少步取决于指令需要的时钟周期)--->计算完成->写回(电信号)--->写给显卡输出(sout,或者图形)

CPU的基本组成


PC -> Program Counter 程序计数器 (记录当前指令地址)
Registers -> 暂时存储CPU计算需要用到的数据
ALU -> Arithmetic & Logic Unit 运算单元
CU -> Control Unit 控制单元
MMU -> Memory Management Unit 内存管理单元
Cache -> 缓存

存储器层次结构&局部性原理


参照一位大佬的分享:
https://www.jianshu.com/p/5d7c8d7092af

CPU读取不同位置数据的速度对比


从CPU到:

存储单元 时间
Registers < 1ns
L1 cache 约 1ns
L2 cache 约 3ns
L3cache 约 15ns
main memory 约 80ns

超线程


超线程.png

一个ALU对应多个PC| Registers (如单核2线程),实现在单处理器上模拟双处理器的效能。

Cache缓存(CPU)


  • 从任何存储单元读取数据都是按块读取。
  • 利用程序局部性原理(当用到某个数字时程序也会马上用到相邻的那些数字),可以提高效率。
  • 充分发挥总线CPU针脚等一次性读取更多数据的能力。

伪共享&缓存行对齐

image.png
  • 如上图,xy位于同一缓存行cache line,此时若读取x或y会把整个cache line 即xy同时读取。
  • 计算单元ALU找数据时按照就近原则查找L1,没有再找L2,这样依次找下去。回读数据时会把cache line这一块数据读取。
  • 这会导致核1读x时同时读了y,核2读y时也读了x。这时若核1修改了x,则核2的x也必须保持一致,这通过MESI缓存一致性协议(缓存锁)保证。缓存同步以cache line为单位进行。
  • 缓存失效
    如果一个核正在使用的数据所在的缓存行被其他核修改,那么这个cache line会失效,需要重新读取缓存。
  • False Sharing(伪共享)
    如果多个核的线程在操作同一个cache line中的不同数据,那么就会出现频繁的缓存失效,即使在代码层面看这两个线程操作的数据之间完全没有关系。
    这种不合理的资源竞争情况叫False Sharing(伪共享),会严重影响机器的并发执行效率。
  • 如果一个cache line装不下某个数据,需要通过锁总线的方法解决。核1访问内存时锁住总线,禁止其它访问,当核1访问完后其它才能访问。
  • 锁总线MESI缓存一致性协议(缓存锁)效率低。

缓存行大小

不同品牌CPU缓存行大小可能不同
缓存行越大,局部性空间效率越高,但读取时间慢。
缓存行越小,局

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值