硬盘那点事儿

 在110米栏的比赛中,一直以来都是飞人鲍威尔的天下。鲍威尔的100米的最好成绩达到了9秒74,这也让他在110米栏比赛中占尽先机。自从刘翔横空出世,鲍威尔就再也无缘110米栏的金牌了,金牌都被刘翔收入囊中。可刘翔的100米最好成绩才10秒3,但为啥又能在110米栏中战胜鲍威尔呢?原来,110米栏拼的不仅仅是奔跑的速度,还有跨栏的技巧。

 同样,在硬盘的读写效率方面比拼的不仅仅是看谁转的快,还有寻道时间,还有内置缓存。


为了理解硬盘的工作原理,我们先来打开硬盘看看:



那光洁如银镜的圆盘叫磁碟,它的表面就是存放数据的地方。那细如米粒的尖端上就装着读写数据的部件,叫磁头。一个磁碟的两面都可以记录数据,因此磁碟的正反面都会有一个读写磁头。而一个硬盘内可以安装多个磁碟,也就有多个磁头,磁碟和磁头都是好几层的。看看下面的解剖图就明白了:



我们再来看看硬盘是如何读写数据的。

在还未给硬盘通电前,磁头总体靠在一个安全的飞机场。这个飞机场要么在磁碟的最内侧,要么在磁碟的最外侧。飞机场部分的表面是不存放数据的,仅用于磁头的起飞和着陆。

磁碟的大部分区域是用来记录数据的,这些区域由一圈一圈的磁道组成,每个磁道又被划分成若干扇区。而磁碟的层叠看起来就像一个圆柱,那些磁道就形成以一层包裹一层的柱面结构,就像大树的年轮一样。而硬盘管理存储空间的方式都是先按柱面来存,再把磁道换到下一个柱面,并非按一个个磁碟来走的。

早期的硬盘采用CHS坐标体系规划硬盘存储空间,内侧磁道和外侧磁道的扇区数都相同。即使外侧磁道比内侧磁道要长得多,但容量只能与内侧磁道相同。硬盘总存储容量实际受内侧磁道的记录密度所限制,这显然是一种浪费。当磁道密度达到第一次极限时,人类发明了LBA的坐标映射,允许外侧磁道划分出更多的扇区,大幅度提升了硬盘容量。

同样,当LBA模式的硬盘容量又抵达距离的极限时,人类又发明了垂直记录技术,这又将大幅提升硬盘容量。所谓垂直记录技术就是把本来在磁碟表面平放的磁记录单元,改成竖着放。就像一个接一个平躺着的人会占据很长的距离,但这些人站起来就可以靠拢,从而缩小占据的距离。因此,垂直记录技术就可以在同样长度的磁道上放置更多的磁记录单元,从而提升硬盘容量。

当硬盘加电时,磁碟便开始加速转动。磁头是按精巧的好空气动力学原理设计出来的战斗机,当它在磁头的表面滑行到一定的速度时就会飞起来,从而浮在磁碟的表面。相信没有哪种飞机能像硬盘磁头那样,以零点几微米的超低空状态保持高速飞行。这样的超低空可以保证磁头能有效地分辨细小的磁记录单元的信号变化。

硬盘最怕什么?震动!在硬盘高速运转时,震动可能导致超低空飞行的磁头碰到磁碟表面,从而划伤磁碟,产生坏道。因此,硬盘运行时绝对禁止震动。

硬盘的转速和磁碟记录密度与磁头读写的速度都成近似的正比关系。转速越快,磁头读取数据就越快;而记录密度越高,相同时间下磁头读取的数据就越多。因此,人们总喜欢购买转速高的硬盘或容量大的硬盘。但除了转速和记录密度之外,其他方面的因素对硬盘的读写效率更加总要。

当硬盘接到读写命令时,磁头首先需要移动到要读写数据的磁道上,这个过程称为寻道。寻道需要时间的,这取决于磁头当前磁道与目标磁道的距离。如果距离远,移动磁头的时间就长,寻道就慢;如果距离很近,移动磁头的时间就短,寻道就快。平均寻道时间是影响硬盘读写效率的最重要指标。

