在前文《磁盘开篇:扒开机械硬盘坚硬的外衣!》中,我们了解了机械硬盘的物理构造,是由磁盘面,磁道、扇区等更小的单位组成的,如下图:

图1 机械磁盘内部构造

分区是操作系统对磁盘进行管理的第一步,这也是我们任何一个计算机使用者都非常熟悉的概念。例如Windows下的C、D、E、F盘。那么请思考一下,如果你是操作系统的设计者,让你把整块磁盘分成C、D等分区,你会怎么分呢?

为了方便讨论,我们这里假设你要分的硬盘是有50个盘面,3000个柱面。我们给出两种方案

  • 方案一:50个盘面,C盘是0-10盘面, D盘是10-20个盘面,……

  • 方案二:3263个柱面,C盘0-1000个柱面,D盘1001-20001个柱面,……

接下来我们来讨论下那种方案更优秀,这得从磁盘的读写延时角度说起。读写原理说起来也简单,就是磁头要找到指定的磁道,指定的扇区,进而把数据读取出来或者写入进去的过程。这个过程分成如下三步:

  • 第一步,首先是磁头径向移动来寻找数据所在的磁道。这部分时间叫寻道时间。寻道时间,现代磁盘大概在3-15ms,其中寻道时间大小主要受磁头当前所在位置和目标磁道所在位置相对距离的影响

  • 第二步,找到目标磁道后通过盘面旋转,将目标扇区移动到磁头的正下方,这部分时间叫旋转延迟。现在主流服务器上经常使用的是1W转/分钟的磁盘,每旋转一周所需的时间为60*1000/10000=6ms,故其旋转延迟为(0-6ms)

  • 第三步,向目标扇区读取或者写入数据,这部分时间叫存取时间。这个是电磁操作,所以一般耗时较短,为零点几ms。

到此为止,单次磁盘IO时间 = 寻道时间 + 旋转延迟 + 存取时间

分区上采用哪一种方案,最主要看的是那种方式性能更快。在磁盘分区的使用中,存在一个基本事实,那就是同一分区下的数据经常会一起读取。两种方案的对于旋转延迟、和存取时间上表现的性能是一样的,主要区别是在寻道时间的表现上:

假如采用第一种,那么这样磁头就需要在3000多个磁道间不停地跳来跳去,这样磁盘的寻道时间就降不下来。而对于方案二,假如对于磁盘C,只需要在磁头在1-1000个磁道间移动就可以了,大大降低了寻道时间。

所以所有的操作系统采用的都是方案二,没有用方案一的。如果你在Linux下使用过fdisk进行过分区的话可以注意到以下信息。

图2 fdisk分区开始柱面选取

图3 fdisk分区结束柱面选取

分区的过程就是你输入起始柱面号和截至柱面号的过程。不过在实际中,分区并不能从0号柱面开始的,因为磁盘的第一个磁道对应的柱面会被用来安装引导加载程序以及磁盘分区表。

所以,操作系统通过按磁道对应的柱面划分分区,来降低磁盘IO所花费的的寻道时间 ,最终提高磁盘的读写性能。


©著作权归作者所有:来自51CTO博客作者mb5fd86a050ef28的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 磁盘开篇:扒开机械硬盘坚硬的外衣!
  2. Android磁盘管理-之vold源码分析(2)
  3. Android(安卓)Studio磁盘空间不足:Emulator: emulator: ERROR: No
  4. android 联机测试 usb驱动问题
  5. Android-Universal-Image-Loader 源码解读
  6. ExoPlayer2.5 的简单使用
  7. Android(安卓)应用开发稳定性测试之 StrictMode
  8. 获取磁盘存储目录
  9. Android中SdCard的数据读写

随机推荐

  1. Android SDK:RelativeLayout - 按钮不会
  2. unity5发布android:在unity5里面的edit/p
  3. Android中ListPreference的使用
  4. Android入门二(五大布局)
  5. [置顶] Android增量更新与CMake构
  6. 自定义视图(组合控件)
  7. 从gpu到chromium compositor(cc)详解andr
  8. Android 5.X Activity过渡动画,以及漂亮的
  9. GridView中实现元素填充剩余空间(自适应)
  10. android基础--获取sdcard的总容量