磁盘I/O极简总结

  从物理层面上看,传统的机械磁盘一般包含有一个或多个圆形盘片,每个盘片有正反两面,称为盘面。有一根转轴(主轴) 从每个盘片的中心穿过,所有盘片都绕着转轴转动。
  每个盘片的盘面在逻辑上被划分成多个同心圆环,称为磁道。最外面的磁道称为0号磁道,磁道编号向圆心方向依次递增,数据就存储在磁道上。
  如果有多个盘片,那么每个盘片的盘面都会被划分为相同数量和规格的磁道,所有盘面中具有同一编号的磁道从空间上形成一个圆柱,称之为柱面
  在磁道的基础上又进一步划分为多个弧段,每个弧段称为一个扇区。扇区是磁盘最小的物理存储单元,基本为512KB。
  盘片旁边有一个机械臂杆,两者通过磁臂相连接,磁臂的一端连接到机械臂杆,另一端包含和盘面相同数量的磁头,磁头靠着盘面。
机械硬盘

注:这里描述的结构为传统机械硬盘,对于高效固态硬盘来说,则没有这么多的机械构件,主要是靠芯片来存储数据,存取效率要比机械硬盘高的多

  读取磁盘数据依靠的是机械运动,每次读取花费的时间为寻道时间+旋转延迟时间+传输时间。其中:

  • 寻道时间指磁头受磁臂驱动移动到指定磁道所花费的时间
  • 在磁头到达指定的磁道后,通过盘片的旋转,使得要读取的扇区旋转到磁头处,这段时间称为旋转延迟时间(磁盘转速n转/分说的就是盘片的旋转速度)
  • 传输时间指的就是从磁盘读出(或写入)所花费的时间

  整个磁盘I/O的消耗主要集中在寻道时间和旋转延迟时间,传输时间相对来说可以忽略不计。

  前面提到了扇区是磁盘存储的最小物理单元,但是操作系统在操作磁盘的时候不是以扇区为单位的,而是将相邻的几个扇区组合在一起,形成一个磁盘块(或者叫磁盘簇),磁盘块的大小为扇区的2^n(n>=0)倍,磁盘块是操作系统操作磁盘的基本单位。
  由于磁盘I/O效率相对于内存来说是极其低下,为了尽量减少磁盘I/O操作,操作系统一般采取预读方式。预读的大小一般为页的整数倍,是操作系统内存操作的最小单位,页的大小通常为磁盘块大小的 2^n(n>=0) 倍(通常为4KB)。
  当程序要读取的数据不在内存中时,就会触发一个缺页异常,然后操作系统会向磁盘发起读盘:从数据的起始位置开始向后连续读取一页或几页到内存中以供程序使用。
  为什么需要预读?根据局部性原理,当一个数据被使用时,其附近的数据大概率也会马上被使用,并且从一个既定的块往后读取的效率还算OK,因为不需要寻道时间,只需要消耗很短的旋转时间。这个现象对于很多依赖磁盘的系统来说非常重要,典型的就是MySQL索引。

猜你喜欢

转载自blog.csdn.net/huangzhilin2015/article/details/115222049