7139 字
36 分钟
5.3磁盘和固态硬盘

5.3 磁盘和固态硬盘#

在学习本节时,请读者思考以下问题:

  1. 磁盘一次读/写操作包含哪几部分时间?其中哪部分最长?
  2. 存储文件时,若一个磁道容纳不下,剩余数据应存放在同一盘面的不同磁道,还是同一柱面的不同盘面?

本节主要介绍磁盘管理的方式。学习时应重点掌握:计算一次磁盘操作的时间,以及对给定的磁道访问序列,按特定调度算法求出磁头移动的总磁道数和平均寻道长度。

5.3.1 磁盘#

磁盘(Disk)是由表面涂有磁性物质的盘片构成的存储设备,它通过磁头(一个导体线圈)读/写数据。在读/写操作期间,盘片高速旋转,磁头沿盘片径向移动以定位目标位置。盘面上的数据存储在一组同心圆中,称为磁道。每个磁道宽度与磁头相当,一个盘面包含上千个磁道。磁道又划分为数百个扇区,每个扇区具有固定大小(如1KB),是磁盘寻址的最小物理单位。相邻磁道及扇区间留有间隙,以避免读/写干扰。传统设计中,每个磁道扇区数相同,由于外道周长更大,其线性存储密度低于内道,磁盘的存储能力受限于最内道的最大存储密度。

NOTE

为提高磁盘存储容量并充分利用外层磁道的存储能力,现代磁盘采用区域记录(ZBR)技术:将盘面划分为若干环带,同一环带内的所有磁道具有相同的扇区数,外层环带的磁道扇区数多于内层环带。

磁盘安装在磁盘驱动器中,后者由磁头臂、驱动盘片旋转的转轴及数据输入/输出电路组成。多个盘片垂直堆叠形成盘组,每个盘面对应一个磁头,所有磁头安装在同一磁头臂上,同步径向移动。所有盘片上半径相同的磁道构成一个柱面磁盘地址用“柱面号·盘面号·扇区号”表示,总存储容量由柱面数、盘面数和每磁道扇区数共同决定。

读/写磁盘数据块的过程如下:

  1. 根据柱面号移动磁头臂,使磁头定位到目标柱面;
  2. 激活对应盘面的磁头;
  3. 等待目标扇区随盘片旋转至磁头下方,完成读/写操作。

磁盘可按结构分为不同类型:固定头磁盘为每个磁道配备一个磁头,磁头位置固定;活动头磁盘的磁头可沿径向移动,通过磁头臂定位到目标磁道;固定盘磁盘的盘片永久密封在驱动器内,不可拆卸;而可换盘磁盘则允许盘片拆卸和更换。最早的磁盘由IBM公司于1973年推出,称为温彻斯特磁盘(温盘),其采用活动磁头与固定盘片结构,是现代机械硬盘的雏形。

在操作系统中,每类资源的管理都涉及相应的调度算法。用户访问文件时,操作系统需完成权限检查、逻辑地址到物理地址的转换等步骤,最终将请求转化为对磁盘的读/写操作。当多个I/O请求同时到达时,系统需决定服务顺序,这正是磁盘调度算法所要解决的核心问题。

5.3.2 磁盘的管理#

1. 磁盘初始化#

一个新的磁盘只是一个涂有磁性材料的空白盘。在磁盘能够存储数据之前,必须将其划分为扇区,以便磁盘控制器进行读/写操作,这一过程称为低级格式化(也称物理格式化)。每个扇区通常由头部、数据区域和尾部组成。头部和尾部包含了一些磁盘控制器的使用信息,其中利用磁道号、磁头号和扇区号来标志一个扇区,利用CRC字段对扇区进行校验。

大多数磁盘在出厂时作为制造过程的一部分已完成低级格式化,这使制造商能够测试磁盘,并建立逻辑块地址到物理扇区的初始映射。对于许多磁盘,控制器在低级格式化时还可指定扇区中数据区域的大小,通常为256字节、512字节或4KB等。

2. 分区#

