Java底层知识总结

CPU缓存

 

咱们搞java的,平时写业务代码,会不多涉及到这方面的知识。可是若是要写出高性能的java代码,对于CPU Cache一块仍是要有所了解的。java

首先来说寄存器为何会比内存快缓存

寄存器是在CPU内部的,固然读起来会更加快一点。以3GHz(Hz是每秒的周期次数)的CPU为例,电流每秒钟能够震荡30亿次。1秒=10亿纳秒,每次耗时大约为10/30纳秒,也就是0.33纳秒。光速是每秒300000000米,也就是说光在1纳秒能够前进30cm,在cpu的一个时钟周期内,光能够前进10cm。(理想状态下,真实状况下还要考虑到能量损失等等不少因素),若是内存距离CPU超过5cm,就不能够在一个时钟周期内完成数据的读取。架构

内存在硬件设计上,每一个位就是一个电容和一个晶体管,而寄存器的晶体管一直有电,而内存的晶体管只有用到的才有电,没有用到就没有电,这样有利于省电。性能

寄存器和内存的工做方式不太相同。优化

寄存器的工做方式spa

1.找到相关的位
2.读取这些位操作系统

内存的工做方式设计

1.找到数据的指针。(指针可能会存放在寄存器中,因此这一步就已经包括寄存器的所有工做了)
2.将指针送往内存管理单元(MMU),由MMU将虚拟的内存地址转换成实际的物理地址。
3.物理地址送往内存控制器(Memory Controller)。由内存控制器找出该地址在哪一根内存插槽上。
4.确认数据在哪个内存块上,从该块读取数据
5.数据先送回内存控制器,再送回CPU,而后开始使用。

如今的CPU通常有3级缓存架构(后面会讲到),为何须要CPU Cache呢?由于CPU震荡的频率太快了,快到主存跟不上了。这样在处理器时钟周期内,CPU经常要等待主存,浪费资源。因此Cache的出现,是为了缓解CPU和内存之间速度的匹配问题

带有CPU Cache的CPU执行计算的流程:指针

1.将程序和数据加载到主内存中。
2.将指令和数据加载到CPU Cache。
3.CPU执行指令,将结果写到CPU Cache。
4.CPU Cache写回到主内存中。事务

CPU Cache的意义在何处?

1.时间局部性:若是某个数据被访问,那么在不久的未来它极可能被再次访问。
2.空间局部性:若是某个数据被访问,那么与它相邻的数据很快也可能会被访问。

在CPU访问存储设备时,不管是存取数据或者是存取指令,都趋于汇集在一片连续的区域中,被称为局部性原理。

说到这里,我要说一个协议,CPU多级缓存一致性协议(MESI)。这个协议用于保证多个CPU Cache之间缓存共享数据的一致性。个人电脑就有CPU三级缓存,后面会详细介绍CPU三级缓存。

在CPU里面,缓存是以缓存行(Cache line)的形式存在。Cache line缓存存储数据的单元,每一个Cache line有4种状态,分别是Modified(修改)、Exclusive(独占)、Shared(共享)、Invaild(无效)。一个Cache line有64Byte(字节,一个字节等于8bit)


4种状态详细说明以下

对于M和E状态而言老是精确的,它们和该缓存行的真正状态是一致的,而S状态多是非一致的。若是一个缓存将处于S状态的Cache line做废了,而另外一个缓存实际上独享了该Cache line,但该缓存却不会将该Cache line设置为E状态。

这是由于其余缓存不会广播它们做废该Cache line的通知,一样因为缓存并无保存该Cache line的Copy数量,即使有这种通知也没法肯定本身是否已经独享了该缓存行。

能够看出E状态是一种投机性优化。若是一个CPU想修改一个处于S状态的Cache line,总线事务须要将全部Cache line的Copy变成Invalid状态,而修改E状态的缓存不须要使用到总线事务。

 

关于CPU的计算机基础知识

存储单元是以字节为单位的,1B=8b 1KB=1024B 1MB=1024KB 1GB=1024MB
2^32 = 4GB 2^64=1800万TB

好比64位的操做系统只是字节的64位,数据总线是64根,真正决定内存大小的是地址总线的数目,即寻址空间。

数据总线:
1.是CPU与内存或者其余器件之间的数据传送的通道。
2.数据总线的宽度决定了CPU和外界的数据传送速度。
3.每条传输线一次只能传输1位二进制数据,好比32位操做系统,32根数据线一次可传送32位二进制数据,也就是4个字节。
4.数据总线是数据线数量之和。

地址总线:
1.CPU是经过地址总线来执行存储单元的。
2.地址总线决定了CPU所能访问的最大内存空间大小。好比32位操做系统有32根地址线,那么CPU就能访问2^32=4GB存储单元。
3.地址总线是地址线数量之和。

控制总线:
1.CPU经过控制总线对外部器件进行控制。
2.控制总线的宽度决定了CPU对外部器件中的控制能力。
3.控制总线是控制线数量之和。

来总结一波,每一个CPU芯片都有不少管脚,这些管脚和总线相连。也就是说这些管脚引出总线。一个CPU能够引出3种总线的宽度标志了这个CPU的不一样方面的性能。

  • 地址总线的宽度决定了CPU寻址能力。
  • 数据总线的宽度决定了CPU与其余器件进行数据传送时一次数据传送量。
  • 控制总线的宽度决定了CPU对系统中其余器件的控制能力。
 
相关文章
相关标签/搜索