磁头找到需要读取的磁道后,要读取的数据块可能还没有转过来,这也需要等待。平均等待读取数据块的时间称为平均潜伏时间,一般是磁碟旋转周期的一半。由于现在的硬盘转速都很快,因此这个等待时间比起平均寻道时间来说要小得多。

整体读写效率是由硬盘的平均访问时间来衡量的,它是指从硬盘收到访问命令,到完成所有操作并返回最终结果所花费的时间。平均访问时间基本就等于平均寻道时间与平均潜伏时间之和。因为这两个时间指标都与硬盘的机械结构有关,其他电信号切换和指令时间比起机械上所花的时间来说基本可以忽略不计。

由此可见,影响硬盘读写效率的主要是平均寻道时间。如果一个文件在硬盘中扇区太分散,东一块西一段的,那么读取这个文件时,磁头就会嚓嚓嚓地乱跳。由于把大多数的时间都花在寻找不连续的磁道上,读取文件的效率也就大大降低了。同样,当我们的硬盘由于文件的平凡更迭,会自然形成许多不连续的文件和磁盘碎片。这时,系统的运行效率也就大大降低,根源也是寻道时间太多。

为了对硬盘运行原理有一个感性的认识,我们来看看一段录像:

Flash Video 文件 Flash Video 文件
点击播放
点击开始播放



录像中,Copy & Paste 这种交替跨磁道的读写导致了磁头的剧烈振动,这不仅仅会导致读写效率的下降,还会制造噪音,并加速硬盘的损耗。而类似Format那种连续操作时,速度非常快,磁头也运行得很平稳和安静。

现代的硬盘都有内置缓存,这些缓存可提供一项重要的功能:“预取”。预读就是在硬盘读取完指定扇 区的数据之后、接到系统的下一条指令之前,磁头接着读取相邻的若干扇区的数据并存入缓存中。如果系统接下来所需的数据正好就是相邻扇区的数据,那么便可以 直接从缓存中读取而不用磁头再寻址,从而极大提高数据访问速度。

如果,我们定期对硬盘进行碎片整理,尽量保持文件的连续和有序,将对硬盘带来巨大好处。硬盘在读取这些连续数据时,磁头很少剧烈震动,磁盘运行很安静。因为连续有序的数据文件可以极大减少寻道时间,既能提高读取数据的速度,又可减少硬盘损耗,延长使用寿命。

此外,磁盘内置缓存的预读能力正好符合连续数据的读取。从寻道时间和缓存命中率两项指标来看,连续有序的数据可以极大提升电脑系统的运行效率。在实际生活中,一般的文件都会占用成千上万个扇区的空间,根据缓存“预取”的原理,如果硬盘中的文件完全没有磁盘碎片的话,那么“预取”的命中率就可以达到几乎100%,但因为有磁盘碎片,通常“预取”的命中率只在50%左右。

同样,在数据库应用系统中,我们也应该尽量保持数据存储的连续和有序。尽管数据库会有自己存放数据的格式,操作系统也存在自己的缓存机制。但这些上层的顺序结构和缓存机制,也会多多少少体现在硬盘的磁道和扇区的相邻性上。因为这些结构和机制也是基于硬盘的顺序结构和缓存机制来设计的。因此,在数据库的数据存储中尽量保证其物理连续性,将有助于提高数据库的查询效率。这也是为什么聚集索引要比其他索引快的原因,也是为什么精心设计的主键可以让索引的B树在硬盘上更连续的原因。

如果您读过薛定谔的那本著名的《生命是什么》,您将会明白生命的物理学意义就是让宇宙变得有序。让世界更有序是生命的天性,有智慧的程序员会让这种天性融入自己的程序中的。

预祝刘翔在2008奥运会上跑得更加有序!

原创:李战(leadzen) 2008-6-25
原文:http://www.cnblogs.com/leadzen/archive/2008/06/25/1229413.html
【转载注明出处】

你可能感兴趣的:(数据库,video,Flash,存储,电信,磁盘)