磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可达几百到几千千兆字节,而基于RAM的存储器只能有几百或几千兆字节。不过从磁盘上读信息的时间为毫秒级,比从DRAM读慢了10万倍,比从SRAM读慢了100万倍。
磁盘由盘片构成,每个盘片有两面,称为表面,表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转,通常是5400~15000转每分钟(Revolution Per Minute,RPM)。
下图是一个典型的磁盘表面的结构,每个表面由一组称为磁道(track)的同心圆组成。每个磁道被划分为一组扇区(sector),每个扇区包含相等数量的数据位(通常是512字节),这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙(gap)分隔开,这些间隙中不存储数据位。间隙存储用来标识扇区的格式化位。
磁盘通常包含一个或多个这样的盘片,封装在一个密封的容器内,如下图所示。整个装置通常被称为磁盘驱动器(disk drive),简称为磁盘(disk)。
磁盘制造商通常用柱面(cylinder)来描述多个盘片驱动器的构造,这里柱面是所有盘片表面上到主轴中心的距离相等的磁道的集合。如一个驱动器有三个盘片和六个面,每个表面上的磁道的编号都是一致的,那么柱面k就是6个磁道k的的集合。
一个磁盘上可以记录的最大位数称为它的最大容量,或简称为容量。磁盘容量由以下因素决定:
下面是一个磁盘容量的计算公式:
假如有一个磁盘,有5个盘片,每个盘片2个面,每个面20000条磁道,每个磁道平均300个扇区,每个扇区512个字节,则这个磁盘的容量是:
磁盘用读/写头(read/write head)来读写存储在磁性表面的位,而读写头连接到一个传动臂一端,如下图所示。
通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面的任何磁道上。这样的机械运动成为寻道。多个盘片的磁盘针对每个盘面都有一个独立的读/写头,如下图所示。读/写头垂直排列,一致行动。在任何时刻,所有的读/写头都位于同一个柱面上。
在传动臂末端的读/写头在磁盘表面高度大约0.1微米处的一层气垫上飞翔,速度大约80km/h。这样小的间隙,盘面上一粒灰尘都像一块巨石,如果读/写头碰到这样一块巨石,就会停下来撞到盘面。
磁盘以扇区大小的块来读写数据,对扇区的访问时间主要有三部分:
现代磁盘构造复杂,有多个盘面,这些盘面上有不同的记录区。为了对操作系统隐藏这样的复杂性,现代磁盘将它们的构造呈现为一个简单的视图:一个B个扇区大小的逻辑块的序列,编号为0,1,2,...,B-1。磁盘封装中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际磁盘扇区之间的映射关系。
当操作系统想要执行一个I/O操作时,如读一个磁盘扇区的数据到主存,操作系统会发送一个命令到磁盘控制面,让它读某个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个三元组(盘面,磁道,扇区),这个三元组唯一地标识了对应的物理扇区。控制器上的硬件会解释这个三元组,将读/写头移到适当的柱面,等待扇区移动到读/写头下,将读/写头感知到的位放到控制器上的一个缓冲区中,然后将它们复制到主存中。