在使用磁盘存储文件之前,还需完成两个步骤。第一步是分区,将磁盘划分为若干逻辑区域(如常见的C盘、D盘),每个分区的起始位置和大小记录在主引导记录(MBR)的分区表中。第二步是对分区进行逻辑格式化(也称高级格式化),即在分区上建立文件系统,包括初始化根目录、创建用于管理空闲与已分配空间的数据结构,并将初始目录置为空。

由于扇区单位过小,为提高I/O效率,操作系统将多个连续扇区组合成一(在文件系统中也称)。为简化管理,通常将一簇分配给单个文件,因此文件占用空间为簇的整数倍;即使文件大小小于一簇(甚至为0字节),仍需占用一整簇空间。

3. 引导块#

计算机启动时需要运行一个初始化程序(称为自举程序),用于初始化CPU、寄存器、设备控制器和内存等,随后加载并启动操作系统。为此,自举程序需定位磁盘上的操作系统内核,将其载入内存,并跳转至其入口地址,从而开始操作系统的执行。

自举程序通常存放于ROM中。为避免因修改自举代码而需更换ROM硬件的问题,一般仅在ROM中保留一个小型自举装入程序,而将功能完整的引导程序存放在磁盘的引导块中。该引导块位于磁盘的固定位置。含有引导块的磁盘称为启动磁盘系统磁盘

ROM中的代码指示磁盘控制器将引导块读入内存并执行,后者可从指定位置加载操作系统内核并启动之。下面以 Windows 为例说明引导过程:Windows允许将磁盘划分为多个分区,其中活动分区(引导分区)包含操作系统核心文件。系统将初始引导代码存储在磁盘第0号扇区,称为主引导记录(MBR)。启动时,ROM中的代码首先读取MBR;除引导代码外,MBR还包含分区表和一个标志位,用于指明应从哪个分区引导。随后,系统读取该分区的首扇区(称为引导扇区),继续完成后续引导步骤,包括加载系统服务与驱动程序。

4. 坏块#

磁盘因含有机械部件且容错能力较弱,容易出现一个或多个扇区损坏,部分坏块甚至在出厂时就已存在。根据磁盘类型和控制器能力,坏块的处理方式有所不同。

对于简单磁盘,如采用IDE控制器的磁盘,坏块通常由操作系统在逻辑格式化时检测。例如MS-DOS的 Format命令会识别坏扇区,并在 FAT表中标记为不可用,从而避免程序使用。

对于现代的复杂磁盘,控制器内部维护一份坏块列表。该列表在出厂低级格式化时初始化,并在使用过程中动态更新。低级格式化会预留部分备用扇区,这些扇区对操作系统透明。当发现坏块时,控制器自动将其映射到备用扇区,实现逻辑替换,此机制称为扇区备用

坏块处理的核心思想是:通过软件标记或硬件重映射,确保系统不会使用坏块。

5.3.3 磁盘调度算法#

1. 磁盘的存取时间#

一次磁盘读/写操作的时间由寻道时间旋转延迟时间数据传输时间三部分组成。

  1. 寻道时间 TsT_s。活动头磁盘在读/写数据前,磁头移动到目标磁道所需的时间。该时间包括磁头臂的启动时间 ss 和跨越 nn 条磁道的移动时间,即
Ts=m×n+sT_s = m \times n + s

式中,mm 为跨越每条磁道所需的时间,约为0.2ms;磁头臂的启动时间约为2ms。

  1. 旋转延迟时间 TrT_r。目标扇区旋转至磁头下方所需的平均等待时间(因位置随机,平均为半圈旋转时间)。设磁盘转速为 rr,则
Tr=12rT_r = \frac{1}{2r}

典型的磁盘转速为5400转/分,相当于旋转一圈需11.1ms,对应 Tr5.56msT_r \approx 5.56\text{ms}

  1. 数据传输时间 TtT_t。读取或写入 bb 字节数据所需的时间。若每条磁道存储 NN 字节,则
Tt=brNT_t = \frac{b}{rN}

式中,rr 为磁盘每秒转数。总平均存取时间 TaT_a 可表示为

Ta=Ts+12r+brNT_a = T_s + \frac{1}{2r} + \frac{b}{rN}

