数据库系统总会涉及到辅助存储(大多都是硬磁盘),因为它们能够存储大量需要长期保存的数据,因此我们有必要先了解了解硬盘的相关知识。

根据机械原理,存储器的容量越大其速度就越慢,但是速度越快的存储器,其单位字节的价格就越贵。现代计算机系统可以包含几个不同的可以存储数据的部件,就形成了存储器的层次结构,但是需要注意的是「虚拟内存」是操作系统与操作系统运用机器硬件的产物,它不是存储器的层次之一。

硬盘内存架构 硬盘存储器结构_硬盘内存架构


硬盘结构

硬盘内存架构 硬盘存储器结构_硬盘内存架构_02


它有一个或多个盘片,用于存储数据。盘片中间有一个主轴,所有的盘片都绕着这个主轴沿同一方向进行转动。一个组合臂上面有多个磁头臂,每个磁头臂上面都有一个磁头,负责读写数据,因此,不同盘面上的所有磁头都是都是同时移动的。其中,每个盘片都有两面,即第一个盘片的正面为0面,反面为1面;第二个盘片的正面为2面…依此类推。磁头的编号也和盘面的编号是一样的,因此有多少个盘面就有多少个磁头。每个盘片的盘面被划分成多个狭窄的同心圆环,数据就存储在这样的同心圆环上面,我们将这样的圆环称为磁道 (Track),每个盘面可以划分多个磁道,最外圈的磁道是0号磁道,向圆心增长依次为1磁道、2磁道…,磁盘的数据存放就是从最外圈开始的。

盘面正视图如下:

硬盘内存架构 硬盘存储器结构_磁道_03


磁介质存储器中,信息是记录在一薄层磁性材料上的,这个薄层称为磁层。磁层与所附着的载体称为记录介质或记录载体。

载体是由非磁性材料制成的。根据载体的性质,又可分为软质载体和硬质载体。软质载体一般为聚酯薄膜材料,硬质载体一般为铝合金片。

读写时,按磁头与磁层之间的接触与否,可分为接触式磁头与浮动式磁头两种。在磁带和软盘中,由于是软质载体,只能采用接触式磁头。但会因为磨损而降低磁头与磁层的使用寿命。在硬盘中,由于是硬质载体,必须尽量减少磨损(特别是记录区),故采用浮动式磁头。
硬盘在读写时,盘片高速地旋转,带动盘面表层气流形成气垫,使质量很轻的磁头浮起,与盘面之间保持一个极小的间隙,磁头不与盘面直接接触。

磁头的传动臂只能在盘片的内外磁道之间移动,但由于磁头的浮起要依靠盘片高速旋转时产生的气垫浮力,因此在启动前和停止后,磁头会与盘面接触,这样的话,容易划伤盘面造成数据损失,为了避免这样的情况,所以磁头都是停留在启停区的,因为启停区是没有数据的。

既然提到启停区,那么再稍微扩展一下。盘片可分为4部分,即“启停区”、“定位0磁道”、“固件区”、“数据区”,如下图所示:

硬盘内存架构 硬盘存储器结构_硬盘内存架构_04


盘片中间靠近主轴电机的地方叫做“启停区”(Lzone:landing Zone),硬盘在不加电时磁头停留在此区域,因为这块区域没有任何数据,适合磁头的着陆。在通电后,硬盘启动,当盘片旋转并达到额定转速时,气垫浮力使磁头浮起并达到所需的浮动高度,然后磁头想外移至0号磁道,准备寻道。

硬盘内存架构 硬盘存储器结构_磁道_05


不过有的硬盘在设计时,磁头的启停区并不在主轴电机周围,而是在盘片外部。IBM硬盘就用过这种设计,目前,许多笔记本硬盘、高转速的台式机硬盘也都采用这种技术。

硬盘内存架构 硬盘存储器结构_磁道_06


定位0磁道是磁头用来定位的磁道,它是磁头寻道的起点和终点,每次磁头寻道都从定位0磁道出发,寻道结束后回到定位0磁道,并且它把盘片分为正磁道负磁道两部分。

