操作系统中的磁盘调度算法详解
字数 2440 2025-12-12 13:47:49

操作系统中的磁盘调度算法详解


1. 知识点描述

在计算机系统中,磁盘(特别是机械硬盘)的访问速度远低于CPU和内存,其读写操作依赖于磁头的机械移动(寻道)和盘片的旋转(旋转延迟)。磁盘调度算法是操作系统I/O调度的一部分,其核心目标是优化多个磁盘I/O请求的顺序,以减少平均寻道时间、旋转延迟,从而提高磁盘的整体吞吐量并降低I/O请求的平均响应时间。


2. 前提知识:磁盘访问时间

一个磁盘I/O请求通常需要以下三个时间:

  • 寻道时间:磁头从当前磁道移动到目标磁道的时间(最耗时,调度算法主要优化此部分)。
  • 旋转延迟:盘片旋转,将目标扇区转到磁头下方的时间(通常为磁盘旋转半周的时间)。
  • 数据传输时间:实际读写数据的时间。

寻道时间是机械运动,远大于电信号传输时间,因此调度算法的核心是重新排列请求顺序,最小化磁头移动距离


3. 常见的磁盘调度算法(从简单到复杂)

3.1 先来先服务调度

  • 描述:按I/O请求到达的顺序依次处理。
  • 优点:公平、实现简单。
  • 缺点寻道性能通常很差,磁头可能在整个磁盘上来回移动,平均寻道时间较长。
  • 示例:假设当前磁头在50号磁道,请求顺序为:100, 180, 40, 120, 20。
    磁头移动顺序:50 → 100 → 180 → 40 → 120 → 20
    总寻道距离 = |50-100| + |100-180| + |180-40| + |40-120| + |120-20| = 50+80+140+80+100 = 450。

3.2 最短寻道时间优先调度

  • 描述:每次选择距离当前磁头位置最近的磁道请求处理。
  • 优点:平均寻道时间较短,吞吐量较高。
  • 缺点可能导致饥饿。如果不断有新的请求到达靠近当前磁头的位置,远处磁道的请求可能被无限期推迟。
  • 示例:当前磁头在50,请求队列:100, 180, 40, 120, 20。
    计算过程:
    1. 距离最近的请求是40(距离10),处理40。
    2. 此时在40,最近的是20(距离20),处理20。
    3. 此时在20,最近的是100(距离80),但注意:请求队列中还有100, 180, 120。距离最近的是100,处理100。
    4. 此时在100,最近的是120(距离20),处理120。
    5. 此时在120,最后处理180(距离60)。
      移动顺序:50 → 40 → 20 → 100 → 120 → 180
      总寻道距离 = 10 + 20 + 80 + 20 + 60 = 190。

3.3 扫描算法(电梯算法)

  • 描述:磁头从磁盘一端向另一端移动,沿途服务请求;到达另一端后,反向移动继续服务。类似于电梯运行。
  • 优点:避免了SSTF的饥饿问题,性能较好。
  • 缺点对最近访问过的区域不公平。例如,磁头刚离开的磁道如果有新请求,必须等到磁头折返。
  • 示例:假设磁头初始在50,向磁道号增加方向移动。请求队列:100, 180, 40, 120, 20。
    移动顺序:
    1. 从50向增大方向移动,依次服务100、120、180。
    2. 到达最大磁道(假设为199)后,反向移动,依次服务40、20。
      顺序:50 → 100 → 120 → 180 → 40 → 20
      总寻道距离 = 50 + 20 + 60 + 140 + 20 = 290。

3.4 循环扫描算法

  • 描述:SCAN的变种。磁头只沿一个方向移动(例如从内到外),到达另一端后立即返回起始端(不服务请求),然后重新开始扫描。就像一个单向旋转的电梯,只在上行时停靠,下行时直达底层。
  • 优点消除了SCAN对两端请求的响应时间差异,使等待时间分布更均匀。
  • 缺点:有些请求的等待时间可能更长,因为磁头必须返回到起始端。
  • 示例:初始在50,向增大方向移动。请求同上。
    移动顺序:
    1. 从50向增大方向,服务100、120、180。
    2. 到达最大磁道后,立即返回到最小磁道(0),但不服务任何请求。
    3. 从0开始再次向增大方向移动,依次服务20、40。
      顺序:50 → 100 → 120 → 180 → 0 → 20 → 40
      总寻道距离 = 50+20+60+180+20+20 = 350。

