综述:存储系统就是存储器的组成部分,此处的存储系统主要指的是主存。 cpu直接面对的就是主存。其中的cache和虚拟存储器都是一些方法用较低的成本达到很不错的效果,前者提高了主存的存取速度,后者提高了主存的逻辑空间大小。学习的时候应该以主存整体的角度去看这存储器组成的原因。
存储器的层次结构
存储器在计算机中的作用:主存(草稿纸)、辅存(存储电子数据)、cache(主存的好帮手)
存储介质分类:磁表面(磁盘、磁带)、磁芯半导体、光存储器(光盘)
按存取方式分类:随机存储器ram(随机存取,贵)、只读存储器rom(随机读,速度慢)、串行访问存储器(不可以随机读取,便宜)
按信息保存性分类:易失性存储器(断电就空空如也)、非易失性存储器(断电还在)
存储系统为什么要分层?
为了解决大容量、高速度、低成本的均衡,所以才将存储系统分为各个层次,让需要高速度的用贵的存储器,让需要大空间的用便宜的存储器,主要利用了程序局部性原理,大大的提高了主存的效能。主要两个层次:cache和主存、主存和辅存,其实这两种分层方式都是为了服务于主存从而提高计算机整体的存取速度。
程序局部性原理:首先介绍一下什么是程序局部性原理,这个原理认为同一个程序的一个程序段所需要读取的存储器空间是连续的一部分,而不是分散于整个存储器的各个部分。所以我们计算机设计人员就可以依靠这个原理对主存进行优化。
cache和主存:
cache是用sram(静态随机存储器)组成的,速度快,功耗大。而主存是由dram构成的相比于sram的性能就差了很多。在这里计算机设计人员利用了程序局部性原理设置了cache这样一个介于cpu和主存之间的高速存储器。大家一定学过概率论中的均值的概念吧,对于计算机的极快运算速度,对于整个程序来说是可以通过概率的方式来分析cache对于我们速度提升的效率的,在计算机组成原理中,称之为cahce命中率,这里总体效能就是两者的均值。利用局部性原理,我们可以通过一些算法使cache的命中率提高到一个可观的水准,从而从cahce和主存的均值角度,是大大的提高了主存的存取速度。
主存和辅存:替
辅存就是我们现代计算机所使用的硬盘或者固态,都是平常我们用来存储我们的数据文件的,是一种非易失性存储器,有着容量大,速度慢的特点。本身主存和辅存是为了满足计算机不同功能而分别设计的,但是为了满足计算机可以运行比物理主存空间还要大的程序,我们可以牺牲一部分速度,来借助辅存的空间,来实现这一功能,在这里依旧依靠的是程序局部性原理和概率论中的均值的概念。我们把正在运行的程序的那段正在运行的程序的部分数据放入主存中,然后其他的暂时用不到的程序放在辅存中。与cache是同样的原理,这样综合下来,并不会牺牲太多的速度性能,但是计算机却可以运行比自身物理内存大得多的程序。这一层次也称之为虚拟存储器。
cache
cache地址映射
cache的使用过程中需要地址映射,映射就是把主存空间映射到cache空间中,按照某种规则把主存的地址空间映射过来。
映射方式:1)直接映射(效率低,成本低)。2)全相联映射(按照内容寻址,成本高,速度快)
两者折中形成了一种组合的方式,组相联映射,把cache分成大小相同的分组。组间使用直接映射,而组内使用全相联映射,既兼顾了速度又兼顾了成本。
cache主存块替换算法
- 随机算法(随机替换)
- 先进先出(效率一般,没有依靠程序局部性原理)
- 近期最少使用算法(效率比较高)
- 最不经常使用算法(效果同上)
cache写策略
当cache被cpu命中的时候,需要把更新的数据写回主存,毕竟cache只是主存的一个草稿纸。这样就有不同的写回策略,一种是全写法,另一种是写回法,前者是直接将cache覆盖到主存中,后者则是用了一些算法的方式,可以带来一些好处,算法只修改cache中的数据,只有当cahce数据块将要被替换掉的时候才写回到主存中。这种算法让每个数据块都要设计一个脏位,来检测是否被修改过。
虚拟存储器
虚拟存储器将主存或辅存的地址空间统一的进行编址。主存和共同工作的辅存共同构成了虚拟存储器,这对应用程序猿是透明的,就仿佛拥有了超大的内存空间。用户编程的时候使用的都是逻辑地址,逻辑地址空间要远远大于物理地址空间。辅助硬件帮助完成逻辑地址到物理地址的映射,而这一映射过程就相当于cache中的命中的过程,当选择的逻辑地址所对应的物理地址在主存中,就给出主存的地址,直接使用即可。而主存中没有的话就需要去辅存中把整页调入到主存中。
页式虚拟存储器
虚拟空间和主存空间都被分成大小同等的以页为单位的空间,就相当于本来有把一个100人的班级分成十个小组,这个班在外人看来就是十组,而组内的事情,外人是不用管的。所以计算机将庞大的存储空间分成最小单位更大的页空间。
主存中的页称之为实页,而虚存中的页称之为虚页,从此以后,将以页为单位来管理空间,这样可以更高效的调入调出。虚拟地址分为虚页号和页内地址(用来指明页内的谁谁谁)。在主存中存放着一个页表,来实现虚页号和实页号的转换。cpu访存的时候优先访问页表。
段式虚拟存储器
由于页是大小相等的单位,不具有逻辑性,所以我们依靠逻辑分段,生成了一个段位单位的存储器。把虚拟地址分为段号和段内地址,再同样的设置一个段表。但是显然,这样做会失去页的优点,所以emmmm
段页式虚拟存储器
程序——若干段——若干页
现在我们把段和页相结合,段负责逻辑,而页作为段下面的最小的单位供段管理。段的长度必须是页长度的整数倍。虚地址变为段号、段内页号、页内地址,这样做有很多的优点,缺点是需要两次查表系统开销比较大。所以为了缓解这个缺点,所以emmmm又使用了雷同的方法。向下看
快表TLB
依旧是根据程序局部性原理,把这段时间常常要访问的段表页表放入cache中,可以有效的提高访存速度。所以才cpu的访存顺序变为:快表——页表——转换为物理地址后——cache——主存。
虚拟存储器与cache的对比
相同点
l 都是为了提高主存性能
l 都把数据分成小信息快
l 都有映射、替换算法、更新策略问题
l 都依据程序局部性原理
不同点
l cache解决速度问题,虚拟解决容量问题
l cache全部硬件完成,虚拟os和硬件共同实现,对系统程序员不透明,对应用程序员透明
l 不命中时,虚拟影响比cache大
l 虚拟中的辅存cpu是不能直接与之沟通的,所以必须要把辅存中的页调入主存。
l
</div>