第一天:CPU部分底层知识

1.硅通过加入特殊元素变成P半导体和N半导体,通过结合形成PN结也就是二极管可以做单次计算,二极管继续发展之后变成场效应晶体管最后成为逻辑开关,通电代表1,否则代表0。各种各样的逻辑开关组合在一起就成了逻辑门,逻辑门能把二进制慢慢变为八进制十六进制,逻辑门就组合成了基础逻辑电路,形成了加法器、累加器、锁存器等。但需要手动去计算,通电一次运算一次位运算。加入内存,实现自动运算,每次读取内存指令。
2.volatile方面涉及到的两个问题:1)可见性2)指令重排序
3.CPU和内存之间是通过总线来连接的,CPU中包含PC程序接收器接收内存中传过来的指令,Registers寄存器用来存入内存中传输过来的数据,ALU运算单元用来计算寄存器中的数据是CPU中执行最快的,CPU是通过PC找到指令的地址把指令读取进来,发现指令还需要数据就把这些数据读到寄存器,然后运算单元才开始运行计算寄存器中的数据,然后写回到内存中去。
CPU主要就是用来取指令然后做运算,指导指令结束为止
CPU中与Java相关的有个cache缓存,因为cpu太快了而内存太慢了所以就有了缓存
第一天:CPU部分底层知识_第1张图片
第一天:CPU部分底层知识_第2张图片
一个计算机中有很多个CPU,CPU中有很多个核,每个核都有自己的一级缓存和二级缓存,所有的核共享一个三级缓存,寄存器首先从一级缓存L1查找,找不到就去二级缓存L2查找,依次下去最后到内存中去查找

4.线程在PC中执行完了之后要放回到内存中保存好,下回调用时候可以继续用,然后放入下个线程执行操作。
超线程:在一个cpu中有两组寄存器还有PC,一组寄存器和PC可以装一个线程,ALU可以在两组寄存器中来回切换,这种切换比线程之间切换的速度快的多,所以超线程就是一个ALU对应多个PC|Registers

5.总线是有很多根线所以可以一下子从内存中读取很多数据进来,所以一次读取数据是读一堆进到缓存之中,所以就有了缓存行,一行一行的进行读取,一行一般有64个字节。当多个线程同时访问一个问题的时候缓存行的时候,需要缓存保持一致用到volatile,然后所有缓存之间存在一种MESI Cache一致性协议,也就是缓存行存在的四种状态Modified被修改了,Exclusive独享,Shared分享,Invalid失效。当一个寄存器执行完后缓存条就变成了Modified状态保存回主存中,然后其他缓存种的缓存行就变为Invalid然后重新找内存中拿取缓存行,通过缓存锁来进行通知。
MESI也是volatile的一种实现方式
缓存协议:MSI,MESI,MOSI,Synapse,Firefly,Dragon
缓存锁实现之一:有些无法被缓存的数据或者跨越多个缓存行的数据依然必须使用总线锁
disruptor闪电 最快的单机版队列 核心:ring buffer
环级缓冲区,中间有个指针叫cursor
按缓存行一下子定义八个long因为long为8个字节,8*8=64字节正好为一个缓存行

6.指令重排序(CPU底层)
处理器会按照机器指令的顺序来执行,但有时,在下一条指令并不依赖于前面那条延迟较长的指令,只要有了操作数就能提前执行,然后前面那个指令推后执行,这就是乱序执行,读指令的同时可以同时执行不影响的其他指令而写的同时可以进行合并写WCBuffer,必须使用Memory Barrier来做好指令排序,volatile的底层就是这么实现的(Windows是lock指令)
WCBuffer:只有四个字节,当CPU需要把值写回到内存或者缓存中时,首先先写到WCBuffer中,再把四个字节放过去,四个字节四个字节地写

7.DCL中为什么要用volatile
DLC(Double Check Lock)双重检查:先检查INSTANCE是否存在然后给这个单例上锁sychornized,然后再检查一回
thread1:实例化单例的时候先半初始化 new #2 然后进行invokespecial #3 操作赋值给单例,然后通过astore_1来给地址,其中赋值和给地址中有可能进行指令重排,所以就要用到volatile防止其指令重排

你可能感兴趣的:(程序人生)