原文:存储技术之磁盘工作原理
存储技术如今已经越来越重要,而且在云计算时代,涌现出了很多专注于云存储的厂商。存储技术本身也十分复杂,从硬件到协议到软件到接口几乎覆盖计算机科学的方方面面。笔者借助《大话存储II》这本书,开始了这块知识空白的补充。本文的图片均来源于网络。
盘片的机械原理
磁盘由众多盘片构成,将磁粉溅镀到基板上就形成了盘片,基板要求极高,不可有任何瑕疵。磁粉通过N\S磁极来表示0和1,这个数据需要磁头来读取和写入。磁头在读取数据时不与盘片接触,但是又要越近越好,因为太远无法感应到磁粉的极性,这个距离现在已经可以做到人类头发丝的千分之一了,真是足够精密了!盘片有电机带动做高速旋转,通常听见的7200转/分,就是指盘片每分钟转过的圈数,这样磁头就相对盘片做圆周运动,也就能够按磁道来读取数据。除此之外,磁头的机械臂还由步进电机控制,沿盘片半径做直线运动,以读取不同磁道的数据。一块磁盘拥有多个盘片,每个盘片的上下面都可以读写数据,而且每个盘面都有对应的磁头读写。例如,如果一块磁盘有4个盘面,那么磁头就有8个,分别编号0-7。虽然有多个磁头在工作,但是同一时刻只能有一个磁头在读写数据
。 在整个数据的读取过程中,机械臂的移动称为寻道
,寻道的时间和盘片旋转的时间远大于半导体电路的数据传输时间,是阻碍磁盘读写性能的最大因素。
盘片的逻辑结构
- 磁道:上面提到了磁道的概念,磁道就是盘面上的一个个同心圆,一个盘面可以有成百上千个磁道。磁道从最外圈向内圈从0开始编号。每个磁道的宽度取决于磁头的大小,磁头如果能够做到原子级别的话,那么磁道的数量将可以大大增加,存储容量将几何倍数提升。
- 扇区:磁道又被划分为一段段的圆弧,称为扇区,每个扇区中的数据总是同时读取或写入,是磁盘的最小读写单位。由于外圈的扇区拥有更高的线速度,所以外圈的数据读写要比内圈快一些。
- 低级格式化:在盘片上划分磁道和扇区称为低级格式化
- 高级格式化:对磁盘上的数据进行文件系统标记称为高级格式化
- 柱面:所有盘面上的同一磁道,构成柱面。由于
寻道
的开销极大,所以,索性在写入数据的时候,是按照柱面进行的,只有一个柱面上的若干个磁头都将各自的磁道写满后才换柱面写。
扇区与寻址
扇区是最小读写单位,所以每个扇区都有自己的编址方式,这个编制被记录在每个扇区的头标
中。编制方式分为两种:
- CHS:早期使用的编址方式,读写时提供的CHS即是:柱面号(Cylinder)8bit、磁头号(Header)10bit、扇区(Sector)6bit的组合。而如果每个扇区是
512B
,则这种编制方式最多存储255×1023×63×512/1048576=8G数据 - LBA:使用线性编址,对外提供扇区号从1开始编号,而编号与CHS的对应关系有磁盘自身维护
扇区的头标还记录了扇区中的数据是否可靠,头标以CRC值结束。
在LBA编制方法中,如果扇区号按照1、2、3、4、5顺序绕着磁道编号的话,可能会在电路处理一个扇区的数据期间,下一个扇区由于磁盘运转速度太快而跳过了,这样就需要再转一圈才能读回来。解决这个问题的方法是交叉因子(Interleave)
,即编号不是连续的,而是1和2中间可能隔开几个扇区,用来分隔的扇区本身可能是编号靠后的扇区。例如按照2:1的交叉因子编号就是1、10、2、11、3、12、4、13、5、14...,而3:1的交叉因子编号就是1、7、13、2、8、14、3、9、15、4、10、16、5、11、17、6、12。本质上,设置交叉因子,是由于硬盘控制器速度无法跟上转速,而由于盘片的外圈和内圈线速度不同,还出现了在不同的磁道上采用不同的交叉因子的做法。
目前扇区的大小已经调整为4KB,这是因为上层操作系统定义的文件系统一般是以4KB作为一块,这两者的匹配可以避免每次都要读取多个扇区,大大提高了效率。
磁盘内部的队列和缓存
由于寻道开销极大,对于磁盘来讲如果先后的两次IO分别是最内圈和最外圈扇区数据,那么机械臂需要大范围移动。所以磁盘内部通过队列来合理的安排这些IO,以最大限度减少寻到开销,相应的算法有FCFS、SSTF、SCAN、C-SCAN、LOOK、C-LOOK等。
磁盘需要缓存来保存指令和进行预读,磁盘的数据缓存默认是打开的,即如果写数据指令到来时,磁盘可能会在真正写入盘片前就返回成功。但是如果这时掉电的话,将会造成数据不一致。有些应用会通过操作系统“禁用”写缓存,比如数据库应用,因为数据库应用一般自己实现了写缓存和预读功能。
硬盘接口技术
硬盘的物理接口包括如下几种:
ATA
指令系统的IDE
接口- ATA指令系统的
SATA
接口 SCSI
指令系统的并行SCSI
接口- SCSI指令系统的串行SCSI接口(SAS)
- SCSI指令系统的IBM专用串行SCSI接口(SSA)
- SCSI指令系统的承载于FC协议的串行
FC
接口(FCP)
一般个人电脑都采用ATA指令,只是如今IDE已经淘汰,基本上都是串行接口(即SATA)了。而服务器一般集成有SCSI控制器芯片,所有可以采用更高效的SCSI协议来操作硬盘。无论是哪种指令,基本上都包括几个要素:
- 需要对硬盘做什么操作
- 提供硬盘上的扇区编址
- 待写入的数据在内存中的地址,或者读出来的数据将要放在内存中的地址
早期PIO
(Programming Input/Output Model)模式下,CPU需要参与将内存中的数据传给磁盘控制器,或者参与将磁盘控制器从磁盘上读取的数据写入内存,大大增加了CPU的负担。而DMA
(Direct Memory Access)模式下,CPU只要将这个工作交给DMA控制器即可。
传统的SCSI协议,每个通道最多可以连接16个基于SCSI的设备,采用总线寻址方式,包含仲裁阶段。独立的SCSI卡可以有多个通道。物理上,16个设备是一个限制,但是SCSI指令中有一条叫做Report LUN的指令,即让某个SCSI设备报告自身的LUN
(逻辑单元)信息。如果这个SCSI设备本身具有划分逻辑设备的能力的话,就可以报告多个LUN,每个LUN有LUN ID。这样每个SCSI通道能够接入的逻辑设备就大大增加了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。