【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)

参考教材:
Operating Systems: Three Easy Pieces
Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau
在线阅读:
http://pages.cs.wisc.edu/~remzi/OSTEP/
University of Wisconsin Madison 教授 Remzi Arpaci-Dusseau 认为课本应该是免费的。
————————————————————————————————————————
这是专业必修课《操作系统原理》的复习指引。
在本文的最后附有复习指导的高清截图。需要掌握的概念在文档截图中以蓝色标识,并用可读性更好的字体显示 Linux 命令和代码。代码部分语法高亮。
操作系统原理不是语言课,本复习指导对用到的编程语言的语法的讲解也不会很细致。如果不知道代码中的一些关键字或函数的具体用法,你应该自行查找相关资料。

十六 数据的完整性和保护

1、 在HDD或SSD中,扇区或块的错误大致可以分为两类:潜在的扇区错误(latent sector error,LSE),以及块损毁(block corruption)。显然第二种错误更加严重。

2、 导致磁盘错误的原因有很多。对于HDD,如果遭受外力撞击,磁头会撞到盘片上,破坏数据。轻则导致LSE,重则被划过的地方全部损毁。宇宙射线则会翻转一些位。但是每个块 / 每个扇区都具有相应的错误校验码(error correcting code,ECC)来纠错,所以并不是所有的错误都是致命的。如果使用校验信息也无法纠正错误,则直接报错或干脆引发死机。
存在bug的固件也会导致错误。有问题的固件可能会将数据写入错误的位置,导致后来读取的数据不是期望的数据。这种错误有时候不可以被ECC校正。如果总线有错,也可能导致最终写到磁盘上的数据是错误的。如果能通过校验,即使存储的数据不是用户所期望的数据,磁盘也无法报错。

3、 关于磁盘错误,还有许多研究和经验导出的结论需要理解:
·一般而言,更贵的磁盘出错几率更少,尤其是企业级硬盘。
·更大容量的磁盘含有错误的几率更高(不包含错误的几率更低)。
·磁盘一旦出现错误的块,它在日后将具有更大的几率出现错误块。一个原因是对错误的块需要反复读取、写入,无疑增加了损耗。
·同一系列的磁盘,出现彻底损毁的块的几率也可以天差地别。
·随着使用时间的增加,累计损毁的块的增加速率和总数也可以大相径庭。
·负载类型和磁盘容量与块损毁的几率基本没有相关。
·LSE与块损毁弱相关。
·移动硬盘(Portable HDD)不是设计为长时间通电的。因此不使用时如果不将其安全拔出,可能会令其过早损坏。

4、 当读取出错时,磁盘会自动尝试修正,并尝试返回正确的数据。RAID出错时,需要根据所有磁盘上分布的冗余信息重建(reconstruct)阵列。当然,重建也是有可能失败的。因此一些系统增大了冗余度。比如NetApp的RAID-DP就使用2块校验盘而不是1块。如果在重建过程中又发现错误,则可以通过额外添加的校验信息来修正。当然,代价就是实现相同的有效容量需要更高的成本。不过NetApp的WAFL文件系统是日志结构的,可以降低额外成本。

5、 检测错误的常见方式是为每个扇区(块或页)生成一个校验和(checksum)。校验和通常是4或8字节的。当读取数据时,会一并计算校验和。如果不匹配,则认为该扇区出错。当然,两个完全不同的数据,其校验和也有可能相同。这时候,校验和就无法指示错误。
最常见的校验和计算函数通过异或运算来实现。具体来说,可以把一个扇区的数据看成一个二维矩阵,然后对该矩阵的每一列做一次异或运算,结果作为校验和。当然,这种方法的弊端相信大家都已经看出来了:如果一列有两个位同时翻转,这种计算方法得到的校验和不变。也就是说,错误无法被找出来。
也可以对数据做加法,将溢出直接忽略,截断的结果即为校验和。当然,如果数据恰好发生了移位,该方法检测不出错误的几率就比较高。
Fletcher校验和由John G. Fletcher发明。其差错能力近似于循环冗余检查(cyclic redundancy check,CRC),但性能更高。Fletcher校验和的成本远低于加密哈希(如SHA3-512),并且易于针对较新的CPU进行专门优化,大大加快检验速率。

