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的缓存架构
image.png
如图,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注解标注共享变量


一颗心
1 声望1 粉丝