
(以下内容全部来自上述课程)
目录
- 外部存储器
-
- [1. 磁盘存储器](#1. 磁盘存储器)
-
- [1.1 组成](#1.1 组成)
- [1.2 性能指标](#1.2 性能指标)
- [1.3 磁盘地址](#1.3 磁盘地址)
- [1.4 磁盘阵列](#1.4 磁盘阵列)
- [1.5 小结](#1.5 小结)
- [2. 固态硬盘(SSD)](#2. 固态硬盘(SSD))
-
- [2.1 小结](#2.1 小结)
- [2.2 机械硬盘vs固态硬盘](#2.2 机械硬盘vs固态硬盘)
- [2.3 结构](#2.3 结构)
- [2.4 拓展](#2.4 拓展)
- Cache
-
- [1. 工作原理](#1. 工作原理)
- [2. 性能分析](#2. 性能分析)
- [3. 问题](#3. 问题)
- [4. 小结](#4. 小结)
- Cache和主存的映射方式
-
- [1. 全相联映射](#1. 全相联映射)
- [2. 直接映射](#2. 直接映射)
- [3. 组相联映射](#3. 组相联映射)
- [4. 小结](#4. 小结)
- Cache替换算法
-
- [1. 随机算法(RAND)](#1. 随机算法(RAND))
- [2. 先进先出算法(FIFO)](#2. 先进先出算法(FIFO))
- [3. 近期最少使用算法(LRU)](#3. 近期最少使用算法(LRU))
- [4. 最不经常使用算法(LFU)](#4. 最不经常使用算法(LFU))
- [5. 小结](#5. 小结)
- Cache写策略
-
- [1. 写命中](#1. 写命中)
-
- [1.1 写回法](#1.1 写回法)
- [1.2 全写法](#1.2 全写法)
- [2. 写不命中](#2. 写不命中)
-
- [2.1 写分配法](#2.1 写分配法)
- [2.2 非写分配法](#2.2 非写分配法)
- [3. 多级Cache](#3. 多级Cache)
- [4. 小结](#4. 小结)
外部存储器

注意:写入数据是1bit1bit写入的,所以要连续的读出来,中间还需要其他的零件才能实现。
可以设定SN是1,NS是0,所以就可以按照二进制写入数据。

1. 磁盘存储器
类似于唱片,可以拨动磁头只能存储位置。
左侧图片是磁盘驱动器,右侧图片是磁盘控制器。

1.1 组成
- 磁头:磁盘的面。
- 柱面数:磁盘面儿上的圈圈。(因为好多个磁盘面叠起来就是一个圆柱体)
- 扇区数:切割面出现的扇形区域。

一个磁盘的正反面都可以涂上磁层,磁头的上下两端都可以读取数据,第一个磁盘上没有磁头是因为这个磁头只能读单侧,造价成本太高,所以第一层上面就没有磁头。

1.2 性能指标
- 容量:格式化容量的一部分可以拿去装别的东西,所以一般它的容量比非格式化容量小。
- 密度:每个圈圈上的信息量都是相等的,所以大的圈信息分布得就稀疏,小的圈就密集,也越难制造。
- 道密度:半径-->图中右边儿的蓝色线,左边儿的蓝线是磁头
- 位密度:一圈儿-->图中红色线
- 面密度:道密度*位密度

- 寻道:把磁头放到想查找的信息的那个圈儿上。
- 旋转延迟时间:不一定磁头刚好放在信息弧上,所以得等他自己转过来。
- 传输时间:划过信息弧的时间。


1.3 磁盘地址

因为读写都是一比特一比特来的,所以就需要用并串变换电路把数据串在一起。

1.4 磁盘阵列
数字越大的版本,性能越好。
RAID0:因为数据都只有一个版本,所以无冗余也没有校验。


RAID1:相同的数据存两遍。

RAID2:Disk0~3存信息,Disk4、5、6是校验位,所以有纠错功能。


1.5 小结

2. 固态硬盘(SSD)

2.1 小结

2.2 机械硬盘vs固态硬盘
ps:机械硬盘是磁盘的一种。

2.3 结构
- 固态硬盘-->块号
- 机械硬盘-->扇区
- 芯片包含块,块包含页。

如果想擦除数据,是整个块都擦除的,如果你只想写入这个块的某一页的数据,那就需要把不用动的数据复制到另一个块内,擦除原来的块上的数据,把新的页的数据写入后块的那一页中。

2.4 拓展

Cache
Cache可以让访问速度更快。

1. 工作原理
就是类似于你买快递,买的东西被一个地区一个地区传递,最后送到你的手里。

简单来说,就是一个东西,你可能某个时间段天天用,但是又可能过一阵就不用了,啥时候能用上都说不准 ,所以你是把它随身携带呢,还是放在别的地方呢?(涉及Cache替换算法)

2. 性能分析
分为两种情况:
- 先访问Cache,找完发现没有再找内存
- Cache和内存同时找
显而易见,第二种更有效率一点儿


3. 问题
Cache和主存的块的容量必须一样,也就是原封不动复制一整个东西备用。
就好比,你买了两只唇膏,有一天你想用,刚好随身(Cache)有,没有的话就只能去家里(内存)找了。
- 主存地址共22位:4M=222
- 块内地址10位:1K=210
- 块号12位:4M/1K=222-10=212

沿用上述的情景-有待解决的问题: - 对应关系:可以说是我的唇膏应该放在我身上的哪个口袋里
- 内存:我身上的兜都满了,还想带别的东西,那么之前随身携带的东西应该怎么办
- 一致性:用文本理解吧,唇膏不太恰当

4. 小结

Cache和主存的映射方式
想想你身上的兜有很多,那么怎么分清每个兜里都装了什么东西呢?这就需要标记 了,相当于便签,记录兜里的东西是什么。
有效位 就是用来记录你的兜里有没有放东西。

1. 全相联映射
我想带的东西,身上的兜随便儿放。
- 主存地址28位:256M=228
- 块内地址6位:Cache行长64B=26B
- 主存块号22位:256M/64B=228-6=222
- 主存块号-->蓝色标记-->22位
- 块内地址-->黑色-->6位
- 先根据蓝色标记找到具体的块号,块号中不还分了好多地址么,然后再在这个块中寻找固定的地址。


2. 直接映射
自己的哪个兜都固定 放啥,下次放同样的东西就还放这个兜里。
当然,缺点就是如果没有固定的东西,那这个兜就只能空着了,浪费空间。

因为有了固定性 ,所以主存块号的后三位(23块Cache),就证明了自己的东西放在了哪个兜,你东西还没放兜里呢,就直接翻兜肯定啥都没有,所以可以把后三位去掉,剩余前19位,就可以去找主存的大体位置,然后再根据块内地址精准定位。


3. 组相联映射
就是我这个兜固定放这一类 的东西,好比这个兜只能放唇膏,我这个牌子的唇膏用完了,还可以放另一个牌子的唇膏。
和直接映射的固定类似,这里的Cache被分成了22组,所以后两位就代表哪两个兜用来放这一类的东西,所以用前20位作为标记就可以。


4. 小结

Cache替换算法



1. 随机算法(RAND)
纯随机,无规律。

2. 先进先出算法(FIFO)
非常丝滑地向右下斜着挨个儿替换。(看红色字体)

3. 近期最少使用算法(LRU)
这里就需要用到计数器,用来记录哪个数据一直没有被用到,就直接把它踢出去。
好像数字炸弹啊。
做题的话:
一到要提出数据的时候,就从他前面画一个线隔断,往前找,最近的三个谁没出现就踢谁。

规则非常人性化:
- 被访问了的数据的计数器就清零,比它低的就都+1,其余不变(是因为再大也大不到哪儿去了,这个其余就是最大的)
- 如果有地方放,那就愉快地直接放,计数器归零,其他的都+1
- 如果没地儿放,就把计数器最大数字的踢出去,新加入的为0,其余+1.


但是!因为你刚拿出去的东西说不定又马上想用了,所以...这就是缺点。

4. 最不经常使用算法(LFU)
这次的计数器记录的是数据的使用次数 。
空间不够了,谁用得最少,就给谁踢出去。

如果碰到计数器相等且都是最小,可以用先进先出,或者直接淘汰行数最小的。

但是!现在经常常用的,以后可能用到的少,所以...这就是缺点。

5. 小结

Cache写策略


1. 写命中
1.1 写回法
只修改Cache,替换的时候再修改主存。

1.2 全写法
Cache和主存同时修改。

Cache和主存同时修改,但是是利用写缓冲,将修改内容写到写缓冲里,然后再写入主存中。


2. 写不命中
2.1 写分配法
想修改谁,就把谁调入Cache里修改。
搭配写回法就是Cache改了,等它被替换的时候再修改主存。


2.2 非写分配法
想修改谁就直接在主存里修改了。

3. 多级Cache
无限靠近CPU,就无限快(bushi)


4. 小结
