硬盘与磁盘冗余阵列
这篇博客位于:http://xubenbenhit.github.io/HardDiskAndRAID.html
先来扯淡吧,圣诞节前几天一直在看一些论文,磁盘相关的,今天索性一次性写完,不然看了又忘记了。
1. 硬盘
硬盘的基础知识就不赘述了,什么磁头磁道扇区等等啦,看下图一目了然,不了然的话自己看书去。
然后有一点需要明确一下,那就是磁盘保证对于扇区的更新操作都是原子的。每次写扇区要么全写进去了要么全没写进去。
下面写一些磁盘的调度算法吧。调度嘛,就是说如果有多个请求,磁盘怎么依次处理这些请求。有一个大的准则,持续时间短的请求先执行(shortest job first),这个也很好理解,毕竟使得所有请求的平均等待时间最小。但是,这个很难做到,因为很难预先知道一个请求执行所需要的时间。于是乎就有了下面的近似算法了:
-
Shortest Seek Time First(SSTF)
这个就是,下一次执行的磁盘命令是选择最近磁道上的请求命令,但是这个也很难做到,因为操作系统根本看不见磁道啊,它也不知道磁盘的空间几何分布,所以实际上有个替代的,nearst-block-first(NBF),物理地址最相近的最先执行。
听起来这个NBF调度应该是不错的,但是有一个特殊情况,就是说距离当前磁头位置比较远的那个磁盘请求可能“永远”也没法被调度到。这就是调度中经常需要考虑的“饥饿”问题。 -
Elevator
这就是升降机算法了。将当前所有的磁盘请求命令按照NBF调度依次执行,执行过程中收到的磁盘请求暂时不处理。这就解决了上面的饥饿问题了。 -
Shortest Positioning Time First(SPTF)
这个呢,是考虑到了实际的磁盘寻址时间,因为你物理地址相近不代表磁头寻址所需时间短,还得考虑一个磁盘转向问题。这是因为在现在的磁盘中,一般而言,寻址所需的磁臂移动时间和磁盘转动时间是相当的,于是乎,才需要考虑磁盘转向。当然了,关于磁盘转向这些,交给OS来做就太细致繁琐了。所以实际上来操作的时候:
首先由OS按照自己的调度算法给出几个候选人,然后交由磁盘自己的调度算法(SPTF)来具体调度;其次,磁盘调度还会做I/O merging操作,比如说有两个请求分别请求两个磁盘块,而这两个磁盘块之间是相邻的,于是乎就可以将这两个磁盘请求合并;最后,磁盘也并不是说只要有请求就不会休息,事实上,可能稍微等等会更好(Anticipatory disk scheduling),当然了,这些设计都需要非常注意技巧,不是那么简单的,这里有个概念就可以了。
2. 廉价磁盘冗余阵列(RAIDs)
RAID的英文全称是Redundant Arrays of Inexpensive Disks。磁盘阵列就是将几个磁盘连接在一起,用户可以并行访问这些磁盘,从而提高效率。而冗余阵列这个设计的主要目的就是在于通过提供某种形式的冗余来增强阵列的安全性,不至于说很多磁盘只要有一个坏了就会对数据造成损失。
直接来吧,下面是RAID0,RAID1,RAID4,RAID5:
-
RAID0
这个最简单了,原始的阵列,压根没有冗余,所以任意一个磁盘坏了数据就会出问题,直接上图了。图中的A,B,C,D等等指的是磁盘块,下同。
-
RAID1
这个呢,其实就是通常意义上的镜像,分为两种,下面这个是RAID10,
看得出来区别吧,镜像的设计比较可靠,至少来说一个磁盘坏了没有什么关系,而最理想的情况下一半数目的磁盘坏了都没事。 -
RAID4
先直接看图吧:
哈哈,多了一个校验磁盘,这个盘的数据是怎么来的呢?前三个磁盘的数据按照 位异或 的操作就可以计算出来校验磁盘的数据了。这样有个好处,就是说任一磁盘损坏了,我们都可以利用剩下的三个磁盘通过 位异或 操作来恢复,厉害吧。但是这样设计有个缺点,每次写数据的时候需要同时也更新对应的校验磁盘中的数据,而言将校验块统一放置于校验磁盘中,也就意味着每次写操作都需要访问校验磁盘,如此一来,写操作的并行就不存在了,于是,聪明的人民设计了RAID5。 -
RAID5
先直接看图吧:
下面来说说这几个级别的RAID的读写效率吧,抗损坏能力之前已经说了。这个吧,说起来太复杂了,我会在后面留下参考资料,这里就直接给出结论了,对照着看吧。
-
3. 参考文献
❝❞
- http://pages.cs.wisc.edu/~remzi/OSTEP/file-raid.pdf
- http://pages.cs.wisc.edu/~remzi/OSTEP/file-disks.pdf
- http://www.thegeekstuff.com/2010/08/raid-levels-tutorial/
- http://www.thegeekstuff.com/2011/10/raid10-vs-raid01/
- http://www.thegeekstuff.com/2011/11/raid2-raid3-raid4-raid6/