13180 操作系统 第四章 进程/线程调度

700 阅读19分钟

开始13180 操作系统的学习过程,献给每一位拥有梦想的"带专人",

ps:有不正确的地方麻烦更新在评论区,我会一一修复 😅

第四章 进程/线程调度

1. 进程调度的基本概念

进程调度即处理器的调度

进程调度的任务是控制协调进程对 CPU 的竞争,按照调度算法,使某个就绪进程获得 CPU 的控制权,转换为运行状态。进程调度也叫低级调度

实际上,进程调度完成的是将一个物理的 CPU 转变成多个虚拟的 CPU 的工作

进程调度程序是操作系统真正的核心,直接负责 CPU 的分配

进程调度的主要功能

  1. 保存现场

    当前进程放弃 CPU 时,保存程序计数器、寄存器等信息到 PCB,以便后续恢复。

  2. 挑选进程

    调度算法 从就绪队列选出一个进程,将其状态改为运行,并分配 CPU。

  3. 恢复现场

    为新选中的进程 恢复现场信息,让其从上次中断的地方继续执行。

进程调度的时机

  1. 创建进程

    决定继续运行 父进程 或切换到 子进程

  2. 任务完成

    当前进程完成任务后,主动释放 CPU。

  3. 等待资源

    因资源或事件未满足,当前进程进入阻塞状态,放弃 CPU。

  4. 中断发生

    设备完成任务发出 I/O 中断,调度程序决定是继续运行当前进程还是切换到新就绪的进程。

  5. 运行到时

    在分时系统中,当前进程用完时间片,触发时钟中断,CPU 被分配给其他就绪进程。

两级调度模型

进程调度和作业调度是 CPU 主要的两级调度,区别:执行频率不同

  1. 进程调度

    负责从内存中的就绪队列中挑选进程,将其分配给 CPU 运行。

    属于微观调度,根据一定的算法,把处理器动态、实际地分配给所选择进程

    决定哪些进程获得 CPU;关注的是CPU 的使用效率

    类似于站台调度,决定哪些乘客(进程)可以登上列车(CPU)。

  2. 作业调度

    负责从外存上的作业队列中挑选作业,将其调入内存,创建对应的进程,加入就绪队列。

    属于宏观调度,具有获得处理器的资格,但尚未占有处理器,不能立即运行

    执行的次数少,甚至没有

    决定哪些作业进入内存;关注的是整个系统的资源分配

    类似于车站检票,决定哪些乘客(作业)可以进入候车厅。

三级调度模型

  1. 进程调度

    负责从内存中的就绪队列中挑选进程,将其分配给 CPU 运行。

  2. 作业调度

    负责从外存上的作业队列中挑选作业,将其调入内存,创建对应的进程,加入就绪队列。

  3. 中级调度

    将内存中驻留时间较长的进程切换到磁盘上,从就绪队列转换到就绪/挂起队列,或从阻塞队列转换到阻塞/挂起队列。

    当内存中有足够的空间时,中级调度就从就绪/挂起队列中选择一些合适的进程放入内存,使它们进入就绪队列

2. 进程调度算法的设计思路

调度策略的选择

  1. 设计目标

    核心:不同系统侧重点不同。

    批处理系统:提高资源利用率和平均吞吐量。

    分时系统:缩短响应时间,确保均衡响应。

    实时系统:确保事件及时可靠处理。

  2. 公平性

    公平分配 CPU,不偏袒某一进程或作业。

  3. 均衡性

    平衡系统资源使用,最大化利用资源。

  4. 统筹兼顾

    兼顾响应时间和资源利用率,尤其分时系统需快速响应用户输入。

  5. 优先级

    ​ 按优先级调度,避免进程无限期等待。

    ​ 提升等待时间长的低优先级进程的优先级。

  6. 开销

    控制系统开销,选用简单高效的算法,减少复杂性带来的负担。

性能评价标准

  1. CPU 利用率

    CPU 的价格昂贵,希望尽可能充分利用

  2. 吞吐量

    单位时间内 CPU 的完成数量

  3. 周转时间

    从作业提交到作业完成的时刻

    作业 i 的周转时间为Ti=t(ci)t(si)T_i = t_(ci) - t_(si) 完成时间-提交时间

    带权周转时间W=T/RW = T/R 周转时间 / 实际运行时间

  4. 就绪等待时间

    通过缩短就绪等待时间,可以提高系统的吞吐量和并发性能,增加 CPU 的利用率

  5. 响应时间

    提交第一个请求到产生第一个响应所用的时间

3. 经典进程调度算法

先来先服务算法(FCFS)

  1. 核心思想

    类似排队买票,按到达时间先后依次分配 CPU。

    进程执行时,一直占用 CPU,直至完成或阻塞才释放。

  2. 优点

    简单易实现:实现逻辑清晰,操作简单。

    对长作业有利:无需频繁切换,长时间运行的进程能快速完成。

  3. 缺点

