文章首发于浩瀚先森博客http://www.guohao1206.com/2016/12/07/1248.html
说到计算机上的存储器,很多人第一反应是硬盘,然后是内存。
其实在计算机上除了硬盘和内存属于存储器以外CPU寄存器和Cache他们也是属于一类的。
对于存储器我们在乎的无外乎两个属性----“快”和“大”,我们希望存储器容量越大越好,传输速度越快越好,然后鱼和熊掌不能兼得。由于现在硬件技术的限制,我们能制造错容量虽小但是速度很快的存储器,也可以制造出容量大但是读取速度相对慢的存储器,但是不能制造出容量大而且速度也快的存储器(当然这是我们希望的)。所以在现代计算机中我们把存储器分为若干级别,称为Memory Hierarchy。按照距离CPU由近到远的顺序依次是CPU寄存器 –> 一级Cache –> 二级Cache –> 内存 –> 硬盘
1. CPU寄存器
CPU寄存器是距离CPU最近的一个存储器,因为它就位于CPU执行单元中(CPU执行单元,CPU核,CPU芯片抽象点描述的话大概如下图,参考)。它实际上就是一组数字电路的名字,由多个触发器(Flip-flop)组成。每个触发器保存一个Bit的数据。CPU寄存器掉电数据会丢失。它是访问速度最快的存储器,也是容量最小的存储器~CPU寄存器通常有几个到几十个,具体使用哪个寄存器是由指令决定的。
2. Cache
Cache访问速度也比较快,距离CPU执行单元也比较近,仅次于CPU寄存器,因为它不在CPU执行单元中,它在CPU核中,和MMU一样。Cache分为一级Cache和二级Cache,一级Cache离CPU更近些,容量比二级Cache要稍小点。二级Cache距离物理内存更近些。Cache和内存都是有RAM(Random Access Memory)组成,可以根据地址访问。不同的是Cache是由SRAM(Static RAM)组成,内存是由DRAM(dynamic ram)组成。DRAM容量比SRAM大,但是速度慢。
Cache的作用是缓存最近访问过的内存数据。当CPU要访问内存数据的时候,会发给个Virtual Address,这个时候不会直接去访问内存拿数据,一级Cache会拿着这个地址在自己缓存的数据上查找是否存在这样的数据,如果存在就可以直接使用,因为一般Cache访问的速度是内存的几十倍,充分的利用Cache的话可以最大化提高计算机性能。如果一级Cache上没有找到缓存数据并且计算机上还配置了二级Cache的话,这个时候二级Cache会根据MMU给的PA(physical address)查找是否存在缓存数据,如果仍然没有的话就只能访问内存了,但是访问内存数据的时候并不是说需要几个数据就拿几个数据,而是复制相邻的一段数据Cache Line缓存起来。一级Cache和二级Cache的区别在于一级Cache是根据VA查找数据,二级Cache根据PA查找的。Cache的所有操作都是由硬件进行的,并非指令!
3.内存
内存是位于CPU处理器芯片之外的一颗芯片,它与CPU通过地址和数据总线相连,利用地址进行访问,掉电数据也会消失。内存是由DRAM组成。
注意的地方:如果计算器启动MMU的话,程序指令的访问地址是VA,而访问内存的地址的PA,是经过MMU转化而来的。
4. 硬盘
硬盘大家都很数据,容量大,访问速度慢。驱动程序通过设备总线控制器访问。由于硬盘的访问速度慢,所以操作系统一般一次性读取硬盘几个页的数据缓存下来使用。另外硬盘掉电数据不会丢失~
参考:《计算机体系结构基础》