3.5 查找算法

  • 描述:SCAN算法的改进。磁头移动时,只需要到达该方向上的最后一个请求即可折返,而不是到达磁盘物理端点。这样可以减少不必要的移动。
  • 优点:比SCAN减少了不必要的寻道。
  • 示例:初始在50,向增大方向移动。请求同上,假设最大磁道为200。
    在增大方向上,最后一个请求是180,所以磁头到达180后即可折返。
    顺序:50 → 100 → 120 → 180 → 40 → 20
    总寻道距离同SCAN(本例中相同),但若180之后无请求,则节省了180→200的移动。

4. 算法比较与选择

  • FCFS:简单公平,但性能差,适用于请求很少的场景。
  • SSTF:性能较好,但可能导致饥饿,不适用于实时系统或负载较重的系统。
  • SCAN/C-SCAN:平衡了性能和公平性,是实际操作系统(如早期UNIX、Windows NT)常用的算法。C-SCAN提供了更均匀的等待时间。
  • 现代系统考虑
    • 固态硬盘没有机械寻道,因此调度算法主要优化请求合并和队列排序,而非寻道。
    • 机械硬盘在操作系统中通常由I/O调度器实现更复杂的调度(如Linux的CFQ、Deadline、NOOP等),这些调度器在磁盘调度算法基础上,还考虑了进程I/O优先级、请求过期时间、合并相邻请求等。

5. 核心思想总结

  1. 核心矛盾:机械硬盘的机械延迟是性能瓶颈,调度算法旨在重排请求顺序减少磁头移动
  2. 权衡:在公平性(避免饥饿)和效率(最小寻道时间)之间取得平衡。
  3. 发展趋势:随着SSD普及,传统磁盘调度的重要性下降,但相关思想(如队列排序、合并、优先级)仍影响现代I/O调度器设计。