6、 CRC是非常常用的校验算法。对数据D,将其对一个约定的值k(一般为2的正整数次幂)取模,结果为校验和。由于对2的幂取模可以被优化成位运算,因此CRC运算很快,常被用于网络中。

7、 有一点需要强调:没有完美的校验和。因为校验和的占用空间远小于数据本身,不可能用这么小的空间(例如:8字节)去表示需要在更大的空间(例如:4 KB)中可以存储的数据的全部组合。两个不同的数据产生了相同的校验和,这称为碰撞(collision)。虽然碰撞无法避免,但是我们可以通过选择合适的算法减小碰撞几率。

8、 如下图,校验和既可以分布在每个扇区周围,也可以单独用一片空间存放。但是,前者要求在对硬盘低级格式化(low-level formatting)时,划分的扇区大小不为2的正整数次幂。有的磁盘不支持这种对扇区的划分。对于后者,则会在每次读写的时候产生额外的一次乱序读写,因为校验和没有放在扇区旁,不能通过单次顺序读写的方式来在读写的同时对比或修改校验和。

9、 除了扇区的一般出错或损毁,有时还会发生误写入(misdirect write),即写入的实际地址与目标地址不符。解决办法也很直接:在扇区旁边加入物理标识符(physical identifier)。在读写的时候,就可以比对磁盘号和扇区号,避免写入到错误的位置。当然,图画成这样只是为了方便。事实上,这些冗余信息的长度远远小于块的长度。

10、 有时候,可能还会发生写入丢失(lost write)。写入丢失意味着虽然磁盘向操作系统报告已经写入某些块,但是实际上并未成功执行这些写入。写入丢失无法通过校验和检出,因为老数据通常是能通过校验和的检验的。物理标识符也无法检测写入丢失,毕竟绝大多数写入还是会成功写到正确地址,原有的数据亦然。
一个经典的检测写入丢失的方法是:写入校验(write verify),也称写后读(read-after-write)。在写入一项数据后,马上将其读出,确认其成功写入。显而易见,这个方法对性能的影响也相当大。
一些系统会提供额外的校验和。比如Sun的Zettabyte File System(ZFS)在索引节点和存放间接指针的块中都具有校验和。当写入丢失时,由于新的校验和已经被写入到非数据区,因此校验和与老数据不匹配,凭此能够检测写入丢失,并重新执行写入。当然,如果新的校验和也未能成功写入,就无法检测出来了。但是这种情况的出现概率很低。

11、 一些校验码检查发生在数据访问期间。但大多数时候一块磁盘上的许多数据很少被访问,因此它们的正确性就很少被检验。这些未经常检验的数据对一个侧重于可靠性的存储系统来说是一个很大的风险。于是许多系统都提供了磁盘检测(disk scrubbing)工具进行全盘检测,并试图修复错误数据。

12、 在结束本章之前,我们来估算一下校验和带来的额外开销。
首先是空间开销。假设每个4 KB的扇区或页都具有一个8字节的校验结果,额外开销约为0.195 %。
校验和可能被保存在内存中。如果检验完毕就将其丢弃,这部分开销可以忽略。但有时候为了提供额外的保护与恢复机制,校验和被保留在内存中。
每次读写的时候,一般都要检查校验和,以确保磁盘的可靠性。这一点带来的开销较多。许多系统将检验和复制尽量同时进行来解决这个问题。
当校验数据没有放在扇区旁边的时候,访问校验数据就需要进行额外的I / O操作。这一点可以通过改变设计来解决。至于全盘检测,则不需要太频繁,或者可以在闲时进行。例如深夜的时候,许多用户都已经睡去,计算机阵列负载较低,此时可以运行全盘检测。当然,随着加班时长的不断增加,这种适宜的时间段会逐渐缩水。

【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第1张图片【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第2张图片【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第3张图片【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第4张图片【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第5张图片【梳理】简明操作系统原理 第十六章 数据的完整性和保护(内附文档高清截图)_第6张图片

你可能感兴趣的:(专业课,#,操作系统原理)