磁盘那点事情


​ 本人只是在看到数据库从磁盘读取数据相关知识时,对磁盘(硬盘)读取这块比较感兴趣,并进行了一定的知识延申;如果本文讲解有误,还请多多包含并给予指教,促使大家共同进步~

硬盘的组成

基本概念

​ 硬盘内部主要由磁盘盘片、磁头控制器(传动手臂)、磁头和主轴组成,如下图所示:

img

​ 主轴负责带动盘片的高速旋转,由此会产生气流将磁头浮起,磁头和盘面保持一定的距离,负责从盘面上读写数据;传动手臂则控制磁头沿着盘面半径方向进行移动。稍微抽象的图如下所示:

img

  1. 盘片主轴

    所有的盘片都是固定在一个旋转轴上,即盘片主轴;

  2. 磁盘盘片

    盘片之间是互相平行的,每个磁盘盘片有两个盘面,每个面都有一个对应的读写磁头;

  3. 磁头

    负责从盘面上读写数据,依赖盘片的旋转气流浮在盘面上方;

  4. 磁头控制器

    所有的磁头是连接在一个磁头控制器上,由磁头控制器负责各个磁头的运动;因此所有磁头在任何时候都是重叠的,不过目前已经能够实现多磁头独立运动;

  5. 磁道(逻辑组成)

    盘面上,以主轴为圆心,半径不同的同心圆为磁道;

  6. 扇区(逻辑组成)

    以主轴为圆心,按照一定角度可以将磁道划分为若干个弧段,每个弧段则称为扇区;

  7. 柱面(逻辑组成)

    磁盘通常是由重叠的一组盘片组成,每个盘面划分为数目相等的磁道,不同盘面的相同半径会形成一个圆柱,称之为磁盘的柱面;

    可知,磁头数=盘面数;柱面数=单个盘面的磁道数;

    那么磁道和扇区数的关系呢?

磁道和扇区关系

对于旧式的磁盘,是依照角度进行划分扇区,因此不同磁道的扇区数是一样的。每个扇区所能容纳的数据量是相同的,都是512字节,那么,512字节的数据量会平均分配在扇区内。但是,对于越靠外的磁道,半径越大,周长越长,扇区面积也越大,则数据密度也会越低。这样分配显然是浪费了外围扇区的大面积,因此新的分配方式出现了。

​ 对于新式磁盘,则是按照扇区面积进行划分,因此,外侧的磁道拥有的扇区数也越多。

硬盘如何存储信息

​ 硬盘盘片的表面实际上是凹凸不平的,凸起的地方被磁化,代表数字1,凹下的地方是没有被磁化的,代表数字0;因此,硬盘可以用二进制(0和1)来存储信息。

硬盘读取相关参数

  1. 寻道时间:磁头移动到数据所在磁道需要的时间,需要时间越短,IO操作越快,一般在10ms左右;
  2. 旋转延迟:主轴将数据所在的扇区旋转至磁头下方需要的时间,旋转延迟取决于磁盘转速;
  3. 数据传输时间:数据从磁盘传输到内存的时间;

​ 为提高磁盘传输效率,要尽量减少寻道时间和延迟时间。其中,寻道时间大于延迟时间。

磁盘工作

原理

​ 当硬盘不工作时,磁头会停留在线速度最小的区域,该区域不存储任何数据,称之为启停区,启停区外就是数据区;距离主轴最远的磁道就是0磁道,硬盘数据的存放也是从最外层开始的。硬盘中有0磁道检测器,用来完成硬盘的初始化定位。

​ 硬盘数据的读写是按照柱面进行的,即最先写第一磁道的第一磁头下的所有扇区,然后写同个柱面的下一个磁道…只有当一个柱面写满后,才会写下个柱面;读取也是按照相同的顺序进行的,读取数据时,会将逻辑地址转换为物理地址,通过移动磁头到指定的柱面,等待要求的扇区移动到磁头下面进行读取。在等待扇区到来时,磁盘控制器读取每个扇区的头标,把这些头标中的地址信息与期待检出的磁头和柱面做比较(寻道),从而找到对应的扇区。=====>之所是按照柱面的顺序来读写而不是按照盘面顺序,是因为在柱面之间切换磁头是电子切换,而盘面的磁头移动是机械切换,电子切换的时间远小于机械。

局部性原理 + 磁盘预读

​ 为了提高磁盘读取的效率,需要尽量减少磁盘IO。因此,系统在从磁盘中读取数据时,并不是严格的按需读取,而是每次都会预读一部分数据,即,磁盘会读取当前需要的数据以及顺序向后一定长度的数据,将这部分数据放入内存中。为什么这样做呢?理论依据就是计算机科学中著名的局部性原理:当一个数据被用到时,其附近的数据也经常马上被使用。

​ 磁盘顺序读取的效率很高,不需要寻道时间,只需要较少的旋转时间;预读的长度一般是页的整数倍。页是计算机管理存储器的逻辑块,操作系统将主存和磁盘存储区分割为连续的大小相等的块,每个存储块分为一页(通常为4k)。主存和磁盘以页为单为交换数据。

​ 预读又分为同步和异步预读:如果第二次请求没有命中cache,即不在前次的预读页中,则表明文件访问不是顺序的,则系统继续采用同步预读的方式;如果所读的页面在cache中,则表明前次预读命中,那么操作系统会把预读页扩大一倍,此时预读是异步过程,应用程序不用等预读完成就可返回,后台会慢慢读页面,这就是异步预读。

为什么越来越慢

​ 磁盘优先将数据存在最外的磁道,即0磁道;当外层磁道写满后,只能存储在内层的磁道。这个问题也就是演变为为什么读外层磁道的速度大于内层磁道?

​ 盘片以固定的角速度旋转,半径越大,线速度越大,那么磁头在单位时间内扫描的扇区也就越多啦,因此读取速度也就越快了。

参考

硬盘读写原理

磁盘IO那些事

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章