短作业不友好:短作业可能因长作业等待过久,导致 带权周转时间变长

I/O 繁忙型作业不利:频繁请求 I/O 后可能需排队等待,增加 周转时间带权周转时间

效率低:不考虑作业特性,难以提高系统资源的整体利用率。

image.png

时间片轮转调度(RR)

核心思想

  1. 把所有就绪进程排成先入先出(FIFO)队列
  2. 每次调度选择队首进程运行一个时间片(10~100 毫秒)。
  3. 若时间片用完未完成任务,则将进程放到队尾,轮到下一个队首进程运行。

特点

适用场景:主要用于分时操作系统,确保多个进程公平共享 CPU 时间。

公平性:所有进程都能获得执行机会。

时间片的影响

过长:退化为先来先服务(FCFS),短进程需等待较长时间。

过短:频繁切换进程,系统开销增加,效率降低。

时间片长度的影响因素

  1. 系统的响应时间

    时间片与系统响应时间成正比。

  2. 就绪队列进程的数目

    时间片与就绪队列长度成反比。

  3. 进程的转换时间

    若执行进程调度时的转换时间为 t,时间片为 q,比值 t/q 不大于某一数值, 如 1/10

  4. CPU 运行指令速度

    性能越高,时间片可越短。

image.png

4. 优先级调度

核心思想

​ 从就绪队列中选择优先级最高的进程,把 CPU 分配给它。

优先级调度方式

  1. 非抢占式优先级

    特点:当前进程不会被打断,即使出现更高优先级的进程。

    条件:当前进程运行完成主动让出 CPU时,系统才调度高优先级进程。

  2. 抢占式优先级

    特点实时打断当前运行的进程,优先调度更高优先级的进程。

    触发条件:有高优先级进程进入就绪队列时,强制分配 CPU。

确定优先级的方式

  1. 静态优先级

    特点:在进程创建时确定,不会随时间改变。

    优点:实现简单,系统开销小。

    缺点:容易出现饥饿问题,低优先级进程可能长时间无法获得 CPU。

  2. 动态优先级

    特点:优先级会随着时间动态调整,解决饥饿问题

    策略:随等待时间增长,逐步提升进程优先级(“论年头”)。

    优点:提高系统公平性,减少长时间等待。

    缺点:系统开销较高,需要额外记录和计算。

image.png

5. 最短作业优先法

核心思想

​ 从作业的后背队列中挑选那些需要运行时间最短的作业放入内存

非抢占的策略

优点

​ 有效降低作业的平均等待时间和提高系统的吞吐量

缺点

​ 对长作业很不利,并且不能保证紧迫性作业会被及时处理

主要用于作业调度

image.png

6. 最短剩余时间优先算法

核心思想

​ 采用抢占式策略。当新进程加入就绪队列时,如果它需要的运行时间比当前进程所需的剩余时间还短,则运行进程被强行剥夺 CPU 的控制权,把那个新进程调度去运行。

优点

​ 可以保证新的短作业一旦进入系统就会很快得到服务

缺点

​ 实现这种算法要增加系统开销

进程 A 正在运行,需要运行 10s,已经运行了 5s,这时进程 B 来了

  1. B 需要运行 6s,先执行 A 还是 B

    进程 A 剩余运行时间 10 - 5 = 5s,进程 B 需要运行 6s,5 < 6 先执行进程 A

  2. B 需要运行 4s,先执行 A 还是 B

    进程 A 剩余运行时间 10 - 5 = 5s,进程 B 剩余运行时间 4s,5 < 4,所以先执行 B

7. 多级队列调度

通过将进程分配到不同优先级的队列中进行调度

8. 多级队列反馈算法

是在多级队列的基础上增加了根据进程运行情况动态调整其在队列间移动的策略

4. 多处理器调度算法

多处理器系统分类:

  1. 松耦合、分布式多处理器、集群

    由一系列相对自治的系统组成,每个处理器有自己的主存和 I/O 通道

  2. 专门功能的处理器

    主处理器控制专用处理器(如 I/O 处理器),完成特定任务。

  3. 紧耦合多处理器

    处理器共享主存,由操作系统统一管理。

粒度

考虑系统中进程之间的同步粒度,或者称为同步频率

  1. 无约束并行性

    进程之间无同步,各自独立运行。典型场景:分时操作系统,每个用户执行独立任务。

  2. 粗粒度和非常粗粒度的并行性

    进程间有少量同步,支持多处理器运行,需较少软件改动。

  3. 中粒度并行性

    程序员明确利用程序的并行特性。

  4. 细粒度的并行性

    高复杂度场景,比线程级并行更细致。

进程调度