在磁盘存取时间中,寻道时间占主导地位,且直接受磁盘调度算法影响;而旋转延迟时间和数据传输时间均与磁盘转速成反比,因此转速是磁盘性能的一个非常重要的硬件参数,难以从操作系统层面进行优化。因此,磁盘调度的主要目标是减少磁盘的平均寻道时间

2. 磁盘调度算法#

目前常用的磁盘调度算法有以下几种。

(1) 先来先服务(First Come First Served, FCFS)算法#

FCFS算法按进程请求访问磁盘的先后顺序进行调度,是最简单的调度算法。优点是公平性好。当请求较少且访问的扇区在物理位置上较为聚集时,性能尚可;但当大量进程竞争磁盘时,磁头频繁长距离移动,导致效率低下。因此,实际系统通常采用更高效的调度算法。

例如,假设磁盘请求队列为55,58,39,18,90,160,150,38,184,磁头初始位于磁道100。采用FCFS算法时。总移动距离为(45+3+19+21+72+70+10+112+146)=498个磁道,平均寻道长度=498/9=55.3。

(2) 最短寻道时间优先(Shortest Seek Time First, SSTF)算法#

SSTF 算法每次选择距离当前磁头位置最近的请求进行调度,以使单次寻道时间最短。尽管该策略不能保证平均寻道时间最小,但通常能提供优于FCFS算法的性能。该算法可能引发“饥饿”现象,若磁头位于18号磁道,且附近持续出现新请求,则磁头将长期在18号磁道附近来回移动,导致较远磁道(如184号)长时间得不到服务。

例如,设磁盘请求队列为55,58,39,18,90,160,150,38,184,磁头初始位于磁道100。采用SSTF算法时,磁头的移动过程如图5.23所示。总移动距离为10+32+3+16+1+20+132+10+24=248个磁道,平均寻道长度=248/9=27.5。

(3) 扫描(SCAN)算法#

SSTF 算法因磁头在局部区域来回移动而引发饥饿。为避免该问题,SCAN 算法规定:磁头仅在到达最外侧磁道后才转向内侧移动,到达最内侧磁道后才转向外侧移动。它在SSTF的基础上引入了磁头移动方向的约束。其行为类似于电梯运行,故也称电梯调度算法。但SCAN算法对最近扫描过的区域不公平,因此在访问局部性方面不如FCFS算法和SSTF算法。

例如,设磁盘请求队列为55,58,39,18,90,160,150,38,184,磁头初始位于磁道100。采用SCAN算法时,还需知道磁头移动方向。若磁头沿磁道号增大的方向移动,则访问顺序为100,150,160,184,200,90,58,55,39,38,18,磁头的移动过程如图5.24所示。总移动距离为(50+10+24+16+110+32+3+16+1+20)=282个磁道,平均寻道长度=282/9=31.33。

(4) 循环扫描(Circular SCAN, C-SCAN)算法#

C-SCAN算法在SCAN算法的基础上规定:磁头仅沿单一方向移动并提供服务,返回时快速移至起始端且不处理任何请求。由于SCAN算法倾向于优先服务靠近最内侧或最外侧磁道的请求,导致中间区域的响应延迟较大。C-SCAN算法通过将回扫过程转化为非服务性的快速跳转,并以循环方式均匀地处理所有请求,从而有效缓解了这种不公平性。

例如,假设磁盘请求队列为55,58,39,18,90,160,150,38,184,磁头初始位于磁道100。采用C-SCAN算法时,若磁头沿磁道号增大的方向移动,则访问顺序为100,150,160,184,200,0,18,38,39,55,58,90,磁头的移动过程如图5.25所示。总移动距离为50+10+24+16+200+18+20+1+16+3+32=390个磁道,平均寻道长度=390/9=43.33。

采用SCAN算法和C-SCAN算法时,磁头总是严格地从磁盘一端移动到另一端。实际上,可进一步改进:磁头只需移动到当前方向上最远的请求位置即可返回,无须抵达物理端点。这种改进后的SCAN算法和C-SCAN算法分别称为LOOK调度C-LOOK调度,因其在朝某一方向移动前会“查看”(look)该方向是否存在待处理请求。

若无特别说明,实际系统中所称的SCAN算法和C-SCAN算法通常指LOOK调度和C-LOOK调度。

以上四种磁盘调度算法的优缺点如表5.2所示。