**固件区(SA:service area)**相当于硬盘的操作系统,位于盘片的最外层,也叫负磁道,所以说它一般位于盘片的负磁道内。固件区内保存着硬盘最底层的基本控制程序和基本参数,主要包括缺陷列表、检验算法公式和内部操作指令等。

**数据区(Data)**位于盘片的正磁道内,涂抹磁介质用来记录数据。根据硬盘的规格不同,磁道数可以从几百到成千上万不等,每个磁道都可以存储数Kb的数据,但是计算机不必每次都要读写这么多数据,因此,再把每个磁道划分为若干个弧段,每个弧段就是一个扇区 (Sector)

硬盘内存架构 硬盘存储器结构_柱面_07


在老式磁盘中,尽管磁道周长不同,但每个磁道上的扇区数是相等的,越往圆心扇区弧段越短,但其存储密度越高。不过这种方式显然比较浪费空间(由于外圈磁道比内圈磁道长,但存储的信息量却相同,所以外圈磁道明显地存在着空间的浪费。),因此现代硬盘则改为等密度结构,这意味着外圈磁道上的扇区数量要大于内圈磁道的。但是这样的话就会引入一个新问题,由于外圈磁道上保存的数据比内圈的多,而硬盘转速仍旧恒定,所以硬盘的内部传输速率会因内外磁道而存在差异。这就是当今驱动器标注最小和最大连续传输速率的原因。

扇区是硬盘存储的物理单位,现在每个扇区可存储512字节数据已经成了业界的约定。也就是说,即使计算机只需要某一个字节的数据,但是也得把这个512个字节的数据全部读入内存,再选择所需要的那个字节。

柱面是我们抽象出来的一个逻辑概念,简单来说就是处于同一个垂直区域的磁道称为柱面 ,即各盘面上面相同位置磁道的集合。因此,柱面的个数也就是盘面的磁道数。
需要注意的是:
磁盘读写数据是按柱面进行的,磁头读写数据时首先在同一柱面内从0磁头开始进行操作,依次向下在同一柱面的不同盘面上(即磁头上)进行操作,只有在同一柱面所有的磁头全部读写完毕后磁头才转移到下一柱面,因为选取磁头只需通过电子切换即可,而选取柱面则必须通过机械切换。数据的读写是按柱面进行的,而不是按盘面进行,所以把数据存到同一个柱面是很有价值的。
引入圆柱面的概念是为了提高硬盘的存取速度。以存文件为例,当主机要存入一个较大的文件时,若一条磁道存不完,就需要存放在几条磁道上。这时应该选择位于同一盘面上的几条磁道?还是选择同一柱面上的几条磁道呢?很明显,如果选择同一记录面上的不同磁道,则每次换道时都要先回到0磁道,再寻道,显然速度较慢。

现代硬盘寻道都是采用CHS(Cylinder Head Sector)的方式,硬盘读取数据时,读写磁头沿径向移动,移到要读取的扇区所在磁道的上方,这段时间称为寻道时间(seek time)。因读写磁头的起始位置与目标位置之间的距离不同,寻道时间也不同。磁头到达指定磁道后,然后通过盘片的旋转,使得要读取的扇区转到读写磁头的下方,这段时间称为旋转延迟时间(rotational latencytime)(硬盘有一个参数指标,每分钟多少转)。然后再读写数据,读写数据也需要时间,这段时间称为传输时间(transfer time)
**硬盘IO代价主要花费在寻道时间上。**现今主流硬盘的平均寻道时间都在9ms以下,平均旋转延迟时间为盘片旋转一周所需时间的一半,一般应在4ms以下。

