读书笔记
🚂《Operating System:Three Easy Pieces》第三十七章 磁盘驱动器
00 分钟
2023-3-3
2023-4-15
type
status
date
slug
summary
tags
category
icon
password
Property
Apr 15, 2023 03:22 PM
在本章中,我们将更详细地介绍一种设备:磁盘驱动器(hard disk drive)。
数十年来,这些驱动器一直是计算机系统中持久数据存储的主要形式,文件系统技术(即将探讨)的大部分发展都是基于它们的行为。因此,在构建管理它的文件系统软件之前,有必要先了解磁盘操作的细节。
关键问题:如何存储和访问磁盘上的数据现代磁盘驱动器如何存储数据?接口是什么?数据是如何安排和访问的?磁盘调度如何提高性能?

接口

所有现代驱动器的基本接口都很简单。驱动器由大量扇区(512 字节块)组成,每个扇区都可以读取或写入。在具有 n 个扇区的磁盘上,扇区从 0 到 n−1 编号。因此,我们可以将磁盘视为一组扇区,0 到 n−1 是驱动器的地址空间(address space)。
多扇区操作是可能的。实际上,许多文件系统一次读取或写入 4KB(或更多)。但是,在更新磁盘时,驱动器制造商唯一保证的是单个 512 字节的写入是原子的(atomic,即它将完整地完成或者根本不会完成)。因此,如果发生不合时宜的掉电,则只能完成较大写入的一部分 [有时称为不完整写入(torn write)]。 大多数磁盘驱动器的客户端都会做出一些假设,但这些假设并未直接在接口中指定。具体来说,通常可以假设访问驱动器地址空间内两个彼此靠近的块将比访问两个相隔很远的块更快。人们通常也可以假设访问连续块(即顺序读取或写入)是最快的访问模式,并且通常比任何更随机的访问模式快得多。

基本几何形状

盘片(platter)

它是一个圆形坚硬的表面,通过引入磁性变化来永久存储数据。磁盘可能有一个或多个盘片。每个盘片有两面,每面都称为表面。这些盘片通常由一些硬质材料(如铝)制成,然后涂上薄薄的磁性层,即使驱动器断电,驱动器也能持久存储数据位。

主轴(spindle)

所有盘片都围绕主轴(spindle)连接在一起,主轴连接到一个电机,以一个恒定(固定)的速度旋转盘片(当驱动器接通电源时)。旋转速率通常以每分钟转数(Rotations Per Minute,RPM)来测量,典型的现代数值在 7200~15000 RPM 范围内。
我们经常会对单次旋转的时间感兴趣,例如,以 10000 RPM 旋转的驱动器意味着一次旋转需要大约 6ms。

磁道(track)

数据在扇区的同心圆中的每个表面上被编码。我们称这样的同心圆为一个磁道(track)。一个表面包含数以千计的磁道,紧密地排在一起,数百个磁道只有头发的宽度。

磁头(disk head)

要从表面进行读写操作,我们需要一种机制,使我们能够感应(即读取)磁盘上的磁性图案,或者让它们发生变化(即写入)。读写过程由磁头(disk head)完成;驱动器的每个表面有一个这样的磁头。

磁盘臂(disk arm)

磁头连接到单个磁盘臂(disk arm)上,磁盘臂在表面上移动,将磁头定位在期望的磁道上。

简单的磁盘驱动器

假设我们有一个单一磁道的简单磁盘:
该磁道只有 12 个扇区,每个扇区的大小为 512 字节(典型的扇区大小,回忆一下),用 0 到 11 的数字表示。
notion image

单磁道延迟:旋转延迟

必须等待期望的扇区旋转到磁头下。这种等待在现代驱动器中经常发生,并且是 I/O 服务时间的重要组成部分,找同一磁道内另一个位置数据的时间。
旋转延迟(rotational delay,有时称为 rotation delay)
最长大约为R(周长),就是转到5。转到0大约为R/2。

多磁道:寻道时间