表5.2 四种磁盘调度算法的优缺点

算法优点缺点
FCFS算法公平、简单平均寻道距离大,仅适用于磁盘I/O较少的场合
SSTF算法性能优于“先来先服务”不能保证平均寻道时间最短,可能出现“饥饿”现象
SCAN算法寻道性能较好,可避免“饥饿”现象对远离磁头当前位置一端的请求响应较慢
C-SCAN算法消除了对两端磁道请求的不公平性
(5) NStepSCAN算法和 FSCAN算法#

SSTF算法、SCAN算法和C-SCAN算法在特定情况下可能出现磁臂黏着现象:当一个或多个进程频繁发出对某个磁道的I/O请求时,磁头会长期滞留于该区域,导致其他进程难以获得服务。

为了缓解这一问题,NStepSCAN算法将磁盘请求队列划分为若干长度为 NN 的子队列。调度器按FCFS原则依次处理各子队列,而在处理每个子队列内部时,则采用SCAN算法进行扫描。在处理某个子队列的过程中,若有新请求到达,则系统将其放入尚未处理的其他子队列中,不插入当前正在服务的子队列。这一机制有效避免了磁头因局部热点请求而长期滞留的现象,进而避免了磁臂黏着。算法性能随 NN 值变化:当 NN 值较大时,NStepSCAN算法的行为趋近于SCAN算法;当 N=1N=1 时,每个子队列仅含一个请求,算法退化为FCFS算法。

FSCAN 算法是NStepSCAN算法的简化形式,其做法是将请求队列固定划分为两个子队列:

  1. 当前服务队列,包含调度开始时已存在的所有请求,按SCAN算法处理;
  2. 新请求队列,在当前扫描过程中新到达的请求全部暂存于此,推迟至下一轮扫描时处理。

通过“冻结当前、延后新请求”的策略,FSCAN算法不仅保留了SCAN算法的特性,还避免了磁臂黏着,且实现简单、开销低。

3. 减少延迟时间的方法#

除减少寻道时间外,减少旋转延迟时间也是提高磁盘I/O效率的重要途径。

磁盘是连续旋转设备。当磁头读取一个扇区后,系统需要一定时间处理数据,才能开始读取下一个扇区。若逻辑上相邻的块在物理上也相邻,则在处理当前扇区的过程中,下一个目标扇区可能已随盘面旋转而掠过磁头;待处理完成时,该扇区已不可访问,只能等待近一整圈才能再次到达,从而造成显著延迟。为此,可对单个盘面的扇区采用交替编号[假设盘面有8个扇区],使逻辑相邻的块在物理布局上保持适当间隔,确保在处理完一个扇区后,下一个目标扇区能及时旋转至磁头下方,从而有效减少因错过扇区而导致的长延迟。

此外,由于磁盘的所有盘面同步旋转,同一柱面内的块通常按盘面顺序连续存放,即依次为:盘面0扇区0、盘面0扇区1……盘面0扇区7、盘面1扇区0……盘面1扇区7、盘面2扇区0……。若要读取不同盘面上的连续块,例如在读完盘面0扇区7后,系统仍需一段处理时间;而在此期间,盘面持续旋转,导致下一个目标块(如盘面1扇区0)可能已在磁头经过时被错过,无法立即读取,只能等待其下一次旋转至磁头下方。为此,可对不同盘面实施错位命名[假设有2个盘面,且已采用交替编号],使得在处理完盘面0扇区7后,盘面1扇区0恰好或即将到达磁头位置,从而在首次经过时即可读取,显著减少旋转延迟。

在磁盘的存取时间中,寻道时间和旋转延迟时间属于“找”的时间,这类开销可通过合理的调度算法或布局优化来降低,而传输时间主要由磁盘本身的特性决定,难以通过软件手段减少。

4. 提高磁盘I/O速度的方法#

文件的访问速度是衡量文件系统性能最重要的因素,可从以下三个方面来优化:

  1. 改进文件的目录结构和检索目录的方法,以减少对目录的查找时间;
  2. 选取好的文件存储结构,以提高对文件的访问速度;
  3. 提高磁盘I/O速度,以实现文件数据在磁盘与内存之间的快速传送。