硬盘的转数:硬盘主轴电机的旋转速度,它是决定硬盘内部传输率的关键之一,在很大程度上直接影响到硬盘的速度。硬盘转速的单位是“转/分钟”,显然硬盘的转速越大,其内部传输率就越快,访问时间也就越短,硬盘的整体性能也就越好。最初,硬盘的转速一般为3600,现在的硬盘转速为5400或7200,高转速则可达到10000或15000。
硬盘的缓存
缓存存在的目的是为了解决硬盘内部与接口之间速度不匹配的问题,它可以提高硬盘的读写速度。早期的硬盘缓存基本都很小,只有几百Kb,而目前2Mb~8Mb已是现今主流硬盘的缓存设计,在服务器或特殊应用领域中还有缓存容量更大的产品,甚至达到了16Mb、64Mb等。
硬盘的数据传输率
硬盘的数据传输率分为内部数据传输率外部数据传输率。内部数据传输率是指磁头一硬盘缓存之间的数据传输率,它的高低是评价一个硬盘整体性能的决定性因素。外部数据传输率指的是系统总线与硬盘缓存之间的数据传输率,外部传输率与硬盘接口类型和缓存大小有关。其中,硬盘接口是硬盘与主机系统间的连接部件,不同的硬盘接口决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响程序运行快慢和系统性能好坏。

笔试题实战
下面的题目是腾讯某一年校招笔试中的一个题目,题干信息描述为:
数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环磁道上有10个物理块,10个数据记录R1~R10存放在这个磁道上,记录的安排顺序如下所示:
物理块 1 2 3 4 5 6 7 8 9 10
逻辑记录 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10
假设磁盘的旋转速度为20ms,磁盘当前处在R1的开头处,若系统顺序扫描后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录),则处理这10个记录的最长时间是多少?
分析:
磁盘会一直朝某个方向旋转,不会因为处理数据而停止。本题要求顺序处理R1到R10,起始位置在R1,一周是20ms,共10个记录,所以每个记录的读取时间为2ms。首先读R1 并处理R1,读R1花2ms,读好后磁盘处于R1的末尾或R2的开头,此时处理R1,需要4ms,因为磁盘一直旋转,所以R1处理好了后磁盘已经转到R4的开始了,这时花的时间为2+4=6ms。这时候要处理R2,需要等待磁盘从R5一直转到R2的开始才行,磁盘转动不可反向,所以要经过82ms才能转到R1的末尾,读取R2需要2ms,再处理R2需要4ms,处理结束后磁盘已经转到R5 的开头了,这时花的时间为28+2+4=22ms。等待磁盘再转到 R3 又要82ms,加上R3自身2ms的读取时间和4ms的处理时间,花的时间也为22ms,此时磁盘已经转到R6的开头了,写到这里,就可以看到规律了,读取并处理后序记录都为22ms,所以总时间为6+229=204ms。

区分扇区与盘块
文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”,每个扇区512个字节。操作系统在读取硬盘的时候,不会一个扇区一个扇区地读取,这样的话效率太低,而是一次性连续读取多个扇区,即一次性读取一个块(Block)。块是文件存取的最小单位,在块中存储的是文件内容。

盘块是个虚拟出来的概念,是操作系统中的,而扇区是真实存在的。磁盘驱动器操作磁盘数据,每次都按照扇区这个最小单位来进行操作。
操作系统也需要通过磁盘驱动器来操作硬盘,所以是离不开扇区这个概念的。而文件系统又是操作系统的一部分,所以文件系统操作硬盘的最小单位也是块。

有的题目会问,硬盘的读写单位是?此时千万不要联系到操作系统层面上去,硬盘读写的基本单位就是扇区,磁盘驱动器就是按照这个单位来操作硬盘上的数据的。

盘块与扇区大小问题
既然盘块是一个“虚拟”概念,是操作系统自己"杜撰"的,所以大小由操作系统决定,操作系统可以配置一个块多大?一个块大小 = 一个扇区大小 * 2的n次方,其中,n是可以修改的。

一个扇区512字节,这是物理结构,磁盘定下来的结构是没法修改的。

操作系统与内存、硬盘这两种硬件设备打交道,都需要虚拟一种最小单位来进行操作。与内存打交道,是虚拟一个“页”的概念来作为最小单位。与硬盘打交道,就是以“块”来作为最小单位。