现代磁盘当然有数以百万计的磁道。因此,我们来看看更具现实感的磁盘表面,这个表面有 3 条磁道:
notion image
为了理解驱动器如何访问给定的扇区,我们现在追踪请求发生在远处扇区的情况:例如,读取扇区 11。为了服务这个读取请求,驱动器必须首先将磁盘臂移动到正确的磁道(在这种情况下,是最外面的磁道),通过一个所谓的寻道(seek)过程。寻道,以及旋转,是最昂贵的磁盘操作之一。
寻道有许多阶段:
  • 首先是磁盘臂移动时的加速阶段。
  • 然后随着磁盘臂全速移动而惯性滑动。
  • 然后随着磁盘臂减速而减速。
  • 最后,在磁头小心地放置在正确的磁道上时停下来。
停放时间(settling time)通常不小,例如 0.5~2ms,因为驱动器必须确定找到正确的磁道(想象一下,如果它只是移到附近!)。 寻道之后,磁盘臂将磁头定位在正确的磁道上。在寻道过程中,磁盘臂已经移动到所需的磁道上,并且盘片当然已经开始旋转,在这个例子中,大约旋转了 3 个扇区。因此,扇区 9 即将通过磁头下方,我们只能承受短暂的转动延迟,以便完成传输。
当扇区经过磁盘磁头时,I/O 的最后阶段将发生,称为传输(transfer),数据从表面读取或写入表面。
完整的 I/O 时间图:首先寻道,然后等待转动延迟,最后传输

一些其他细节

许多驱动器采用某种形式的磁道偏斜(track skew),以确保即使在跨越磁道边界时,顺序读取也可以方便地服务。
notion image
扇区往往会偏斜,因为从一个磁道切换到另一个磁道时,磁盘需要时间来重新定位磁头(即便移到相邻磁道)。如果没有这种偏斜,磁头将移动到下一个磁道,但所需的下一个块已经旋转到磁头下,因此驱动器将不得不等待整个旋转延迟,才能访问下一个块。
外圈磁道通常比内圈磁道具有更多扇区,这是几何结构的结果。那里空间更多。这些磁道通常 被称为多区域(multi-zoned)磁盘驱动器,其中磁盘被组织成多个区域,区域是表面上连续的一组磁道。每个区域每个磁道具有相同的扇区数量,并且外圈区域具有比内圈区域更多的扇区。
任何现代磁盘驱动器都有一个重要组成部分,即它的缓存(cache),由于历史原因有时称为磁道缓冲区(track buffer)。该缓存只是少量的内存(通常大约 8MB 或 16MB),驱动器可以使用这些内存来保存从磁盘读取或写入磁盘的数据。例如,当从磁盘读取扇区时,驱动器可能决定读取该磁道上的所有扇区并将其缓存在其存储器中。这样做可以让驱动器快速响应所有后续对同一磁道的请求。
在写入时,驱动器面临一个选择:它应该在将数据放入其内存之后,还是写入实际写入磁盘之后,回报写入完成?前者被称为后写(write back)缓存(有时称为立即报告,immediate reporting),后者则称为直写(write through)。后写缓存有时会使驱动器看起来“更快”,但可能有危险。如果文件系统或应用程序要求将数据按特定顺序写入磁盘以保证正确性,后写缓存可能会导致问题。

I/O 时间:用数学

将 I/O 时间表示为 3 个主要部分之和:
较驱动器用 I/O 速率(RI/O)更容易(如下所示),它很容易从时间计算出来。只要将传输的大小除以所花的时间:
notion image

磁盘调度

与任务调度不同,每个任务的长度通常是不知道的,对于磁盘调度,我们可以很好地猜测“任务”(即磁盘请求)需要多长时间。通过估计请求的查找和可能的旋转延迟,磁盘调度程序可以知道每个请求将花费多长时间,因此(贪婪地)选择先服务花费最少时间的请求。因此,磁盘调度程序将尝试在其操作中遵循 SJF(最短任务优先)的原则(principle of SJF,shortest job first)。

SSTF:最短寻道时间优先

早期的磁盘调度方法被称为最短寻道时间优先(Shortest-Seek-Time-First,SSTF)(也称为最短寻道优先,Shortest-Seek-First,SSF)。SSTF 按磁道对 I/O 请求队列排序,选择在最近磁道上的请求先完成。
SSTF 不是万能的,原因如下:
  • 主机操作系统无法利用驱动器的几何结构,而是只会看到一系列的块。幸运的是,这个问题很容易解决。操作系统可以简单地实现最近块优先(Nearest-Block-First,NBF),而不是 SSTF,然后用最近的块地址来调度请求。
  • 饥饿(starvation)。想象一下,在我们上面的例子中,是否有对磁头当前所在位置的内圈磁道有稳定的请求。然后,纯粹的 SSTF 方法将完全忽略对其他磁道的请求。

