<<< \color{blue}{ (●’◡’●) 点赞 <(- ●’◡’●) }
/\\ //>>>>
/__\\ // 关注加RP,AC更容易!
/ \\ //>>>>>
<<< \color{blue}{ (●’◡’●) 收藏 <(- ●’◡’●) }
算法基础课的内容在实际计算机及软件系统中有着相当广泛的应用。
本文通过实际硬件的介绍和抽象,介绍磁盘读取问题中可以运用的相关知识点。
文章最后附有知识点习题指路。
涉及算法基础知识点, 完整版见基础课内容
磁盘构建总是朝着更快,更大,更可靠的路子走的。但是这是一个不可能三角:
- 如果容量更大,损坏的区间会相应变多;
- 如果要快速恢复损坏的部分,达到可靠,就会损失一部分容量;
- 如果速度要快,就要舍弃冗余的计算,那么可靠性就会下降
磁盘阵列技术(RAID系列)试图通过多个磁盘的组合取得解决矛盾的平衡。从0开始,常见的一共七种。
让我们一项一项过。
RAID0 :
* 直写
* 容量100%
* 速度100%
* 冗余0%
最简单的想法自然是完全不管可靠和备份,直接往阵列中写。
速度快了,磁盘利用率也高了,代价则是一损俱损,毁坏后无法恢复;
RAID1 :
* 备份写
* 容量 50%
* 写速度 50%
* 读速度 200%
* 冗余 100%
要解决这个问题也很容易,我们创建一个影子磁盘,每次都写两个备份。
这样即使一个磁盘坏了,也能使用另一个工作。并且在读取的时候带来了额外的好处:可以从任意一个磁盘读取;
代价自然是过于浪费磁盘,写的速度也太慢了。
RAID2 :
* 校验码
* 容量66.7%
* 写速度 略小于 50%
* 读速度 100%
* 冗余 100%
RAID2采用了更巧妙的冗余记录方式。它记录的是一对数据的校验码。
校验码 = 数据盘1 + 数据盘2
这里磁盘将分为三份,一个校验盘,两个数据盘;校验盘记录了两个磁盘指定位置的数据之和;
假如一个磁盘损坏,通过校验码和另一个磁盘的数据,也能恢复原始数据;
写入数据之前,需要计算一遍校验码,同时写入相等大小的校验码,因此写的速度比起RAID1还会更慢一些;
顺着这个思路可以推导出RAID3,让校验码更有效的磁盘阵列技术
RAID3 :
* 校验码
* 容量 略小于 100%
* 写速度 略小于 100%
* 读速度 略小于 100%
* 冗余度 1/S
RAID3采用了汉明码做校验;它在写入时就在数据中插入校验位,读出时验证是否正确;如果正确则发给应用程序;
因此无论读入,写出,都会有额外的计算,速度比直接写入稍慢。
汉明码的设置长度有如下换算关系:
2^P >= S + P +1
其中P代表汉明码编码长度,S代表源数据长度。
这意味着,每S长度的数据,都需要额外约logS长度的校验码空间,磁盘利用率因此降低;不过仍高于RAID2中1:1长度校验码。
相应的,冗余度也会下降;之前两个bit中错一个,数据就可恢复;现在S个数据中只能错一位;
S的大小可以由磁盘自行决定,比如采用4kb或者8kb的固定块。