5.3 磁盘和固态硬盘
5.3 磁盘组织与管理
1. 磁盘的结构
1.1 磁盘、磁道、扇区
1.2 如何在磁盘中读/写数据
需要把"磁头"移动到想要读/写的扇区所在的磁道
磁盘会转起来, 让目标扇区从磁头下面划过, 才能完成对扇区的读/写操作
1.3 盘面、柱面
1.4 磁盘的物理地址
- 可用 (柱面号, 盘面号, 扇区号)来定位任意一个"磁盘块"。在“文件的物理结构”小节中, 我们经常提到文件数据存放在外存中的几号块, 这个块号就可以转换成(柱面号, 盘面号, 扇区号)的地址转化
- 可根据该地址读取一个"块"
- 根据"柱面号"移动磁臂, 让磁头指向指定柱面
- 激活指定盘面对应的磁头
- 磁盘旋转的过程中, 指定的扇区会从磁头下面划过, 这样就完成了对指定扇区的读/写
1.5 磁盘的分类
- 根据磁头是否可移动
- 活动头磁盘
- 磁头可以移动的称为活动头磁盘
- 磁臂可以来回伸缩来带动磁头定位磁道
- 固定头磁盘
- 磁头不可移动的称为固定头磁盘
- 这种磁盘中每个磁道都有一个磁头
- 根据盘片是否可更换
- 可换盘磁盘
- 固定盘磁盘
- 活动头磁盘
2. 磁盘调度算法
2.1 一次磁盘读/写操作需要的时间
- 寻道时间(寻找时间)TS
- 在读/写数据前, 将磁头移动到指定磁道所花的时间
- 启动磁头臂是需要时间的, 假设耗时为s
- 移动磁头也是需要时间的, 假设磁头匀速移动, 每跨域一个磁道耗时为m, 总共需要跨域n条磁道
- 寻道时间 TS = s + m * n
- 在读/写数据前, 将磁头移动到指定磁道所花的时间
- 延迟时间TR
- 通过旋转磁盘, 使磁头定位到目标扇区所需要的时间
- 设磁盘转速为r(单位: 转/秒 或 转/分)
- 平均所需的延迟时间 TR = (1/2) * (1/r) = 1/(2r)
- 1/r就是转一圈需要的时间, 找到目标扇区平均需要转半圈, 因此再乘以1/2
- 通过旋转磁盘, 使磁头定位到目标扇区所需要的时间
- 传输时间Tt
- 从磁盘读/写数据所经历的时间
- 磁盘转速为r, 此次读/写的字节数为b, 每个磁道上的字节数为N
- 传输时间 Tt = (1/r)*(b/N) = b/(rN)
- 每个磁道要可存N字节的数据, 因此b字节的数据需要b/N个磁道才能存储, 而读/写一个磁道
- 所需的时间刚好又是转一圈所需要的时间1/r
- 从磁盘读/写数据所经历的时间
- 总的平均读取时间 Ta = Ts + 1/(2r) + b/(rN)
- 延迟时间和传输时间都与磁盘转速相关, 而转速是硬件的固有属性, 因此操作系统也无法优化延迟时间和传输时间
- 但是操作系统的磁盘调度算法会直接影响寻道时间
2.2 磁盘调度算法
- 先来先服务算法(FCFS)
- 根据进程请求访问磁盘的先后顺序进行调度
- 优点: 公平; 如果请求访问的磁道比较集中的话, 算法性能还算过得去
- 缺点: 如果有大量进程竞争使用磁盘, 请求访问的磁道很分散, 则FCFS在性能上很差, 寻道时间长
- 最短寻找时间优先(SSTF)
- SSTF算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,
但是并不能保证总的寻道时间最短
- 其实就是贪心算法的思想, 只是选择眼前最优, 但是总体未必最优
- 优点: 性能较好, 平均寻道时间短
- 缺点: 可能产生"饥饿"现象, 磁头在一个小区域内来回地移动
- SSTF算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短,
但是并不能保证总的寻道时间最短
- 扫描算法(SCAN)
- 为了防止SSTF算法产生饥饿, 可以规定只有磁头移动到最外侧磁道的时候才能往内移动, 移动到最内侧磁道的时候才能往外移动, 由于磁头移动的方式很像电梯, 因此也叫电梯算法
- 优点: 性能较好, 平均寻道时间较短, 不会产生饥饿现象
- 缺点:
- 只有到达最边上的磁道时才能改变磁头移动方向
- SCAN算法对于各个位置磁道的响应频率不平均
- LOOK调度算法
- 如果在磁头移动方向上已经没有别的请求, 就可以立即改变磁头移动方向(边移动边观察, 因此叫LOOK)
- 优点: 比起SCAN算法, 不需要每次都移动到最外侧或最内侧才改变磁头方向, 使寻道时间进一步缩短
- 循环扫描算法(C-SCAN)
- 规定只有磁头朝某个特定方向移动时才处理磁道访问请求, 而返回时直接快速移动至起始端而不处理任何请求
- 优点: 比起SCAN来说, 对于各个位置磁道的响应频率很平均
- 缺点: 只有到达最边上的磁道时才能改变磁头移动方向
- C-LOOK调度算法
- 如果磁头移动的方向上已经没有磁道访问请求了, 就可以立即让磁头返回, 并且磁头只需要返回到有磁道访问请求的位置即可
- 优点: 比起C-SCAN算法, 不需要每次都移动到最外侧或最内侧才改变磁头方向, 使寻道时间进一步缩短
3. 减少磁盘延迟时间的方法
3.1 交替编号
3.2 错位命名
3.3 磁盘地址结构的设计
- 使用 (柱面号, 盘面号, 扇区号)的原因
- 在读取地址连续的磁盘块时, 前者不需要经常移动磁头
4. 磁盘的管理
4.1 磁盘初始化
进行低级格式化(物理格式化), 将磁盘的各个磁道划分为扇区, 一个扇区通常可分为头、数据区域(如512B大小)、尾三个部分组成。管理扇区所需要的各种数据结构一般存放在头、尾两个部分, 包括扇区校验码(如奇偶校验、CRC循环冗余校验码等, 校验码用于校验扇区中的数据是否发生错误)
将磁盘分区(分卷,Volume), 每个分区由若干柱面组成(即分为我们熟悉的 C盘、D盘、E盘)
进行逻辑格式化, 创建文件系统。包括创建文件系统的根目录、初始化存储空间管理所用的数据结构(如位示图、空闲分区表)
4.2 引导块
计算机开机时需要进行一系列初始化的工作, 这些初始化工作是通过执行初始化程序(自举程序)完成的
初始化程序可以放在ROM(只读存储器)中, ROM中的数据在出厂时就写入了, 并且以后不能再修改
- 注: ROM一般是出厂时就集成在主板上的
将完整初始化程序放在ROM中, 当需要更新自举程序时, 将会很不方便, 因为ROM中的数据无法更改
在实际中, ROM中只存放很小的"自举装入程序", 完整的自举程序存放在磁盘的**启动块(引导块/*启动分区)上, 启动块位于磁盘的固定位置, 拥有启动分区的磁盘称为启动磁盘或系统磁盘(C:盘)**
开机时计算机先运行"自举装入程序", 通过执行该程序就可以找到引导块, 并将完整的"自举程序"读入内存, 完成初始化
4.3 坏块的管理
坏了、无法正常使用的扇区就是“坏块”。这属于硬件故障, 操作系统是无法修复的。应该将坏块标记出来, 以免错误地使用到它
对于简单的磁盘, 可以在逻辑格式化时(建立文件系统时)对整个磁盘进行坏块检查, 标明哪些扇区是坏扇区
- 例如: 在FAT表上标明(在这种方式中, 坏块对操作系统不透明)
对于复杂的磁盘, 磁盘控制器(磁盘设备内部的一个硬件部件)会维护一个坏块链表, 在磁盘出厂前进行低级格式化(物理格式化)时就将坏块链进行初始化, 会保留一些"备用扇区", 用于替换坏块, 这种方案称为扇区备用, 且这种处理方式中, 坏块对操作系统透明
5. 固态硬盘SSD