将进程分配到不同的处理器上运行

线程调度

线程切换时的开销远远小于进程切换时的开销,在多处理器这个环境中,线程可以用于开发应用程序中真正的并行性

多处理器线程调度和处理器分配的各种方案中,有以下四种比较突出的方法

  1. 负载分配

    使用全局就绪队列,处理器空闲时直接从队列中取线程运行。

  2. 组调度

    按线程组分配,一组线程同时调度到对应的处理器组上运行。

  3. 专用处理器分配

    为每个线程分配专用处理器,线程与处理器一一对应,程序结束后处理器归还池中

  4. 动态调度

    执行过程中线程数量可动态调整,适应任务需求变化。

5. 实时调度算法

概述

  1. 静态表驱动调度算法

    特点:运行前固定时间表,不随任务状态变化调整。

    适用场景:任务周期和截止时间固定,模式简单的系统。

  2. 静态优先级驱动抢占调度算法

    特点:任务分固定优先级,高优先级可抢占低优先级。

    适用场景:需要快速响应高优先级任务的系统。

  3. 基于动态规划调度算法

    特点:基于当前状态和未来分析优化任务顺序,追求整体最优。

    适用场景:任务关系复杂,需精细规划资源分配的系统。

  4. 动态尽力调度算法

    特点:运行时尽量满足任务执行需求,无精细规划。

    适用场景:实时性较强,但不需过多精细优化的系统。

限期调度(重点关注任务的完成期限)

每个任务都有一个必须完成的截止时间,调度器会根据这些截止时间来安排任务的执行顺序

速率单调调度

任务的优先级是根据任务周期来分配的。任务周期越短,优先级越高

优先级反转

高优先级任务被低优先级任务阻塞的现象

低优先级任务占用了资源,但高优先级任务需要使用被低优先级任务占据的资源

练习

  1. 轮转算法最早来自 3

    1. 实时系统
    2. 批处理系统
    3. 分时系统
    4. 定时系统
  2. 有 5 个进程 P1、P2、P3、P4和 P5,它们在 0 时刻同时依次进入就绪队列,其执行时间和优先数(优先数小的进程优先级高)

    执行时间 优先数 SJF
    开始时间 完成时间 周转时间
    P1 5 3 4 9 9
    P2 8 2 14 22 22
    P3 4 1 0 4 4
    P4 10 4 22 32 32
    P5 5 5 9 14 14
    1. 请给出表中最短作业优先调度算法(SJF)下各进程的开始时间、完成时间和周转时间(对于 SJF,当进程执行时间相同时,按先来先服务方式进行调度)

    2. 计算平均周转时间

      (9+22+4+32+12) / 5 = 16.2

  3. 有 5 个进程 P1、P2、P3、P4和 P5,它们在 0 时刻同时依次进入就绪队列,执行时间如下

    执行时间 FCFS SJF
    开始时间 完成时间 周转时间 开始时间 完成时间 周转时间
    P1 30 0 30 30 40 70 70
    P2 20 30 50 50 20 40 40
    P3 10 50 60 60 0 10 10
    P4 40 60 100 100 70 110 110
    P5 10 100 110 110 10 20 20
    1. 请在表中给出先来先服务算法(FCFS)和最短进程优先算法(SJF)下各进程的开始时间(即开始运行时间)、完成时间和周转时间

    2. 请在上述两种算法下的平均周转时间

      FCFS:(30 + 50 + 60 + 100 + 110) / 5 = 70

      SJF:(70 + 40 + 10 + 110 + 20) / 5 = 50

  4. 有 5 个进程 P1、P2、P3、P4和 P5,它们在 0 时刻同时依次进入就绪队列,执行时间如下

    执行时间 FCFS SJF
    开始时间 完成时间 周转时间 开始时间 完成时间 周转时间
    P1 8 0 8 8 15 23 23
    P2 3 8 11 11 1 4 4
    P3 1 11 12 12 0 1 1
    P4 5 12 17 17 4 9 9
    P5 6 17 23 23 9 15 15
    1. 请在表中给出先来先服务算法(FCFS)和最短进程优先算法(SJF)下各进程的开始时间(即开始运行时间)、完成时间和周转时间

    2. 请在上述两种算法下的平均周转时间(计算结果保留一位小数)

      FCFS:(8 + 11 + 12 + 17 + 23) / 5 =14.2

      SJF:(23 + 4 +1 + 9 + 15) / 5 =10.4

  5. 假设一个系统有 5 个进程,它们的到达时间和运行时间如下表所示,忽略 I/O 以及其他开销时间

    进程 到达时间 运行时间 FCFS SJF
    完成时间 周转时间 完成时间 周转时间
    A 0 3 3 3 3 3
    B 2 6 9 7 9 7
    C 4 4 13 9 15 11
    D 6 5 18 12 20 14
    E 8 2 20 12 11 3

    如果进程是在不同时刻到达,那么周转时间需要用完成时间 - 到达时间

    1. 请在表中给出先来先服务算法(FCFS)和最短进程优先算法(SJF)下各进程的完成时间和周转时间

    2. 请在上述两种算法下的平均周转时间

      FCFS:(3 + 7 + 9 + 12 + 12) / 5 = 8.6

      SJF:(3 + 7 + 11 + 14 + 13) / 5 = 9.6

  6. 某 CPU 系统有如下一批处于就绪状态的进程

