磁盘是广为应用的保存大量数据的存储设备,存储数据的数量级可以达到几百到几千千兆字节,而基于RAM的存储器只能有几百或几千兆字节。但是,从磁盘上度信息的时间为毫秒级,比从DRAM读慢了10万倍,比从SRAM读慢了100万倍。
1.磁盘构造
磁盘是由盘片构成的。每个盘片有两面或者称为表面,表面覆盖着磁性记录材料。盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转。
图6-9a展示了一个典型的磁盘表面的结构。每个表面是由一组称为磁道的同心圆组成的。每个磁道被划分为一组扇区。每个扇区包含相等数量的数据位(通常是512字节),这些数据编码在扇区上的磁性材料中。扇区之间由一些间隙分隔开,这些间隙中不存储数据位。间隙存储用来标识扇区的格式化位。(注意,上图的间隙标记有错误)
磁盘是由一个或多个叠放在一起的盘片组成的,他们被封装在一个密封的包装,如图6-9b所示。整个装置通常被称为磁盘驱动器我们通常简称为磁盘,有时,我们会称磁盘为旋转磁盘,以使之区别于基于闪存的固态硬盘(SSD),SSD是没有移动部分的。
2.磁盘容量
一个磁盘上可以记录的最大位数称为它的最大容量,或者简称为容量。磁盘容量是由以下技术因素决定的:
记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数。
面密度(位/平方英寸):记录密度与磁道密度的乘积。
随着面密度的提高,磁盘之间的间隙(那里没有存储数据位)变得不可接受地大。因此,现代大容量磁盘使用一种称为多区记录的技术。在这种技术中,柱面的集合被分割成不相交的子集合,称为记录区。每个区包含一组连续的柱面。
下面的公式给出了一个磁盘的容量:
例如,假设我们有一个磁盘,有五个盘片,每个扇区512个字节,每个面20000条磁道,每条磁道平均300个扇区。那么这个磁盘的容量是:
制造商是以千兆字节(GB)或兆兆字节(TB)为单位来表达磁盘容量的,这里1GB=10^9字节,1TB = 10 ^12 字节。
对于与DRAM和SRAM容量相关的计量单位,通常K=2^10, M=2 ^20,G = 2 ^30,而T=2 ^40。对于与像磁盘和网络这样的I/O设备容量相关的计量单元,通常K=10 ^ 3,M=10 ^ 6,G=10 ^9,而T= 10 ^ 12。
3.磁盘操作
磁盘用读/写头来读写存储在磁性表面的位,而读/写头连接到一个传动臂一端。通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面上的任何磁道上。这样的机械运动称为寻道。一旦读/写头定位到了期望的磁道上,那么当磁道上的每个位通过它的下面时,读/写头可以读该位,也可以写该位。有多个盘片的磁盘针对每个盘片都有一个独立的读/写头。读/写头垂直排列,一致行动。在任何时刻,所有的读/写头都位于同一个柱面上。
对扇区的访问时间有三个主要部分:寻道时间、旋转时间和传送时间。
寻道时间:为了读取某个目标扇区的内容,传动臂首先将读/写头定位到包含目标扇区的磁道上。移动传动臂所需的时间称为寻道时间。寻道时间依赖于读/写头以前的位置和传动臂在盘面上移动的速度。
旋转时间:一旦读/写头定位到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读/写头下。这个步骤的性能依赖于当读/写头到达目标扇区时盘面的位置以及磁盘的旋转速度。在最坏的情况下,读/写头刚刚错过了目标扇区,必须等待磁盘转一整圈。因此,最大旋转延迟(以秒为单位)是T=(1/RPM)X (60s/1min) 。
平均旋转时间T是最大旋转延迟的一半。
传送时间:当目标扇区的第一个位位于读/写头下时,驱动器就可以开始读或者写该扇区的内容了。一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目。我们可以粗略地估计一个扇区以秒为单位的平均传送时间如下
T=(1/RPM)X(1/(平均扇区数/磁道))X(60s/1min)
我们可以估计访问一个磁盘扇区内容的平均时间为平均寻道时间、平均旋转延迟和平均传送时间之和。例如,考虑一个有如下参数的磁盘:
对于这个磁盘,平均旋转延迟(以ms为单位)是
平均传送时间是
整个访问的估计时间是
这个例子说明了一些很重要的问题:
· 访问一个磁盘扇区中512个字节的时间主要是寻道时间和旋转延迟。访问扇区中的第一个字节用了很长时间,但是访问剩下的字节几乎不用时间。
· 因为寻道时间和旋转延迟大致相等,所以将寻道时间乘2是估计磁盘访问时间的简单而合理的方法。
· 对存储在SRAM中的一个64位字的访问时间大约是4ns,对DRAM的访问时间是60ns。因此,从内存中读一个512字节扇区大小的块的时间对SRAM来说大约是256ns,对DRAM来说大约是4000ns。磁盘访问时间,大约是10ms,是SRAM的大约40000倍,是DRAM的大约2500倍。
4.逻辑磁盘块
现代磁盘构造复杂,有多个盘面,这些盘面上有不同的记录区。为了对操作系统隐藏这样的复杂性,现代磁盘将他们的构造呈现为一个简单的视图,一个B个扇区大小的逻辑块的序列,编号为0,1,···,B-1。磁盘封装中有一个小的硬件/固件设备,称为磁盘控制器,维护着逻辑块号和实际(物理)磁盘扇区之间的映射关系。
当操作系统想要执行一个I/O操作时,例如读一个磁盘扇区的数据到主存,操作系统会发送一个命令到磁盘控制器,让它读某个逻辑块号。控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)的三元组,这个三元组唯一地标识了对应的物理扇区。控制器上的硬件会解释这个三元组,将读/写头移动到适当的柱面,等待扇区移动到读/写头下,将读/写头感知到的位放到控制器上的一个小缓冲区中,然后将它们复制到主存中。
5.连接I/O设备
例如图形卡、监视器、鼠标、键盘和磁盘这样的输入/输出(I/O)设备,都是通过I/O总线,例如Intel的外围设备互连总线(PCI)连接到CPU和主存的。系统总线和内存总线是与CPU相关的,与它们不同,诸如PCI这样的I/O总线设计成与底层CPU无关。
虽然I/O总线比系统总线和内存总线慢,但是他可以容纳种类繁多的第三方I/O设备。
通用串行总线(USB)控制器是一个连接到USB总线的设备的中转机构,USB总线是一个广泛使用的标准,连接各种外围I/O设备,包括键盘、鼠标、调制解调器、数码相机、游戏操作杆、打印机、外部磁盘驱动器和固态硬盘。
图形卡(或适配器)包含硬件和软件逻辑,它们负责代表CPU在显示器上画像素。
主机总线适配器将一个或多个磁盘连接到I/O总线,使用的是一个特别地主机总线接口定义的通信协议。
6.访问磁盘
CPU使用一种称为内存映射I/O的技术来向I/O设备发射命令。在使用内存映射I/O的系统中,地址空间中有一块地址是为与I/O设备通信保留的。每个这样的地址称为一个I/O端口。
假设磁盘控制器映射到端口0xa0。随后,CPU可能通过执行三个对地址0xa0的存储指令,发起磁盘读:第一条指令是发送一个命令字,告诉磁盘发起一个读,同时还发送了其他的参数,例如当读完成后,是否中断CPU。第二条指令指明应该读的逻辑块号。第三条指令指明应该存储磁盘扇区内容的主存地址。
当CPU发出了请求之后,在磁盘执行读的时候,它通常会做些其他的工作。回想一个,一个1GHz的处理器时钟周期为1ns,在用来读磁盘的16ms时间里,它潜在地可能执行1600万条指令。在传输进行时,只是简单地等待,什么都不做,是一种极大的浪费。
在磁盘控制器收到来自CPU的读命令之后,它将逻辑块号翻译成一个扇区地址,读该扇区的内容,然后将这些内容直接传送到主存,不需要CPU的干涉。设备可以自己执行读或者写总线事务而不需要CPU干涉的过程,称为直接内存访问。这种数据传送称为DMA传送。
在DMA传送完成,磁盘扇区的内容被安全地存储在主存中以后,磁盘控制器通过给CPU发送一个中断信号来通知CPU。基本思想是中断会发信号到CPU芯片的一个外部引脚上。这会导致CPU暂停它当前正在做的工作,跳转到一个操作系统例程。这个程序会记录下I/O已经完成,然后将控制返回到CPU被中断的地方。
固态硬盘
固态硬盘SSD是一种基于闪存的存储技术,一个SSD封装由一个或多个闪存芯片和闪存翻译层组成,闪存芯片替代传统旋转磁盘中的机械驱动器,而闪存翻译层是一个硬件/固件设备,扮演与磁盘控制器相同的角色,将对逻辑块的请求翻译成对底层物理设备的访问。读SSD比写要快。随机读和写的性能差别是由底层闪存基本属性决定的。
如图所示,一个闪存由B个块的序列组成,每个块由P页组成。通常,页的大小是512字节~4KB,块是由32 ~ 128页组成的,块的大小为16KB ~ 512KB。数据是以页为单位读写的。只有在一页所属的块整个被擦除之后,才能写这一页(通常是指该块中所有位被设置为1)。一旦一个块被擦除了,块中每一个页都可以不需要再进行擦除就写一次。在大约进行100000次重复写之后,块就会磨损坏,一旦一个块莫损坏之后,就不能再使用了。
随机写很慢,有两个原因。首先,擦除块需要相对较长的时间,1ms级的,比访问页所需时间要高一个数量级。其次,如果写操作试图修改一个包含已经有数据(也就是不是全为1)的页p,那么这个块中所有带有用数据的页都必须被复制到一个新(擦除过的)块,然后才能进行对页p的写。
我们可以从对存储技术的讨论中总结出几个很重要的思想:
1.不同的存储技术有不同的价格和性能折中。
2.不同存储技术的价格和性能属性以截然不同的速率变化着。
3.DRAM和磁盘的性能滞后于CPU的性能。