思维导图
存储器是存储数据的硬件设备.我们既希望其有超高的速度,也希望有超高的容量,还想要便宜.但是在同样的容量下,不同访存速度的存储器价格相差极大,这又与适当的价格形成了矛盾.解决办法就是对存储器分层,这是一种折中的办法,利用部分高速度而低容量的存储器和低速度而高容量的存储器互相配合,从而组成了具有大容量和高速度优点的存储器.
打个比方来说,如果我们需要去图书馆查找某一方面的资料,会将n本书抽取,然后放在书桌上,一般情况下,需要的资料很多都在放在书桌上的书中(空间),而且,某一本书会被重复性的阅读(时间).这就是局部性原理.利用局部性原理,设计了处理存储器层级结构.
有多层次的存储器就意味着他们会进行数据的交换.而块/行是基本单位
按照功能来说,处理器访存信息需要先访问存储器层次中高速度的那一层,如果在这一层中找到了所需的数据,就称为命中,没有则称为缺失,若发生缺失,就会在下一层次的存储器中寻找数据.
存储器主要有四类,最快价格也最贵的是SRAM,主要用来实现cache层.价格和速度较低的是DRAM,主要用来实现主存储层次.以上两者是易失性的,速度和价格更低的是磁盘,其访问速度最慢,但是价格便宜,容量大,所以一般用来实现存储大量数据的层次.此外还有闪存,,主要用于移动存储设备.此两者是非易失性的.
cache也成为高速缓存,利用SRAM实现.会临时性的储存最常用的数据,而访问这些数据只需要相当短的时间.在实际的应用中,经常使用分离cache以处理指令和数据
cache的组织方式是指cache的块与主存储器(后文称主存)的块之间的映射方式,不同的映射方式有不同的优缺点.
以直接映射举例,如果cache中块的数量是二的幂,则对应方式很简单,只需取主存地址的低位相匹配即可(即块号对cache块数求余数).例如,cache有8个块,映射方式如下(在组相连中,对应组的方式是块号对组数求余数.):
因为cache中的一个块会对应主存中的多个块,所以需要一个标记字段用来判断此时cache中的数据是否是所请求的数据.如上例,cache中的一个块对应主存中的四个块,所以需要判断.
在块中,还需要一个字段来判断确实没有有效的数据,比如,当处理器刚启动时,cache中没有数据,或者在执行了一些指令后,cache中依然没有数据,此时标志应该被忽略,否则,如果标记有效,就会取到空的数据.这个判断需要一个位的长度.
如果说直接映射中,主存中的地址仅仅会对应于cache中的一个地址,那么,在以全相连方式组织的cache中,主存中的每一个地址可以对应于cache中的任何一个位置,即多对多.
以直接映射举例,容量为8个块的cache,被方位9次.
下图是表明请求地址是如何匹配cache的,请求地址的低位会被用于定位所请求数据可能存在于哪一个cache的块中,高位则和标记比较,用于判断现在此cache块中的数据是否为请求的数据,如果是则命中,如果不是,则表示发生了一次缺失.
以下是具体的访问请求:
以下是具体的访问步骤:
当处理器需要向存储器中写入数据时,则会进行写操作处理.以保证cache和主存数据的一致性.写操作处理主要有两种,写直达和写回
2.4.1写直达
写直达是比较简单的写入处理,它会同时更新cache和主存中的数据,但是写直达有较大的缺点,因为需要向主存中写入数据,所以会花费相当大量的周期处理这一操作
在写直达的基础之上,可以进行一点优化,使用写缓冲,此时数据会被写入cache和写缓冲中,写操作处理结束,在这之后,处理器会将写缓冲当中的数据写入主存中.
2.4.2写回
写回是另一种写操作的处理方式,比起写直达来说复杂得多.
设计人员有时会采用平均存储器访问时间(AMAT)作为评价cache性能的标准.
2.5.1组织块以优化性能
提高适当相连度可以降低缺失率,比如,在一个cache中有8个块,此次请求的数据已经在cache中,直接映射可能会发生缺失,全相连则不会发生缺失,组相连则在二者之间.当然,提高了相连度会使访问时间增加,所以需要适当的取舍.
2.5.2并行查找以优化性能
在组相连中,通过索引(低位)可以找到组的位置,然后需要遍历组所有块的标记以查询数据,此时可以使用并行的查找方式优化性能
2.5.3改进替换块的选择方式以优化性能
当相连度大于1时,发生了缺失需要将cache中的一个块替换以储存从主存中读取的数据,此时可以替换最近最少使用的块以降低缺失率从而提高性能
2.5.4使用多级cache以优化性能
使用在已有cache的基础之上,多增加一级cache,其容量较一级cache高,当一级cache缺失时访问下一级的cache,以降低缺失代价,缺点则是会增加访问时间.
2.5.5通过分块以优化性能
软件通过对cache中的数据进行重用,提升了数据的时间局部性并因此降低了缺失率.
存储器的层级结构当然不仅有cache和主存两层,实际上,可以在主存之下,还有磁盘,利用实现cache和主存的方式,也可以实现主存和磁盘这两层存储器结构,他们实现的原理是相同的.虚拟存储器以前被设计出来主要的目的就在于消除一个小而受限的主存容量对程序造成的影响.但是,渐渐地主要的功能变为了允许云计算在多个虚拟机之间有效而安全的共享存储器,
在虚拟存储器中,使用的术语发生了一些变化,在虚拟存储器中,块被称为页,访问缺失被称为缺页,主存中的地址为称为物理地址,其主要的工作原理就是将处理器产生的虚拟地址结合软硬件转换为物理地址,然后用来访问主存.此过程为称为地址转换.地址转换加强了各个程序地址空间之间的保护
以下是层次图:
3.1.1页的查找
为了快速定位物理地址,会在主存中维护一个称为页表的数据结构,根据虚拟地址找到物理地址.在处理器中存在一个页表寄存器,保存页表的起始地址.每一个进程都会拥有自己的页表.
页表如下图:
3.1.2缺页故障
如上图,如果页表的有效位关闭,就会发生缺页故障,此时操作系统会获得控制权,它会在下一级存储层次中找到该页,然后将其放到 主存中.因为不知道什么时候某一页会被替换出去,所以会在磁盘中维护一个交换区.同时在维护一个数据结构维护每个虚拟页在磁盘上册存放位置,这个数据结构可能是页表的一部分.
如下图:
3.1.3写操作
虚拟存储器对下一层次的存储器的写操作会花费上百万个时钟周期,所以写直达不适合,采用写回机制.此时会在页表中添加一个脏位,所以也有了脏页.
为了快速的获得虚拟地址和物理地址的映射关系,会在处理器中包含一个特殊的cache以跟踪最近使用的地址变换.,这个地址转换cache被称为快表(TLB).所以地址转换会先查询快表,如果没有表示发生了一次TLB缺失,就会去主存中查找,如果命中,会将会将地址变换装载到TLB中,重新访问,如果发生缺失,则需要进行缺页处理,必须完成如下步骤:
注:本篇文章由《计算机组成与设计》第五章-大容量和高速度:开发存储器层级结构 总结而来,由于本人非计算机专业出身,许多知识实在是理解不能,总结有相当多的遗漏,乃是我看不懂所致,更别说其中内容肯定有大量的理解错误,万望大家提出批评,我好改正。