image.png

  1. 给出先来先服务算法(SCFS)和最短进程优先算法(SJF)下各进程的开始时间、完成时间、周转时间

image.png

  1. 计算在各算法下的平均周转时间

    FCFS:(10 + 11 + 13 + 14 + 19) / 5 = 13.4

    SJF:(19 + 1 + 4 + 2 + 9) / 5 = 7

  2. 单 CPU 的多道批处理环境下,有四个进程 P1、P2、P3、P4,到达系统的时刻 t 和运行时间如题表 36 所示,忽略进程切换等其他开销

image.png 1. 若 t = 0 时,对该 4 个进程开始进行调度,采用最短时间优先调度算法,计算各进程的周转时间和平均周转时间(四舍五入,保留两位小数)

周转时间 = 完成时间 - 到达时间

image.png

  1. 0时刻只有 p1 到达所以运行 p1,运行 1 个时间单位

  2. 1 时刻 p2、p3 到达,因为是抢占式,p2 的运行时间最短优先运行 p2,运行两个时间单位

  3. 3 时刻 p2 运行完成,p2 的周转时间是 3 - 1 = 2,并且 p4 到达,p1 运行时间剩余 5 个时间单位,p3 运行时间 4 个时间单位,p4 运行时间 2 个时间单位由于是抢占式运行 p4

  4. 3~5 时刻,p4 运行完成,5 - 3 = 2

  5. 5 时刻,p1 剩余 5 个时间单位,p3 剩余 4 个时间单位,所以运行 p3, 9 - 1 = 8

  6. 9 时刻,运行p1 14 - 0 = 14

  7. 平均周转时间( 2 + 2 + 8 + 14 ) / 4= 6.5

  8. 若 t = 2 时,对该 4 个进程开始进行调度,采用最短作业优先调度算法,最先选中运行的进程是哪一个?该进程的带权周转时间是多少(四舍五入,保留两位小数)

    在 t = 2 的时候,只有p1、p2、p3 到达,采用最短作业优先调度,所以最先运行 p2

    带权周转时间 = 周转时间 / 运行时间

    p2 的完成时间是 t + 2 = 4

    周转时间 = 完成时间 - 到达时间

    4 - 1 = 3

    3 / 2 = 1.5

  9. 抢占式调度和非抢占式调度有何区别

    抢占式调度就是当就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行调度,转让处理器。非抢占式调度则是一旦把处理器分配给一个进程,它就一直占用处理器,直到进程运行结束或因为 I/O 阻塞等原因,才会自愿让出处理器。

  10. 什么是抢占式进程调度?先来先服务算法属于抢占式进程调度吗?为什么

    抢占式进程调度就是就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行调度,转让处理器

    不属于抢占式进程调度,在FCFS 中,一旦进程开始执行,它会一直执行到结束,直到完成后才会调度下一个进程。

  11. 什么是最高响应比优先算法?试简述这个进程调度算法的优点并说明原因

    最高响应比优先算法是一种非抢占式的进程调度算法,根据每个进程等待时间和执行时间来决定哪个进程先执行,响应比越大进程越先执行

    长时间等待的进程会优先执行,避免了短进程被长进程因为占用资源而饿死的现象,适用于多种类型的任务调度

  12. 简述进程最短剩余时间优先调度算法的基本思路以及实现方法

    采用抢占式策略。新进程加入就绪队列时,如果它需要运行的时间比当前进程所需的剩余时间还短,则运行进程被强行剥夺 CPU 的控制权,把那个新进程调度去运行。优点是可以保证新的短作业一旦进入系统就很快得到服务,但是实现这个算法会增加系统开销

  13. 什么是轮转调度算法?请分析时间片长短对算法性能的影响

    将处理器的处理时间划分为一个个时间片,就绪队列中的进程轮流运行一个时间片。当时间片结束时,让出处理器,进入就绪队列,等待下一次调度

    时间片太短,进程切换过于频繁,增加了系统开销

    时间片太长,对短的交互请求的响应时间有影响

捏捏捏捏捏捏捏捏捏捏捏

笔者观看的课程是 B 站博主小飞学长Pro 课程,前四章是免费的如果需要看后面的建议大家去购买正版课程 😊😊

🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉 🎉