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算法会优先处理的磁道是与当前磁头最近的磁道。可以保证每次的寻道时间最短, 但是并不能保证总的寻道时间最短
      • 其实就是贪心算法的思想, 只是选择眼前最优, 但是总体未必最优
    • 优点: 性能较好, 平均寻道时间短
    • 缺点: 可能产生"饥饿"现象, 磁头在一个小区域内来回地移动
  • 扫描算法(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

SSD 结构


5.3 磁盘和固态硬盘
http://binbo-zappy.github.io/2024/11/21/操作系统/5-3-磁盘和固态硬盘/
作者
Binbo
发布于
2024年11月21日
许可协议