其中,1和2已在第4章中介绍,这里主要介绍如何提高磁盘I/O的速度。

  1. 采用磁盘高速缓存。5.2.2节介绍了磁盘高速缓存的概念。
  2. 调整磁盘请求顺序。即上文介绍的各种磁盘调度算法。
  3. 提前读。在读取当前磁盘块的同时,将逻辑上紧随其后的下一个(或多个)磁盘块一并预读到内存缓冲区,以应对后续可能的连续访问。
  4. 延迟写。当修改一个缓冲区中的数据时,并不立即写回磁盘,而仅设置延迟写标志;当该缓冲区被替换时,才真正将数据写入磁盘,从而合并多次写操作,减少I/O次数。
  5. 优化物理块的分布。除上文介绍的扇区编号优化外,对于采用链接或索引方式组织的文件,应尽量将其所属的块安排在同一磁道或相邻磁道上,以减少寻道时间。此外,将若干连续扇区组成簇,以簇为单位对文件进行分配,也能有效降低磁头的平均移动距离。
  6. 虚拟盘。指用内存空间仿真磁盘,也称RAM盘。由于内存访问速度远高于磁盘,因此常用于存放临时文件或对I/O延迟敏感的数据。虚拟盘与磁盘高速缓存的区别:虚拟盘的内容完全由用户程序控制,而磁盘高速缓存的内容则由操作系统透明管理。
  7. 采用磁盘阵列RAID。某些RAID级别可支持交叉存取,能大幅提高磁盘I/O速度。

5.3.4 固态硬盘#

1. 固态硬盘的特性#

固态硬盘(SSD)是一种基于闪存技术的存储设备。其存储介质与U盘类似,但容量更大、存取性能更优。一个SSD由一个或多个闪存芯片以及闪存翻译层组成。其中,闪存芯片替代了传统磁盘中的机械驱动器;而闪存翻译层负责将CPU发出的逻辑块读/写请求转换为对底层物理闪存的读/写控制信号,因此,闪存翻译层相当于代替了磁盘控制器的角色。

一个闪存芯片由 BB 块组成,每块包含 PP 页。通常,页的大小为 512B4KB512\text{B} \sim 4\text{KB},每块包含 3212832 \sim 128 页,块的大小为 16KB512KB16\text{KB} \sim 512\text{KB}读/写操作以页为单位进行;擦除操作以块为单位进行,只有在整块被擦除后,才能向其中的页写入新数据。一旦某块被擦除,其所有页均可重新写入一次。每个块的擦写次数有限,经过若干次重复写入后,该块会因磨损而失效。

随机写入速度较慢,主要有两个原因:

  1. 擦除操作耗时较长,通常比页访问慢一个数量级。
  2. 若需修改一个已包含有效数据的页 PiP_i,必须先将该块中所有有效页复制到一个新的(已擦除的)块中,再执行对 PiP_i 的写入。

相比传统机械磁盘,SSD具有显著优势:由半导体器件构成,无机械运动部件,因此随机访问延迟极低,且无噪声、无振动、功耗更低、抗震性强、安全性更高。

2. 磨损均衡(Wear Leveling)#

SSD的主要缺点在于闪存的擦写寿命有限,通常仅为几百至几千次。若直接用普通闪存构建SSD而不加管理,则实际的寿命表现可能令人失望——因为读/写操作往往会集中在少数物理块上,导致这些区域迅速磨损。一旦这部分闪存损坏,整块SSD即告失效。这种磨损不均衡的情况,可能导致一块256GB的SSD,仅因几兆字节的闪存损坏而报废。

为解决这一问题,SSD引入了磨损均衡技术,主要分为两类:

  1. 动态磨损均衡。在写入数据时,优先选择擦写次数较少的空闲块,避免反复写入同一区域,从而将写入负载分散到更多物理块上。
  2. 静态磨损均衡。这是一种更高级的策略。即使没有新数据写入,控制器也会定期扫描并自动进行数据迁移,将高磨损块中的有效数据迁移到低磨损块中。使高磨损块转为以读为主,低磨损块承担更多写入任务,进一步均衡整体寿命。

