CPU 是整个计算机的大脑,管制和解决内部输出的工作。CPU 是由运算器、寄存器和控制器三大模块组成。
运算器
运算器(Arithmatic unit ALU)用于做算术计算和逻辑计算。算术计算包含加减乘除四则运算,逻辑运算次要包含异、或、非、与、比拟等运算。
运算器解决的数据通常为二进制数据,古代计算机中运算器一次解决的数据长度通常是 64 位,一次解决的二进制位长度越大,示意解决性能越高。
寄存器
寄存器是运算器的数据仓库,运算器须要的数据是存储在寄存器中的,当运算器计算实现后将后果再回写到寄存器中,最初返回到输出设备。
寄存器分为
控制器
包含程序计数器、时序发生器、指令译码器、寄存器。
程序计数器
program counter 简称 PC,用于记录 CPU 指令的地址。当 CPU 执行指令时,须要从 PC 中获取指令的地址,依据地址再获取到指令。当该条指令执行实现后,PC 的地址会指向下一个指令地址位。
时序发生器
用于发送时序脉冲,CPU 根据不同的时序脉冲有节奏地进行工作,相似于 CPU 的节拍器。
指令译码器
翻译指令
寄存器
寄存器又分为多种不同类型
数据寄存器
数据寄存器(Data Register,DR)又称数据缓冲寄存器,其次要性能是作为 CPU 和主存、外设之间信息传输的中转站,用以补救 CPU 和主存、外设之间操作速度上的差别。
数据寄存器用来临时寄存由主存储器读出的一条指令或一个数据字;反之,当向主存存入一条指令或一个数据字时,也将它们临时寄存在数据寄存器中。
指令寄存器
存储 CPU 的指令,PC 中的指令地址就是指向的指令寄存器空间。
当执行一条指令时,首先把该指令从主存读取到数据寄存器中,而后再传送至指令寄存器。
主存地址寄存器
主存地址寄存器(Address Register,AR),存储着数据的内存地址,CPU 通过 IO 总线和内存替换数据。
因为在主存和 CPU 之间存在操作速度上的差别,所以必须应用地址寄存器来临时保留主存的地址信息,直到主存的存取操作实现为止。当 CPU 和主存进行信息替换,即 CPU 向主存存入数据 / 指令或者从主存读出数据 / 指令时,都要应用地址寄存器和数据寄存器。
累加寄存器
累加寄存器通常简称累加器(Accumulator,AC),是一个通用寄存器。当运算器的算术逻辑单元 ALU 执行算术或逻辑运算时,为 ALU 提供一个工作区,能够为 ALU 临时保留一个操作数或运算后果。
程序状态寄存器
程序状态字(Program Status Word,PSW)用来表征以后运算的状态及程序的工作形式。
程序状态字寄存器还用来保留中断和零碎工作状态等信息,以便 CPU 和零碎及时理解机器运行状态和程序运行状态。因而,程序状态字寄存器是一个保留各种状态条件标记的寄存器。
CPU 高速缓存
CPU 在拜访内存时,首先从 CPU 高速缓存中查问数据,如果存在间接获取,否则拜访内存中的数据,并把数据放到 CPU 缓存中,最初返回给 CPU 应用。
下图为 CPU 的缓存架构
如图,CPU 缓存分为一级缓存、二级缓存和三级缓存。越凑近 CPU 存取数据速度越快,其老本也会越高。每个 CPU 外围独自领有 L1 和 L2 缓存,同一颗物理 CPU 的多个外围共享同一个 L3 缓存。
CPU 在获取数据时,先从 L1 获取,如果没有再从 L2、L3 获取,直到从主存中获取数据。当 L1 中蕴含了所需的数据时,速度是最快的,反之每次都要到主从中获取数据时,就会很慢。
缓存行
CPU 和主存替换数据的最小单位是 cache line(缓存行),每个缓存行的大小是 64 字节。思考到空间局部性,邻近的数据将来被拜访的可能性较大,因而当 CPU 装载主存数据到缓存时,会将邻近的 64 个字节一起载入到缓存中,这 64 个字节正好占了一个 cache line。当一个缓存行的数据有变动时会清空该缓存行,并从主从中从新载入。
多线程缓存共享问题
多个线程同时操作 cache line 中的不同字节时,会呈现缓存伪共享状况。每个线程的操作都会导致缓存的生效,进而须要从主从读取,从新载入到 CPU 缓存中,这样导致缓存频繁的装载、生效,读取的数据理论都要从主存取得,大大降低了 CPU 的性能。
缓存行对齐
为了防止缓存行的伪共享问题,咱们能够将不同线程操作的数据分布到不同的缓存行中,互不烦扰。A 线程批改 A 数据只须要对 A 数据缓存行生效,而不会影响到 B 线程的 B 数据。
缓存行对齐有两种形式
1、将共享变量数据左右填充有效的数据,保障总长为 64 个字节
2、在 JDK8 中应用 @Contended 注解标注共享变量