详解磁盘

转载自:http://blog.chinaunix.net/uid-23069658-id-3413957.html

http://www.chinafix.com/thread-737445-1-1.html

磁盘长啥样

从硬盘问世至今,不管是容量、体积还是生产工艺都较之前有了重大革新和改进,但一直都保持了“温氏”的架构(固态硬盘除外,它不是我们今天的主角)。经过封装后的硬盘,对我们一般呈现出如下的样子:
正面:
背面:
打开后盖:
 

硬盘主要由盘体、控制电路板和接口部件组成。

盘体:    就是一个密封,封装了多个盘片的腔体;

控制电路:  包含硬盘BIOS,主控芯片和硬盘缓存等单元;

接口部件:  包含电源、数据接口主从跳线等。

硬盘的盘片一般采用合金材料,多数为铝合金(IBM曾经开发过玻璃材质的盘片,好像现在有些厂家也生产玻璃材质的盘片,但不多见),盘面上涂着磁性材料,厚度一般在0.5mm左右。有些硬盘只装一张盘片,有些则有多张。硬盘盘片安装在主轴电机的转轴上,在主轴电机的带动下作高速旋转。每张盘片的容量称为单碟容量,而一块硬盘的总容量就是所有盘片容量的总和。早期硬盘由于单碟容量低,所以盘片较多。现代的硬盘盘片一般只有少数几片。 盘片上的记录密度很大,而且盘片工作时会高速旋转,为保证其工作的稳定,数据保存的长久,所以硬片都是密封在硬盘内部。不可自行拆卸硬盘,在普通环境下空气中的灰尘、指纹、头发丝等细小杂质都会对硬盘造成永久损害。一个被大卸八块的硬盘如下:

接下来我们了解一下硬盘的盘面,柱面,磁道和扇区的概念。

盘面

    硬盘一般会有一个或多个盘片,每个盘片可以有两个面(Side),即第1个盘片的正面称为0面,反面称为1面;第2个盘片的正面称为2面,反面称为3面...依次类推。每个盘面对应一个磁头(head)用于读写数据。第一个盘面的正面的磁头称为0磁头,背面称为1磁头;第二个盘片正面的磁头称为2磁头,背面称为3磁头,以此类推。盘面数和磁头数是相等的。

 

    一张单面的盘片需要一个磁头,双面的盘片则需要两个磁头。硬盘采用高精度、轻型磁头驱动和定位系统。这种系统能使磁头在盘面上快速移动,读写硬盘时,磁头依靠磁盘的高速旋转引起的空气动力效应悬浮在盘面上,与盘面的距离不到1微米(约为头发直径的百分之一),可以在极短的时间内精确定位到计算机指令指定的磁道上。

  有一点必须澄清,磁盘每个时刻只允许一个磁头来读写数据。也就是说,不管盘体内盘片和磁头数量再多,也不可能提高硬盘的吞吐量和IO性能,只能提高容量。然而,已经有很多人致力于改变这个现状,希望能让磁头在盘片内实现并发读写,也就相当于盘片和盘片之间相互形成RAID从而提高性能,但是这项工程目前还没有可以应用的产品。

    早期由于定位系统限制,磁头传动臂只能在盘片的内外磁道之间移动。因此,不管开机还是关机,磁头总在盘片上。所不同的是,关机时磁头停留在盘片启停区,开机时磁头“飞行”在磁盘片上方。

磁道

    每个盘片的每个盘面被划分成多个狭窄的同心圆环,数据就是存储在这样的同心圆环上,我们将这样的圆环称为磁道(Track),每个盘面可以划分多个磁道。关机时磁头停留在硬盘的着陆区(Landing Zone),这个着陆区以前是位于离盘心最近的区域,不存放任何数据。在后期的硬盘工艺中有些硬盘生产厂商将这个区域被移动到了盘片的外面,如下所示:

 启停区位于硬盘的盘片上

启停区位于盘片的外部

  现在的笔记本硬盘,大容量的3.5寸硬盘,启停区都在位于盘片外部的启落架上。特别是WD的蓝盘,经常出现卡磁头的故障,其实就是断电后硬盘磁头没有回到启落架上,而是停在盘片上,与盘片粘在一起。这种故障,一般来讲,在开盘后,手动装磁头调整到启落架上即可,然后就可以直接提取数据了。

  在每个盘面的最外圈,离盘心最远的地方是“0”磁道,向盘心方向依次增长为1磁道,2磁道,等等。硬盘数据的存放就是从最外圈开始

