一.CPU原理:
晶体管:解决了如何代表数字的根本问题
二.汇编语言
1. 汇编的本质: 助记符,其实就是机器语言
2. 执行过程:
- CPU读取内存中程序(电信号输入)
- 时钟发生器不断震荡通电 ,推动CPU内部一步步执行(执行多少步取决于指令所需时钟周期)
- 计算完成
- 写回电信号
- sout
三.CPU的组成
- PC: (Program Counter) 程序计数器(记录当前指令地址)
- Register: 寄存器,暂时存储CPU计算所需的数据
- ALU: (Arithmetic&Logic Unit) 逻辑运算单元
- CU: (Control Unit) 控制单元,中断控制等等
- MMU: (Memory Management Unit) 内存管理单元
- cache:三级缓存,一二级缓存单核使用,第三级缓存多核共享
- 超线程:CPU的一个核里面有一个ALU和两个PC和两个Register
- 量子计算机:一位可同时代表0和1
四.缓存
- MESI缓存一致性协议(Intel) 不同CPU有不同的协议
- 缓存行:数据基本读取单位(按块读取,局部性原理)
- 缓存行越大,局部性空间效率越高,但读取时间慢,缓存行越小,局部性空间效率越低,但读取时间快 取一个折中值,目前多用: 64字节
- 缓存行对齐:对于有些特别敏感的数字,会存在线程高竞争的访问,为了保证不发生伪共享,可以使用缓存行对齐的编程方式 JDK7中,很多采用long padding提高效率 JDK8,加入了
@Contended
注解(实验)需要加上:
JVM -XX:-RestrictContended
五.CPU乱序执行
- 本质是同时执行
- CPU在读等待的同时执行指令(两条指令不相干),是CPU乱序的根源,为了提高效率
六.如何禁止指令重排序
- CPU层面:Intel -> 原语(mfence lfence sfence) 或者锁总线
- JVM层级:8个hanppens-before原则 4个内存屏障 (LL LS SL SS)
- as-if-serial : 不管硬件什么顺序,单线程执行的结果不变,看上去像是serial
七.NUMA(Non Uniform Memory Access)
- UMA的缺点:不易扩展,CPU数量增多之后引起内存访问加剧,CPU的很多资源花在争抢内存地址上,4颗比较合适
- NUMA:主板上每块CPU插槽都有一个离得最近的内存,CPU访问最近的内存时会比访问其他CPU插槽附近的内存快很多,分配内存会优先分配该线程所在CPU的最近内存
- ZGC - NUMA aware
八.合并写(Write Combining Buffer)
- WCB一般是4个字节
- 由于ALU速度太快,所以在写入L1的同时,写入一个WC Buffer,满了之后,再直接更新到L2
九.CPU如何区分一个立即数 和 一条指令
总线内部分为:数据总线 地址总线 控制总线
地址总线目前:48位