目录
一. 外部存储器
(1)磁盘存储器
1.磁盘的组成
2.磁盘的性能指标
3.磁盘地址
4.硬盘的工作过程
5.磁盘阵列
(2)固态硬盘(SSD)
二. Cache基本概念与原理
三. Cache和主存的映射方式
(1)全相连映射
(2)直接映射
(3)组相联映射
四. Cache的替换算法
(1)随机算法(RAND)
(2)先进先出算法(FIFO)
(3)近期最少使用算法(LRU)
(4)最不经常使用算法(LFU)
五. Cache的写策略
(1)Cache写命中
1.写回法
2.全写法
(2)Cache写不命中
1.写分配法
2.非写分配法
六. 虚拟存储器
(1)页式存储器
(2)虚拟存储器
1.页式虚拟存储器
2.段式虚拟存储器
3.段页式虚拟存储器
计算机的外存储器又称为辅助存储器,目前主要使用磁表面存储器。
所谓“磁表面存储”,是指把某些磁性材料薄薄地涂在金属铝或塑料表面上作为载磁体来存储信息。磁盘存储器、磁带存储器和磁鼓存储器均属于磁表面存储器。
磁表面存储器的优点:
磁表面存储器的缺点:
存储区域:一块硬盘含有若干个记录面,每个记录面划分为若干条磁道,而每条磁道又划分为若干个扇区,扇区(也称块)是磁盘读写的最小单位,也就是说磁盘按块存取。
硬盘存储器由磁盘驱动器,磁盘控制器和盘片组成。
①磁盘的容量:一个磁盘所能存储的字节总数称为磁盘容量。磁盘容量有非格式化容量和格式化容量之分。
②记录密度:记录密度是指盘片单位面积上记录的二进制的信息量,通常以道密度、位密度和面密度表示。
③平均存取时间:平均存取时间=寻道时间(磁头移动到目的磁道)+旋转延迟时间(磁头定位到所在扇区)+传输时间(传输数据所花费的时间)。
④数据传输率:磁盘存储器在单位时间内向主机传送数据的字节数,称为数据传输率。
假设磁盘转数为r(转/秒),每条磁道容量为N个字节,则数据传输率D=rN。
硬盘的主要操作是寻址、读盘、写盘。每个操作都对应一个控制字,硬盘工作时,第一步是取控制字,第二步是执行控制字。
硬盘属于机械式部件,其读写操作是串行的,不可能在同一时刻既读又写,也不可能在同一时刻读两组数据或写两组数据。
RAID ( Redundant Array of lnexpensive Disks,廉价冗余磁盘阵列)是将多个独立的物理磁盘组成一个独立的逻辑盘,数据在多个物理盘上分割交叉存储、并行访问,具有更好的存储性能、可靠性和安全性。RAID的分级如下所示。在RAID1~RAID5的几种方案中,无论何时有磁盘损坏,都可以随时拔出受损的磁盘再插入好的磁盘,而数据不会损坏。
固态硬盘的结构:
固态硬盘以块(block)为单位"擦除",擦干净的块,其中的每页都可以写一次,读无限次。所以在修改一个页的数据时,先把块内其他页的数据复制到别的块,然后把原来块擦除,最后向其他数据复制到的块写入新页,闪存翻译层会修改地址和物理位置的映射关系。所以固态硬盘的写操作远远慢于读操作,此外固态硬盘支持随机访问。
实际上,Cache被集成在CPU内部。Cache用SRAM实现,速度快,成本高。
程序访问的空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的(Eg:数组元素、顺序执行的指令代码)。
程序访问的时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息(Eg:循环结构的指令代码)。
基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。
在矩阵按行存储的情况下,程序B的表现就比程序A“差”,因为它违背局部性原理。
设为访问一次Cache所需时间,为访问一次主存所需时间。命中率H:CPU欲访问的信息已在Cache中的比率,则缺失(未命中)率M= 1-H
Cache—主存系统的平均访问时间为(设先访问Cache,若Cache未命中再访问主存):
如果设Cache和主存同时访问,Cache找到数据立即停止访问主存:。
基于局部性原理,不难想到,可以把CPU目前访问的地址“周围”的部分数据放到Cache中。如何界定“周围”?——将主存的存储空间“分块”,如:每1KB为一块。主存与Cache之间以“块”为单位进行数据交换。
注:操作系统中,通常将主存中的一个“块”也称为—个页/页面/页框”,Cache中的“块”也称为“行”。
如何区别Cache和主存数据块的映射方式?
因为是和Cache总块数取余,所以从二进制的角度看,主存块号后几位就是Cache块号,所以标记主存块号地址可以少标记几位:
和直接映射类似:
抖动现象:频繁的换入换出现象(刚被替换的块很快又被调入)
LRU算法基于“局部性原理”,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。若被频繁访问的主存块数量>Cache行的数量,则有可能发生抖动。如:1,2,3,4,5,1,2,3,4,5...
LFU算法:曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块),并没有很好地遵循局部性原理,因此实际运行效果不如LRU。
解决Cache与主存内容可能不一致的情况。此时分两种情况:
写回法(write-back)——当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存,只有当此块被换出时才写回主存(增设一个“脏位”表示其是否被修改)。写回法减少了访存次数,但存在数据不一致的隐患。
全写法(写直通法,write-through)——当CPU对Cache写命中时,必须把数据同时写入Cache和主存,一般使用写缓冲(write buffer)。访存次数增加,速度变慢,但更能保证数据一致性。
使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞。
写分配法(write-allocate)——当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。
非写分配法(not-write-allocate)——当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。
页式存储:一个程序(进程)在逻辑上被分为若干个大小相等的“页面”,“页面”大小与“块”的大小相同。每个页面可以离散地放入不同的主存块中(否则,在内存种找到连续的,空闲的块,会使得内存利用率很低)。
逻辑地址与物理地址:
页表:逻辑块号→主存块号。CPU执行的机器指令中,使用的是“逻辑地址”,因此需要通“页表”将逻辑地址转为物理地址。页表的作用:记录了每个逻辑页面存放在哪个主存块中。
查询页表需要进行一次访问内存的操作。仿照Cache和内存的思想:Cache——快表,存经常访问的页表项;页表——就是上面的页表。但注意区别:快表中存储的是页表项的副本;Cache中存储的是主存块的副本。
增加了快表之后,CPU访存如下:
应用程序的使用:也不必调入全部数据到内存中。
把程序按逻辑结构分段,每段再划分为固定大小的页,主存空间也划分为大小相等的页,
程序对主存的调入、调出仍以页为基本传送单位。每个程序对应一个段表,每段对应一个页表。
虚拟地址:段号+段内页号+页内地址