操作系统中的磁盘调度算法详解 1. 知识点描述 在计算机系统中,磁盘(特别是机械硬盘)的访问速度远低于CPU和内存,其读写操作依赖于磁头的机械移动(寻道)和盘片的旋转(旋转延迟)。 磁盘调度算法 是操作系统I/O调度的一部分,其核心目标是 优化多个磁盘I/O请求的顺序 ,以减少平均寻道时间、旋转延迟,从而提高磁盘的整体吞吐量并降低I/O请求的平均响应时间。 2. 前提知识:磁盘访问时间 一个磁盘I/O请求通常需要以下三个时间: 寻道时间 :磁头从当前磁道移动到目标磁道的时间( 最耗时,调度算法主要优化此部分 )。 旋转延迟 :盘片旋转,将目标扇区转到磁头下方的时间(通常为磁盘旋转半周的时间)。 数据传输时间 :实际读写数据的时间。 寻道时间是机械运动,远大于电信号传输时间 ,因此调度算法的核心是 重新排列请求顺序,最小化磁头移动距离 。 3. 常见的磁盘调度算法(从简单到复杂) 3.1 先来先服务调度 描述 :按I/O请求到达的顺序依次处理。 优点 :公平、实现简单。 缺点 : 寻道性能通常很差 ,磁头可能在整个磁盘上来回移动,平均寻道时间较长。 示例 :假设当前磁头在50号磁道,请求顺序为:100, 180, 40, 120, 20。 磁头移动顺序:50 → 100 → 180 → 40 → 120 → 20 总寻道距离 = |50-100| + |100-180| + |180-40| + |40-120| + |120-20| = 50+80+140+80+100 = 450。 3.2 最短寻道时间优先调度 描述 :每次选择 距离当前磁头位置最近 的磁道请求处理。 优点 :平均寻道时间较短,吞吐量较高。 缺点 : 可能导致饥饿 。如果不断有新的请求到达靠近当前磁头的位置,远处磁道的请求可能被无限期推迟。 示例 :当前磁头在50,请求队列:100, 180, 40, 120, 20。 计算过程: 距离最近的请求是40(距离10),处理40。 此时在40,最近的是20(距离20),处理20。 此时在20,最近的是100(距离80),但注意:请求队列中还有100, 180, 120。距离最近的是100,处理100。 此时在100,最近的是120(距离20),处理120。 此时在120,最后处理180(距离60)。 移动顺序:50 → 40 → 20 → 100 → 120 → 180 总寻道距离 = 10 + 20 + 80 + 20 + 60 = 190。 3.3 扫描算法(电梯算法) 描述 :磁头从磁盘一端向另一端移动,沿途服务请求;到达另一端后,反向移动继续服务。类似于电梯运行。 优点 :避免了SSTF的饥饿问题,性能较好。 缺点 : 对最近访问过的区域不公平 。例如,磁头刚离开的磁道如果有新请求,必须等到磁头折返。 示例 :假设磁头初始在50,向磁道号增加方向移动。请求队列:100, 180, 40, 120, 20。 移动顺序: 从50向增大方向移动,依次服务100、120、180。 到达最大磁道(假设为199)后,反向移动,依次服务40、20。 顺序:50 → 100 → 120 → 180 → 40 → 20 总寻道距离 = 50 + 20 + 60 + 140 + 20 = 290。 3.4 循环扫描算法 描述 :SCAN的变种。磁头 只沿一个方向移动 (例如从内到外),到达另一端后 立即返回起始端 (不服务请求),然后重新开始扫描。就像一个 单向旋转的电梯 ,只在上行时停靠,下行时直达底层。 优点 : 消除了SCAN对两端请求的响应时间差异 ,使等待时间分布更均匀。 缺点 :有些请求的等待时间可能更长,因为磁头必须返回到起始端。 示例 :初始在50,向增大方向移动。请求同上。 移动顺序: 从50向增大方向,服务100、120、180。 到达最大磁道后,立即返回到最小磁道(0),但不服务任何请求。 从0开始再次向增大方向移动,依次服务20、40。 顺序:50 → 100 → 120 → 180 → 0 → 20 → 40 总寻道距离 = 50+20+60+180+20+20 = 350。 3.5 查找算法 描述 :SCAN算法的改进。磁头移动时, 只需要到达该方向上的最后一个请求即可折返 ,而不是到达磁盘物理端点。这样可以减少不必要的移动。 优点 :比SCAN减少了不必要的寻道。 示例 :初始在50,向增大方向移动。请求同上,假设最大磁道为200。 在增大方向上,最后一个请求是180,所以磁头到达180后即可折返。 顺序:50 → 100 → 120 → 180 → 40 → 20 总寻道距离同SCAN(本例中相同),但若180之后无请求,则节省了180→200的移动。 4. 算法比较与选择 FCFS :简单公平,但性能差,适用于请求很少的场景。 SSTF :性能较好,但可能导致饥饿,不适用于实时系统或负载较重的系统。 SCAN/C-SCAN :平衡了性能和公平性,是 实际操作系统(如早期UNIX、Windows NT)常用 的算法。C-SCAN提供了更均匀的等待时间。 现代系统考虑 : 固态硬盘 没有机械寻道,因此调度算法主要优化 请求合并和队列排序 ,而非寻道。 机械硬盘 在操作系统中通常由 I/O调度器 实现更复杂的调度(如Linux的CFQ、Deadline、NOOP等),这些调度器在磁盘调度算法基础上,还考虑了 进程I/O优先级、请求过期时间、合并相邻请求 等。 5. 核心思想总结 核心矛盾 :机械硬盘的 机械延迟 是性能瓶颈,调度算法旨在 重排请求顺序减少磁头移动 。 权衡 :在 公平性 (避免饥饿)和 效率 (最小寻道时间)之间取得平衡。 发展趋势 :随着SSD普及,传统磁盘调度的重要性下降,但相关思想(如队列排序、合并、优先级)仍影响现代I/O调度器设计。