电梯(又称 SCAN 或 C-SCAN)

简单地以跨越磁道的顺序来服务磁盘请求。我们将一次跨越磁盘称为扫一遍。因此,如果请求的块所属的磁道在这次扫一遍中已经服务过了,它就不会立即处理,而是排队等待下次扫一遍。
SCAN 有许多变种,所有这些变种都是一样的:
  • F-SCAN在扫一遍时冻结队列以进行维护。这个操作会将扫一遍期间进入的请求放入队列中,以便稍后处理。这样做可以避免远距离请求饥饿,延迟了迟到(但更近)请求的服务。
  • C-SCAN 是另一种常见的变体,即循环 SCAN(Circular SCAN)的缩写。不是在一个方向扫过磁盘,该算法从外圈扫到内圈,然后从内圈扫到外圈,如此下去。
由于现在应该很明显的原因,这种算法(及其变种)有时被称为电梯(elevator)算法,因为它的行为像电梯,电梯要么向上要么向下,而不只根据哪层楼更近来服务请求。 然而,SCAN 及其变种并不是最好的调度技术。特别是,SCAN(甚至 SSTF)实际上并没有严格遵守 SJF 的原则。具体来说,它们忽视了旋转
因此,另一个关键问题如下:
💡
关键问题:如何计算磁盘旋转开销如何同时考虑寻道和旋转,实现更接近 SJF 的算法?

SPTF:最短定位时间优先

Shortest Positioning Time First,SPTF,有时也称为最短接入时间优先,Shortest Access Time First,SATF。
在现代驱动器中,正如上面所看到的,查找和旋转大致相当(当然,视具体的请求而定),因此 SPTF 是有用的,它提高了性能。然而,它在操作系统中实现起来更加困难,操作系统通常不太清楚磁道边界在哪,也不知道磁头当前的位置(旋转到了哪里)。因此,SPTF通常在驱动器内部执行。
💡
提示:总是视情况而定(LIVNY 定律) 正如我们的同事 Miron Livny 总是说的那样,几乎任何问题都可以用“视情况而定”来回答。但是,要谨慎使用,因为如果你以这种方式回答太多问题,人们就不会再问你问题。例如,有人问:“想去吃午饭吗?”你回答:“视情况而定。你是一个人来吗?”

其他调度问题

在现代系统中,磁盘可以接受多个分离的请求,它们本身具有复杂的内部调度程序(它们可以准确地实现 SPTF。在磁盘控制器内部,所有相关细节都可以得到,包括精确的磁头位置)。因此,操作系统调度程序通常会选择它认为最好的几个请求,并将它们全部发送到磁盘。磁盘然后利用其磁头位置和详细的磁道布局信息等内部知识,以最佳可能(SPTF)顺序服务于这些请求。
磁盘调度程序执行的另一个重要相关任务是I/O 合并(I/O merging)。例如,设想一系列请求读取块 33,然后是 8,然后是 34,如图 37.8 所示。在这种情况下,调度程序应该将块 33 和34 的请求合并(merge)为单个两块请求。调度程序执行的所有请求都基于合并后的请求。合并在操作系统级别尤其重要,因为它减少了发送到磁盘的请求数量,从而降低了开销。
现代调度程序关注的最后一个问题是:在向磁盘发出 I/O 之前,系统应该等待多久?即使有一个磁盘 I/O,也应立即向驱动器发出请求,这种方法被称为工作保全(work-conserving),因为如果有请求要服务,磁盘将永远不会闲下来。然而,对预期磁盘调度的研究表明,有时最好等待一段时间 [ID01] ,即所谓的非工作保全(non-work-conserving)方法。通过等待,新的和“更好”的请求可能会到达磁盘,从而整体效率提高。当然,决定何时等待以及多久可能会非常棘手。

参考

上一篇
《Operating System:Three Easy Pieces》第三十八章 廉价冗余磁盘阵列(RAID)
下一篇
《Operating System:Three Easy Pieces》第三十六章 I/O设备

评论
Loading...