扇区

  

  根据硬盘规格的不同,磁道数可以从几百到成千上万不等。每个磁道上可以存储数KB的数据,但计算机并不需要一次读写这么多数据。在这一这基础上,又把每个磁道划分成若干弧段,每段称为一个扇区(Sector)。扇区是硬盘上存储的物理单位,每个扇区可存储128×2N次方(N=0,1,2,3)字节的数据。从DOS时代起,每扇区是128×22=512字节,现在已经成了业界不成文的规定,也没有哪个硬盘厂商试图去改变这种约定。也就是说即使计算机只需要硬盘上存储的某个字节,也须一次把这个字节所在的扇区中的全部512字节读入内存,再选择所需的那个字节。

  扇区的编号是从1开始,而不是0,这一点需要注意。另外,硬盘在划分扇区时,和软盘是有一定区别的。软盘的一个磁道中,扇区号一般依次编排,如1号,2号,3号...以此类推。但在硬盘磁道中,扇区号是按照某个间隔跳跃着编排。在磁盘中,给扇区编号最简单的方法是采用1、2、3、4、5、6等顺序编号。但带来的一个问题是,磁盘控制电路在处理一个扇区的数据期间,可能会因为磁盘转的太快,eg:正在读写1号扇区,由于磁盘转的太快,处理完1号扇区再想处理2号扇区时磁头却指向了3号扇区。如果还想读取2号扇区就要再等一圈,等到盘片旋转回来之后再次读写。这个等待时间无疑是非常浪费的。

  低级格式化硬盘时必须设定扇区“间隔因子”(交叉因子)值。间隔因子通俗的讲,是指低级格式化后,任意一个扇区和它下一个扇区相隔多少个物理扇区块。低级格式化划分出来的扇区不一定是连续的,一般是交错排列的,只有间隔因子=1时才是连续的。举例来说,间隔因子=2时,第1号扇区和第2号扇区中间间隔有一个扇区,间隔因子=3时,第1号和第2号扇区中间间隔着两个扇区,如此类推。间隔因子值对硬盘读写速度有很大影响,应与硬盘转速、CPU速度、主板相匹配,否则影响硬盘性能。每个磁道都有自己的交叉因子,在大多数驱动器中,所有磁道都有相同的交叉因子。不同磁道交叉因子不一致时不会对计算机产生不利影响,只是有最佳的交叉因子的磁道要比其他磁道的工作速度要更快。
  使用交叉因子的目的是为了协调磁盘控制器和旋转的磁头

 

 

柱面

  

  柱面其实是我们抽象出来的一个逻辑概念,前面说过,离盘心最远的磁道为0磁道,依此往里为1磁道,2磁道,3磁道....,不同面上相同磁道编号则组成了一个圆柱面,即所称的柱面(Cylinder)。这里要注意,硬盘数据的读写是按柱面进行,即磁头读写数据时首先在同一柱面内从0磁头开始进行操作,依次向下在同一柱面的不同盘面(即磁头上)进行操作,只有在同一柱面所有的磁头全部读写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。电子切换比从在机械上磁头向邻近磁道移动快得多。因此,数据的读写按柱面进行,而不按盘面进行。 读写数据都是按照这种方式进行,尽可能提高了硬盘读写效率。

  从同一盘面的一个磁道转到另一个磁道,也就是从一个柱面转到下一个柱面,这个动作叫做换道。在换道期间磁盘始终保持旋转,这就意味着系统刚刚完成对一个柱面最后一个扇区的读写,现在准备在下一个磁道的第一个扇区读写,这时必须要等到磁头换道结束,让磁头部件重新定位在下一道上。如果这种操作时间上超过了一丁点,尽管设置了交叉因子,磁头仍会延迟到达。这个问题的解决办法是,以原先磁道所在位置为基准,把新的磁道上全部扇区号移动约1个或几个扇区的位置,这就是磁头扭斜。磁头扭斜可以理解为柱面与柱面之间的交叉因子,已经由生产厂家设置好,一般不会去改变它,磁头扭斜的更改比较困难,但他们只在文件很长、超过磁道结尾进行读出和写入时才发挥作用,所以扭斜设置不正确带来的损失比采用不正确的扇区交叉因子带来的损失值要小得多。

 

   物理相邻的若干个扇区称为了一个簇。操作系统读写磁盘的基本单位是扇区,而文件系统的基本单位是簇(Cluster)。在Windows下,随便找个几字节的文件,在其上面点击鼠标右键选择属性,看看实际大小与占用空间两项内容,如大小:15 字节 (15 字节), 占用空间:4.00 KB (4,096 字节)。这里的占用空间就是你机器分区的簇大小,因为再小的文件都会占用空间,逻辑基本单位是4K,所以都会占用4K。 簇一般有这几类大小 4K,8K,16K,32K,64K等。簇越大存储性能越好,但空间浪费严重。簇越小性能相对越低,但空间利用率高。NTFS格式的文件系统簇的大小为4K。

 

 磁盘的IO单位

  磁盘读写都是以扇区为最小寻址单位,也就是说不可能往XX扇区的前半部分写入XX数据。一个扇区大小512B,每次磁头连续读写的时候,只能以扇区为单位,即使一次只写了1Byte数据,那么下一次就不能再向这个扇区的其余部分写入数据,而是要寻找一个空扇区来写。

  随着时代发展,硬盘容量不断扩展,使得之前定义的每个扇区512字节不再是那么的合理,于是将每个扇区512字节改为每个扇区4096 个字节,也就是现在常说的“4K扇区”。随着NTFS成为了标准的硬盘文件系统,其文件系统的默认分配单元大小(簇)也是4096字节,为了使簇与扇区相对应,即使物理硬盘分区与计算机使用的逻辑分区对齐,保证硬盘读写效率,所以就有了“4K对齐”的概念。操作系统的Page、文件系统的Block一般都是4KB大小,将扇区容量与上层的单位匹配,可以大大提高效率。

细说IO这个概念

  IO这个概念,从分理解就是输入输出。我们知道从最上层到最下层,层次之间存在着太多的接口,这些就扣之间每次交互都可以称作一次IO,也就是广义上的IO。

(由底向上说IO)

①对于磁盘来说,一次磁头的连续读或写叫做一次IO,这也是最底层的IO。

②卷管理程序 对 磁盘控制器 驱动 程序API所做的一次IO,可能要产生针对磁盘的几次IO。

③文件系统 对 卷的IO

④上层应用程序 对 文件系统API的IO,只需要几句代码、几个调用(eg Open()某个文件,Seek()到某个文件,Write()一段数据,Close()这个文件等)

总之,上层IO是稀疏的,简单的,越往下层走越密集、越复杂。

 图解IO流程

 

原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/5560352.html