得益于磨损均衡算法,SSD的实际使用寿命显著提升。例如,一块256GB的SSD,若其闪存的擦写寿命为500次,则理论总写入量可达125TB。即使每天持续写入10GB数据,也需要三十多年才会达到寿命极限。而日常使用中,普通用户的日均写入量通常远低于此值。

5.3.5 本节小结#

本节开头提出的问题的参考答案如下。

  1. 磁盘一次读/写操作包含哪几部分时间?其中哪部分最长?

    磁盘读/写操作的时间由三部分组成:寻道时间旋转延迟传输时间。寻道时间是将磁头臂移动到指定磁道所需的时间;旋转延迟是等待目标扇区旋转至磁头下方所需的时间;传输时间是实际读出或写入数据所经历的时间。由于磁头臂的机械运动较慢,寻道时间通常最长

  2. 存储文件时,若一个磁道容纳不下,剩余数据应存放在同一盘面的不同磁道,还是同一柱面的不同盘面?

    由于寻道时间对磁盘访问性能影响最大,应优先将剩余数据存放在同一柱面的不同盘面上。同一柱面的各磁道半径相同,切换盘面仅需选择对应磁头,无须移动磁头臂,故无寻道开销;而若存放在同一盘面的不同磁道,则须移动磁头臂,产生显著寻道延迟,降低访问效率。

5.4 本章疑难点#

  1. 如何改进设备分配策略,以提高其灵活性和成功率?

    可从以下两个方面对基本的设备分配程序加以改进:

    1. 增强设备无关性。进程使用逻辑设备名发起I/O请求。系统首先从系统设备表(SDT)中查找该类设备的第一个设备控制表(DCT);若该设备正忙,则继续查找下一个DCT;仅当所有同类设备均处于忙碌状态时,才将进程挂起,并将其加入该类设备的等待队列;只要存在一个可用设备,系统便进入后续的安全性检查与分配流程。
    2. 支持多通路I/O结构。为避免I/O瓶颈,现代系统常采用多通路设计。在此结构下,控制器与通道的分配也需逐级尝试:若设备所连接的第一个控制器(或该控制器所连接的第一个通道)正忙,则尝试下一个;仅当所有相关控制器(或通道)均不可用时,分配才宣告失败,进程被挂入相应等待队列;只要有一个可用,即可完成分配。

    在具有通道的系统中,设备分配需要依次访问 SDT→DCT→COCT→CHCT,成功分配一个设备须同时满足:设备可用;控制器可用;通道可用。因此,常称“设备分配,要过三关”。

  2. 用户缓冲区与内核缓冲区的定义及作用分别是什么?

    用户缓冲区是指用户进程在读取文件时,通常会预先申请一块内存区域(如一个数组),称为缓冲区(Buffer),用于暂存从文件中读取的数据。每次调用 read 系统调用时,操作系统会将读取的数据填充到该缓冲区中,随后应用程序便可直接从中获取数据。当其中的数据被处理完毕后,再发起下一次 read 系统调用以重新填充缓冲区。可见,用户缓冲区的主要作用是减少系统调用的次数,进而降低因频繁在用户态与内核态之间切换所带来的开销。

    内核缓冲区则是操作系统在内核空间中维护的缓冲区。当用户进程请求读取磁盘数据时,系统并不会直接访问磁盘,而是先检查内核缓冲区中是否已缓存所需数据:若存在,则将数据从内核缓冲区复制到用户缓冲区;若不存在,内核会发起磁盘I/O请求,并将当前进程挂起,转而调度其他进程执行。磁盘数据被读入内核缓冲区后,系统再将数据复制到用户缓冲区,并唤醒该进程。对于写操作,用户进程提交的数据通常不会立即写入磁盘,而是先写入内核缓冲区;当缓冲区中的数据积累到一定量,或满足特定刷新条件时,内核才会将数据批量写入磁盘。可见,内核缓冲区的核心目的是提升磁盘I/O的整体效率,尤其对写操作具有突出的优化效果。

5.3磁盘和固态硬盘
https://www.atsuko.top/posts/408/operating-system/53-disk-and-solid-state-drive/
作者
AC_DB
发布于
2026-05-30
许可协议
CC BY-NC-SA 4.0

评论