【组成原理-存储】磁盘及其调度算法
1 磁盘的构造和性能
1.1 磁盘的构造
- 盘片:磁盘由多个盘片组成。
- 盘面:一个盘片有两个盘面。
- 磁道:磁盘的盘面被划分成一个个磁道,一个同心圆环就是一个磁道。
- 扇区:一个磁道又被划分成一个个扇区,每个扇区就是一个“磁盘块”。各个扇区存放的数据量相同。
- 柱面:所有盘面中相对位置(或编号)相同的磁道组成一个柱面。磁道数与柱面数相等。
- 磁头和磁臂:所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。“磁头”移动到想要读/写的扇区所在的磁道。磁盘会转起来,让目标扇区从磁头下面划过,才能完成对扇区的读/写操作。
- 地址结构:可用【柱面号(磁道号),盘面号(磁头号),扇区号】决定任意一个磁盘块的位置。
- 磁盘容量的计算公式:
磁盘容量 = 柱面数 * 每个柱面的磁道数 * 每个磁道的扇区数 * 扇区大小
- 块/簇:在 Unix 系统下,块是操作系统中最小的逻辑存储单位;在 Windows 系统下,簇是操作系统中最小的逻辑存储单位。簇和块的概念是等价的,每个簇(块)可以包括 2、4、8、16、32、64...个扇区。簇(块)是为了操作系统读写方便而设计的,它是一个逻辑概念,是操作系统与磁盘打交道的最小单位,文件所占用的空间必须是簇(块)的整数倍(若文件大小小于一簇,那么也要占一簇的空间)。
【如何理解柱面上的磁道?】如上图,该硬盘是由 3 个盘片组成,那么它就有 6 个可用的盘面和 6 个磁头(每个盘都有上下两面),而每一个盘面上都被逻辑划分为多个磁道,处在 0~5 号盘面上磁道号相同的磁道合起来就被称为一个柱面,在这里的话 0 柱面就是由 6 个盘面上的总共 6 个 0 磁道组成,但是实际使用时却不能分辨 0 磁道在哪个盘面上。为了确切指出具体的逻辑位置,需要指出该磁道在哪个盘面上。由于一个盘面对应一个磁头,因此也可以使用第几号磁头来表示磁道在哪个盘面上。
总结:当提到磁盘的一个柱面上有 6 个磁道时,就是在说该磁盘有 6 个盘面。
参考资料:(1)硬盘磁道和柱面(2)存储基础知识:扇区与块/簇 - 潇湘隐者 - 博客园
相关例题
【例 1】假定有一个磁盘组共有 100 个柱面,每个柱面上有 8 个磁道,每个盘面被划分成 8 个扇区。现有一个含 5000 个逻辑记录的文件,逻辑记录的大小与扇区一致,该文件以顺序结构的形式被存放到磁盘上。柱面、磁道、扇区的编号从 0 开始,逻辑记录的编号从 0 开始。文件信息从 0 柱面、0 磁道、0 扇区开始存放。试问,该文件编号为 3468 的逻辑记录应存放在哪个柱面的第几个磁道的第几个扇区上?
【解】题中给出每个柱面上有 8 个磁道,即:该磁盘有 8 个盘面,每个盘面有 100 个磁道,每个磁道有 8 个扇区。
现在说明数据是如何被存储在磁盘里的。因为磁头是固定在一起的,所以在存放数据时,先存满一个扇区。待 8 个扇区都存满了,意味着已存满某一盘面上的一个磁道,需要往其他盘面上的同编号磁道存放。待 8 个盘面上的所有同编号磁道存满了,也就意味着该柱面已经存满了数据。这也说明,应尽量把文件记录在同一个柱面上,这样磁头就不需要重新寻找其他磁道。
注意,本题的地址编号方式与通常习惯不同,“柱面上的第几个磁道”实际所指第几个盘面。一个柱面大小为 8 * 8 = 64 个扇区,那么有 3468 / 64 = 54...12,说明柱面号为 54(或磁道号为 54),剩余 12 个扇区。因为一个盘面有 8 个扇区,所以 12 / 8 = 1...4,说明磁道号为 1(通常习惯是写成盘面号或磁头号为 1),扇区号为 4。
【例 2】某计算机系统中的磁盘有 300 个柱面,每个柱面有 10 个磁道,每个磁道有 200 个扇区,扇区大小为 512B,则:
(1)磁盘容量为多少?
(2)若文件系统的每簇包含 2 个扇区,则簇号 100530 的磁盘物理地址是多少?
【解】(1)题中给出每个柱面上有 10 个磁道,即:该磁盘有 10 个盘面,每个盘面有 300 个磁道,每个磁道有 200 个扇区,扇区大小为 512B,则
磁盘容量 = 300 * 10 * 200 * 512 / 1024 = 3 * 105 KB
。(2)与例 1 的思路类似,一个柱面大小为 10 * 200 / 2 = 1000 簇,那么有 100530 / 1000 = 100...530,说明柱面号为 100(或磁道号为 100),剩余 530 个簇。因为一个盘面有 200 / 2 = 100 个簇,所以 530 / 100 = 5...30,说明盘面号为 5,簇号为 30,转化成扇区号为 60。
【例 3】某文件系统的簇和磁盘扇区大小分别为 1KB 和 512B。若一个文件的大小为 1026B,则系统分配给该文件的磁盘空间大小是( )
A. 1026B
B. 1536B
C. 1538B
D. 2048B
【解】簇是操作系统与磁盘打交道的最小单位,文件所占用的空间必须是簇(本题为 1024B)的整数倍(若文件大小小于一簇,那么也要占一簇的空间)。因此一个大小为 1026B 的文件占用两个簇,即 2048B,选 D。
1.2 磁盘阵列
RAID:独立冗余磁盘阵列
RAID 分级 | 解释 |
---|---|
RAID0 | 无冗余、无校验的磁盘阵列(连续多个数据块交替存放,并行读写,但没有容错能力) |
RAID1 | 镜像磁盘阵列(两个磁盘同时读写,互为备份) |
RAID2 | 采用海明码的磁盘阵列 |
RAID3 | 位交叉奇偶校验的磁盘阵列 |
RAID4 | 块交叉奇偶校验的磁盘阵列 |
RAID5 | 无独立校验的奇偶校验的磁盘阵列 |
1.3 磁盘的性能参数
1.3.1 磁盘性能参数的概念和计算
性能参数 | 描述 | 公式 | 备注 |
---|---|---|---|
寻道时间(寻找磁道的时间) | 在读/写数据前,将磁头移动到指定磁道所花的时间 | T = p + m*n |
启动磁头臂的时间为 p,磁头每跨越一个磁道耗时为 m,总共需要跨越 n 条磁道 |
延迟时间(寻找扇区的时间) | 磁头定位(寻找)到目标扇区所需要的时间 | T = (1/2)*(1/r) = 1/(2r) |
磁盘转速为 r(单位:转/分),则旋转一圈的时间为 60s/r(单位:秒)。因为在定位过程中,最多旋转 1 圈,最少不用旋转(0 圈),所以在平均情况下,需要旋转半圈,时间需除于 2 |
(读取数据所用的)传输时间 | 从磁盘读出或向磁盘写入数据所经历的时间 | T = (b/N) / r = b/(rN) |
磁盘转速为 r(单位:转/分),此次读/写的字节数为 b,每个磁道上的字节数为 N,因此 b 字节的数据需要 b/N 个磁道才能存储,而读/写一个磁道所需的时间刚好是转一圈所需时间 60s/r(单位:秒) |
(访问一个扇区的)传输时间 | 磁头扫过一个扇区所用的时间 | 传输时间 = (旋转一圈的时间 / 一条磁道的扇区总数) = (一个扇区的容量大小 / 数据传输率) |
对于磁盘的传输速率,K、M、G、T 一般是以 10 为底的单位,而不是以 2 为底!1K = 103,1M = 106,1G = 109,1T = 1012 。比如 20MB/s = 20 * 106 B/s ≠ 20 * 220 B/s |
【注 1】总的平均存取时间 = 寻道时间 + 延迟时间 + 传输时间 = 寻道时间 + 转半圈寻找扇区的时间 + 读取时间。
【注 2】注意转速的单位:我们通常用 r 转/秒 或 r 转/分,但有些题目会告诉你 r 秒/转 或 r 分/转,需要小心。
【注 3】延迟时间和传输时间都与磁盘转速相关,且为线性相关。而转速是硬件的固有属性,因此操作系统也无法优化延迟时间和传输时间。不过在硬件层面上可以优化。
1.3.2 提高磁盘 I/O 速度
(1)减少延迟时间
- 原理:连续读取编号相邻的扇区时,磁头读取完一个扇区后需要一段准备时间才可以读取下一个扇区,但是磁盘又在不停地旋转,不会等待磁头准备完毕才重新旋转,因此我们可以边旋转边准备,等准备好了也正好转到要读的扇区了。
- 方法:
盘面状况 | 方法 | 描述 |
---|---|---|
一个盘面 | 交替编号 | 让编号相邻的扇区在物理上不相邻 |
多个盘面 | 错位命名 | 让相邻盘面的扇区编号错位 |
(2)采用磁盘高速缓存:在内存中为磁盘设置一个缓冲区,在缓冲区中保存了某些盘块的副本,类似于 Cache。
(3)提前读:若采用顺序访问方式对文件进行访问,则可以预知下一次要读写的盘块,此时可以先采取预先读的方式。
(4)延迟写:缓冲区中的数据原本须立即写回磁盘,但考虑到之后可能会有进程再次访问数据,因此不立刻将缓冲区的数据写回磁盘。
(5)优化物理块的分布:若将文件存储在同一个磁道中,则磁头不需要有多余的移动,大大节省了访问时间。
(6)虚拟盘:利用内存去模拟磁盘,称为虚拟盘或 RAM 盘。
(7)使用磁盘冗余阵列(RAID):由于采用了并行交叉存取的方式,可使磁盘的 I/O 速度提高。
1.3.3 相关例题
【例 1】设磁盘转速为 7200 转/分,平均寻道时间为 9ms,每条磁道的平均扇区数为 400,则访问一个扇区的平均存取时间是多少?
- 旋转一圈的时间 = (60s / 7200) * 1000 = 8ms,旋转延迟时间 = 1/2 * 旋转一圈所用时间 = 4ms
- 传输时间 = 8ms / 400 = 0.02ms
- 寻道时间 = 9ms
- 平均存取时间 = 寻道时间 + 旋转延迟时间 + 传输时间 = 9ms + 4ms + 0.02ms = 13.02ms
【例 2】设磁盘的转速为 10000 转/分,平均寻道时间为 6ms,磁盘传输速率为 20MB/s,磁盘控制器延迟为 0.2ms,读取一个 4KB 扇区所需的平均时间是多少?
- 旋转一圈的时间 = (60s / 10000) * 1000 = 6ms,旋转延迟时间 = 1/2 * 旋转一圈所用时间 = 3ms
- 传输时间 = 读取时间 + 延迟时间 = (4KB) / (20MB/s) * 1000 + 0.2 = 0.2ms + 0.2ms = 0.4ms
- 寻道时间 = 6ms
- 平均存取时间 = 寻道时间 + 旋转延迟时间 + 传输时间 = 6ms + 3ms + 0.4ms = 9.4ms
【例 3】已知某磁盘的平均转速是 r 秒/转,平均寻找时间是 T 秒,每个磁道可以存储的字节数是 N,现在向该磁盘写入 b 字节的数据,采用随机寻道的方法,每道的所有扇区组成一个簇,其平均访问时间是?
- 注意“r 秒/转”即为旋转一圈的时间
- 磁道数 = 数据总量/每个磁道存储容量 = b/N
- 读写一个磁道所需时间 = 寻道时间 + 读写磁道时间 = T + r
- 注意一个磁道就作为一个簇,不用涉及定位扇区的时间(延迟时间)
- 访问一个簇平均访问时间 = 读写一个磁道所需时间 * 磁道数 = (T+r) * (b/N)
【例 4】(盘面未采用交替编号)假设磁盘的每个磁道划分为 9 个块,现在一个文件有 A, B,…, I 共 9 条记录,每条记录的大小与块的大小相等,设磁盘转速为 27ms/转,每读出一块后需要 2ms 的处理时间。若忽略其他辅助时间,且一开始磁头在即将要读 A 记录的位置,试问:若顺序存放这些记录顺序读取,处理该文件要多少时间?
【解】磁盘转速为 27ms/转,则读取每个扇区所需时间为 3ms。
读取第一个记录 A,需要花费 3ms,然后还需要 2ms 的处理时间。但记录 A 处理完成后,磁头位于记录 B 扇区的 2/3 位置,并不在记录 B 的开头。为了完整读取记录 B,必须再转接近一圈重新抵达记录 B 的开头,需要花费的时间为 27ms - 2ms = 25ms。
等到记录 B 读取并处理完成后,又是上面类似的过程,于是总结如下:
过程 | 时间 |
---|---|
读取并处理 A | 5ms |
转到 B | 25ms |
读取并处理 B | 5ms |
转到 C | 25ms |
读取并处理 C | 5ms |
转到 D | 25ms |
读取并处理 D | 5ms |
转到 E | 25ms |
读取并处理 E | 5ms |
转到 F | 25ms |
读取并处理 F | 5ms |
转到 G | 25ms |
读取并处理 G | 5ms |
转到 H | 25ms |
读取并处理 H | 5ms |
转到 I | 25ms |
读取并处理 I | 5ms |
所以一共花费的时间为 8 * 25ms + 9 * 5ms = 245ms。
【例 5】(盘面采用交替编号)一个交叉存放信息的磁盘,信息存放方式如下图所示。每个磁道有 8 个扇区,每个扇区 512B,旋转速度为 3000 转/分。假定磁头已在读取信息的磁道上,0 扇区转到磁头下需要 1/2 转,且设备对应的控制器不能同时进行输入/输出,在数据从控制器传送全内存的这段时间内,从磁头下通过的扇区数为 2。请回答:
(1)依次读取一个磁道上的所有扇区需要多少时间?
(2)该磁盘的数据传输率是多少?
【解】(1)旋转速度为 3000 转/分,即 20ms/转,每个扇区的读取时间为 20/8 = 2.5ms。
过程如下表所示:
过程 | 时间 |
---|---|
0 扇区转到磁头下 | 10ms |
读取 0 扇区 | 2.5ms |
转到 1 扇区(此时正在传输 0 扇区数据) | 5.0ms |
读取 1 扇区 | 2.5ms |
转到 2 扇区(此时正在传输 1 扇区数据) | 5.0ms |
读取 2 扇区 | 2.5ms |
转到 3 扇区(此时正在传输 2 扇区数据) | 5.0ms |
读取 3 扇区 | 2.5ms |
转到 4 扇区(此时正在传输 3 扇区数据) | 5.0ms |
读取 4 扇区 | 2.5ms |
转到 5 扇区(此时正在传输 4 扇区数据) | 5.0ms |
读取 5 扇区 | 2.5ms |
转到 6 扇区(此时正在传输 5 扇区数据) | 5.0ms |
读取 6 扇区 | 2.5ms |
转到 7 扇区(此时正在传输 6 扇区数据) | 5.0ms |
读取 7 扇区 | 2.5ms |
传输 7 扇区数据 | 5.0ms |
依次读取一个磁道上的所有扇区的时间:10ms + (2.5ms + 5.0ms) * 8 = 70ms。
(2)每个磁道有 8 个扇区,每个扇区 512B,则一个磁道数据大小为 8 * 512B = 4KB。
故数据传输率为 4KB / 70ms = 58.5kB/s。
2 磁盘的调度算法
算法 | 缺点 |
---|---|
先来先服务算法(FCFS) | ~ |
最短寻找时间优先算法(SSTF) | 可能导致饥饿 |
扫描算法(SCAN,电梯算法) | 对于各个位置磁道的响应频率不平均 |
循环扫描算法(C-SCAN) | ~ |
假设在一个磁盘上,有 1000 个柱面,编号从 0~999,用下面的算法计算为了满足磁盘队列中的所有请求,磁盘臂必须移动过的磁道数目。假设最后服务的请求时在磁道 345 上,并且读写头正在朝磁道 0 移动。在按 FIFO 顺序排列的队列中包含了如下磁道上的请求:123,874,692,475,105,376。
2.1 先来先服务算法(FCFS)
- 算法思路:根据进程请求访问磁盘的先后顺序进行调度。
- 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上)
磁头 | 磁道访问的顺序 |
---|---|
磁头移动 | 345,123,874,692,475,105,376 |
- 磁头总共移动的磁道数 = (345-123)+(874-123)+(874-692)+(692-475)+(475-105)+(376-105) = 2013
2.2 最短寻找时间优先算法(SSTF)
- 算法思路:优先处理与当前磁头最近的磁道(贪心思想)。
- 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上)
磁头 | 磁头位置 |
---|---|
初始 | 345 |
磁头最近的磁道 | 376 |
磁头最近的磁道 | 475 |
磁头最近的磁道 | 692 |
磁头最近的磁道 | 874 |
磁头最近的磁道 | 123 |
磁头最近的磁道 | 105 |
- 磁头总共移动的磁道数 = (874-345)+(874-105) = 1298
2.3 扫描算法(SCAN,电梯算法)
- 算法思路:只有磁头移动到最外侧磁道的时候才能往内移动,移动到最内侧磁道的时候才能往外移
动。 - 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上,并且读写头正在朝磁道 0 移动)
磁头 | 磁道访问的顺序 |
---|---|
磁头朝磁道 0 移动 | 345,123,105,0 |
磁头朝磁道 999 移动 | 0,376,475,692,874 |
- 磁头总共移动的磁道数 = (345-0)+(874-0) = 1219
2.4 LOOK 调度算法
- 算法思路:基于扫描算法,在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。
- 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上,并且读写头正在朝磁道 0 移动)
磁头 | 磁道访问的顺序 |
---|---|
磁头朝磁道 0 移动 | 345,123,105 |
没有更小的磁道号,磁头朝磁道 999 移动 | 105,376,475,692,874 |
- 磁头总共移动的磁道数 = (345-105)+(874-105) = 1009
2.5 循环扫描算法(C-SCAN)
- 算法思路:只有磁头朝某个特定方向移动时才处理磁道访问请求,而返回时直接快速移动至起始端而不处理任何请求。
- 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上,并且读写头正在朝磁道 0 移动)
磁头 | 磁道访问的顺序 |
---|---|
磁头朝磁道 0 移动 | 345,123,105,0 |
磁头回滚至 999,朝磁道 0 移动 | 0,999,874,692,475,376 |
- 磁头总共移动的磁道数 = (345-0)+(999-0)+(999-376) = 1967
2.6 C-LOOK 调度算法
- 算法思路:基于循环扫描算法,在磁头移动方向上已经没有别的请求,就可以立即改变磁头移动方向。
- 序列:123,874,692,475,105,376
- 算法运行:(假设最后服务的请求时在磁道 345 上,并且读写头正在朝磁道 0 移动)
磁头 | 磁道访问的顺序 |
---|---|
磁头朝磁道 0 移动 | 345,123,105 |
没有更小的磁道号,磁头朝磁道 0 移动 | 105,874,692,475,376 |
- 磁头总共移动的磁道数 = (345-105)+(874-105)+(874-376) = 1507
3 磁盘的管理
3.1 磁盘的初始化
- 低级格式化(物理格式化):将磁盘的各个磁道划分为扇区。管理扇区所需要的各种数据结构一般存放在头、尾两个部分,包括扇区校验码(如奇偶校验、CRC 循环冗余校验码等,校验码用于校验扇区中的数据是否发生错误)。
- 磁盘分区:每个分区由一个或多个柱面组成(即分为我们熟悉的 C盘、D盘、E盘)。
- 逻辑格式化:创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构。
3.2 引导块和操作系统引导过程
3.2.1 引导块(初始块)
- 计算机开机时需要进行一系列初始化的工作,这些初始化工作是通过执行初始化程序(即 boot 程序,或自举程序)完成的。
- ROM 中只存放很小的“自举装入程序”。
- 完整的自举程序放在磁盘的启动块(即引导块/启动分区)上,启动块位于磁盘的固定位置。
- 拥有启动分区的磁盘称为启动磁盘或系统磁盘。
- 引导硬盘和非引导硬盘:即装了操作系统的硬盘和没有装操作系统的硬盘。
3.2.2 操作系统引导过程
- 激活 CPU:CPU 读取 ROM 中的 boot 程序,开始执行 BIOS 的指令。
- 硬件自检:启动 boot 程序后,检查硬件是否有故障。
- 加载带有操作系统的硬盘:硬件自检后,BIOS 读取 boot sequence,把控制权交给启动顺序排在第一位的存储设备。若发现该存储设备是非引导硬盘,则去检查下一个存储设备,如果找不到引导硬盘,则宕机。
- 加载主引导记录 MBR:CPU 通过 MBR 去硬盘哪个主分区去找操作系统,执行磁盘引导程序,扫描分区表。
- 加载活动分区(又称主分区,即安装了操作系统的分区):MBR 中记录哪些分区是活动分区,通过 MBR 开始加载活动分区的第一个扇区。
- 加载分区引导记录 PBR:活动分区的第一个扇区又称为 PBR,从根目录下找到完整的操作系统初始化程序(即启动管理器)并执行,完成“开机”的一系列动作。
3.3 坏块
- 坏了、无法正常使用的扇区就是“坏块”。这属于硬件故障,操作系统是无法修复的。
- 对于简单结构的磁盘:逻辑格式化时将坏块标记出来。(坏块对操作系统不透明)
- 对于复杂结构的磁盘:磁盘控制器维护一个坏块链,并管理备用扇区。(坏块对操作系统透明)
4 固态硬盘
项目 | 描述 |
---|---|
原理 | EEPROM(电可擦除 ROM) |
组成 | 多个闪存芯片,每个芯片有多个块,每个块有多个页 |
读写特性 | 以“页”为单位读写,支持随机访问(读快、写慢) |
擦除特性 | 以“块”为单位擦除,一个块如果被擦除次数过多会损坏 |
磨损均衡技术 | 动态磨损均衡(优先写入擦除次数较少的块)、静态磨损均衡(自动检测并迁移分配数据,使其寿命更长) |
优点 | 噪音小,读写速度快,抗震 |
缺点 | 造价高 |