磁盘
I/O操作、文件系统当然是计算机中非常重要的概念,想更深刻的理解这些概念,我认为很有必要了解支撑其实现的硬件,就来说一说磁盘。
磁盘现在已经是当前计算机组成不可或缺的一部分了,它在存储器层次结构中的底层(特点存储量大,价格便宜,访问速度慢),它承载着文件,比如操作系统这样的软件也是待在磁盘上的。
物理构造
早期我们用计算机的同学更多用台式机,机箱子里各种各样的设备我们大都拆开看过,硬盘也不会陌生,一个长方体扁形密封的硬铁皮块,通过SCSI或SATA接口连到I/O总线上。 看下内部构造:
磁盘是由一个或多个盘片组成,每个盘片有上下两个表面,表面上覆盖着磁性材料,来存储二进制信息。盘片中间有一个可以旋转的主轴,它让盘片以固定的速率旋转,磁盘的一个重要参数RPM(每分钟多少转),通常是5400~15000RPM。
一个盘片的构造如图:
这里涉及几个重要参数概念。如图,每个磁盘表面是由一组称作磁道(Track)的同心圆组成。每个磁道被划分为一组扇区(Sector)。每个扇区包含相等数量的数据(通常是512byte),这些数据被编码在扇区上的磁性材料中。扇区之间有一些间隙(Gaps)分隔开,间隙中没有磁性材料就没有数据存储。
多个盘片的示意图:
磁盘一般有一个或者多个盘片,有时我们把磁盘称作旋转磁盘,由中间的主轴旋转。这区别于SSD的固态硬盘,SSD是基于闪存的,没有移动部分,非机械装置。 还有一个概念是柱面(Cylinder),柱面是所有盘片表面上到主轴中心距离相等的磁道的集合。如图,该磁盘有3个盘片,6个表面(每个盘两个面),那么柱面k,就是6个磁道k的集合。
磁盘容量
磁盘可以记录的最大位数就是它的容量。容量是由以下几个因素决定的:
- 记录密度:磁道单位长度能存多少位的数据。
- 磁道密度:这是指距离盘片中心,一个单位长度内,一个盘片有多少个磁道数。
- 面密度:由1、2这两个基本参数相乘。
困扰我好长时间的一个疑问
我们都知道同一个扇区存的数据量一样,比如512字节。但是盘片是圆形的,越靠外,扇区的面积应该越大,为什么数据量一样?我之前的理解是那只能让靠外的磁性材料的密度变低,这样逐层变低,工艺要求太高了吧。。
直到最近看了磁盘相关知识才明白。其实前边说的Gaps间隙的概念就能解释这个问题了,每个扇区之间有间隔,并非都是充满了磁性材料,所以能让每个扇区存储数据一样多。
容量计算
理解了磁盘的构造和几个概念,能得到一个磁盘的容量如何计算:
容量 = 每个扇区的字节数 * 每个磁道的扇区数 * 每个盘片表面的磁道数 * 每个盘片的表面数 * 盘片数
比如有一个磁盘,有5个盘片(2个面),每个扇区512字节,每个面20000个磁道,每条磁道平均300个扇区。
容量 = 512 * 300 * 20000 * 2 * 5 = 30720000000 byte = 30.72GB
磁盘厂商在计数上,1M=1000KB,1KB=1000Byte
磁盘操作
磁盘利用读写头来读写存储在磁盘表面的位,读写头连在一个传动臂的一端,读写头不是贴在盘面上,实际在盘面的上方大约0.1微米的高度位置飞奔。。通过移动这个传动臂,读写头可以定位在任何一个磁道上,通过磁盘的旋转,则可以定位在任何一个扇区上。
定位磁道的这种机械动作称为寻道(seek)。 有多个盘片的磁盘在每个盘面都有一个独立的读写头,读写头垂直排列,一致行动,因此任一时刻,所有的读写头都在一个柱面上。
切换磁道需要利用传动臂的机械装置,而切换磁头是利用电子信号,因此为了更快写数据,先写同一柱面,柱面满了切下一磁道。
如图:
磁盘以扇区大小的块来读写数据。对扇区的的访问时间有三个主要的部分组成: 寻道时间、旋转时间、传送时间。
-
寻道时间:
【切换磁道的时间】为了读取某个扇区的数据,磁盘先是要找到扇区所属的磁道。那么传动臂就要移动到磁道上,显然这个时间要依赖当前读写头在哪个磁道上,以及读写头移动的速度。通常厂商是对几千次的随机寻道的平均时间来衡量的,一般是3-9ms。最大可以高达20ms。
-
旋转时间:
【转半圈花的时间】定位了所属磁道以后,开始等待该扇区的第一个位到来。这个依赖于当前读写头切到磁道后距离目标扇区的位置,以及盘片的旋转速度。最差的性能(最大的时间)是,当切到目标磁道后,读写头刚好在目标扇区后,那就得再等一圈。平均旋转时间=最大时间/2。 T(max rotation) = 1/RPM * 60s/M
-
传送时间:
【转过目标扇区花的时间】定位到目标扇区的第一个位以后,开始读写数据。转过该目标扇区需要的时间,依赖于转动速度以及每个磁道有多少个扇区数。 T(trans) = T(max rotation) * 1/单个磁道的平均扇区数
举个栗子:
参数 | 值 |
---|---|
旋转速率 | 7200 RPM |
平均寻道时间 | 9ms |
每个磁道平均扇区数 | 400 |
平均旋转延迟 T(avg)=T(max)/2 = 1/7200 * 60 * 1/2 * 1000 ms= 4ms
平均传送时间 T = 1/7200 * 60 * 1/400 * 1000ms = 0.02ms
平均访问时间 = 9ms + 4ms + 0.02ms = 13.02ms
可以看出几个问题:
- 传送延迟的时间某种程度可以忽略,主要是寻道时间+旋转延迟。
- 2倍的寻道时间可以简单当成访问时间的估计。
- 磁盘的访问速度和DRAM相差1000以上的数量级。
逻辑磁盘块
由于磁盘构造的复杂性,而为了屏蔽操作系统访问磁盘的复杂性,考虑要虚拟化磁盘资源。一个有N个扇区大小的逻辑块的序列,0、1、2、、、N-1。磁盘内部有一个关键的固件设备就是磁盘控制器,它维护着逻辑块号和真实磁盘扇区之间的映射。磁盘控制器就是充当磁盘对外访问控制的媒介。
磁盘读写原理
当操作系统要执行一个IO操作时,比如读一个扇区的数据给内存,操作系统会发送一个读命令给磁盘控制器,让它读某个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个CHS三元组(Cylinder柱面,Header 磁头[盘片面],Sector扇区),唯一标识对应的物理扇区位置。磁盘定位到目标位置读取,放到控制器上的一个小缓冲区中,然后把他们再复制到主存中。