1、进程调度的时机

进程调度是操作系统的核心功能之一,它负责决定哪个进程可以使用CPU。调度的时机是根据操作系统的调度策略和系统状态来决定的。主要的调度时机如下:

(1) 时间片耗尽

  • 描述: 在时间片轮转(Round Robin)调度算法中,每个进程会被分配一个固定的时间片(通常是几毫秒)。当进程的时间片用尽时,操作系统会停止当前进程的执行,并将其放回就绪队列,调度另一个进程执行。

  • 触发时机: 当正在执行的进程完成当前时间片时。

(2) 进程阻塞或等待

  • 描述: 当进程正在执行时,如果它需要等待某些事件(如I/O操作、资源获取等),它会被阻塞,操作系统需要调度另一个进程来执行。阻塞通常发生在进程试图访问尚不可用的资源时。

  • 触发时机: 进程因等待某个事件(例如I/O操作完成、锁资源等)而进入阻塞状态时。

(3) 进程优先级变化

  • 描述: 在优先级调度算法中,进程的优先级可能会发生变化。如果优先级较高的进程到来,操作系统可能会暂停当前运行的进程并调度高优先级的进程。

  • 触发时机: 当一个更高优先级的进程变为就绪状态时,可能会中断当前进程并将其切换出去。

(4) 进程终止或完成

  • 描述: 当一个进程完成任务并终止时,操作系统会从就绪队列中调度另一个进程来继续执行。

  • 触发时机: 进程执行完毕或发生错误、终止时。

(5) 操作系统内核请求

  • 描述: 操作系统内核会根据自身的需要进行调度,例如在处理硬件中断或资源调度时。内核可以基于不同的系统需求来暂停当前进程并调度新的进程。

  • 触发时机: 当操作系统需要处理某些重要事件(如中断、系统调用等)时。

2、进程调度的切换与过程

进程切换(或称上下文切换)是操作系统从一个进程切换到另一个进程的过程,主要涉及以下步骤:

(1)保存当前进程的上下文

  • 上下文定义: 进程上下文是指进程的所有执行状态,包括程序计数器、CPU寄存器的值、堆栈指针、内存管理信息等。

  • 保存位置: 当前进程的上下文(如寄存器的值、程序计数器)需要保存在进程控制块(PCB)中,便于将来恢复。

(2)选择下一个进程

  • 调度决策: 调度器根据调度算法(如时间片轮转、优先级调度等)从就绪队列中选择一个新的进程。

  • 选择依据: 如果有多个进程处于就绪状态,调度器需要选择优先级最高或满足其他条件的进程。

(3)恢复下一个进程的上下文

  • 恢复操作: 从下一个进程的PCB中恢复其上下文(如程序计数器、堆栈指针等)。

  • 加载执行: 恢复后,CPU会加载下一个进程的指令并开始执行。

(4)更新系统状态

  • 状态变更: 更新进程的状态信息(如将当前进程的状态标记为“就绪”或“阻塞”,将新进程标记为“运行”)。

  • 队列维护: 调度器更新就绪队列中的状态,确保进程在正确的状态中。

(5)恢复执行

  • 运行新进程: CPU开始执行恢复后的进程,直到进程结束、阻塞、被剥夺或时间片用尽。

3、进程调度的方式

进程调度方式决定了操作系统如何分配CPU资源,主要分为非剥夺式调度(Non-Preemptive Scheduling)和剥夺式调度(Preemptive Scheduling)两种方式。

(1)非剥夺式调度 (Non-Preemptive Scheduling)

  • 核心机制: 一旦进程开始执行,操作系统不会中断它,直到该进程主动释放CPU。进程只能自愿放弃CPU,比如完成任务、主动等待I/O操作等。换句话说,除非进程自己结束或阻塞,否则它会一直运行下去。

  • 特点:

    • 无中断: 进程一旦获得CPU后,不会被中断。

    • 简化调度: 由于不会发生抢占,调度过程较为简单。

    • CPU独占: 进程可以完全占用CPU,直到它完成任务或进入阻塞状态。

    • 响应迟钝: 由于无法中断进程,某些高优先级的进程可能会被长期延迟,系统响应较慢。

  • 适用场景: 适合对响应要求不高的批处理系统或需要连续执行的任务,如大规模计算任务。

  • 常见的非剥夺式调度算法:

    • FCFS (First-Come, First-Served): 进程按到达顺序执行,每个进程使用CPU直到完成或进入阻塞状态。

    • SJF (Shortest Job First): 选择预计执行时间最短的进程执行。

(2)剥夺式调度 (Preemptive Scheduling)

  • 核心机制: 操作系统可以强制中断正在执行的进程,并将其放回就绪队列,将CPU分配给另一个进程。也就是说,当前进程的执行会被暂停,操作系统可以在任何时刻选择另一个进程来执行。

  • 特点:

    • 中断性: 操作系统可以中断当前进程的执行,将CPU分配给其他进程。

    • 灵活性高: 可以动态调整系统资源分配,确保高优先级进程及时执行,响应性更好。

    • 开销大: 由于频繁的上下文切换和中断,剥夺式调度的开销较高。

    • 优先级控制: 进程的优先级越高,越容易被调度到CPU,确保高优先级进程能够及时执行。

  • 适用场景: 适用于需要实时响应、处理交互任务或优先级控制的多任务系统,如操作系统、嵌入式系统等。

  • 常见的剥夺式调度算法:

    • 轮转调度 (Round Robin, RR): 每个进程分配一个固定的时间片,时间片用尽后被暂停,放回就绪队列,操作系统调度下一个进程。

    • 优先级调度 (Priority Scheduling): 根据进程的优先级选择进程执行,优先级高的进程优先获得CPU。

    • 多级反馈队列 (Multilevel Feedback Queue): 结合了多种调度策略,根据进程的行为动态调整其优先级。

总结

进程调度是操作系统为合理分配CPU资源并有效管理进程执行的关键机制。

  • 调度时机主要包括:时间片耗尽、进程阻塞、进程优先级变化、进程终止等。

  • 调度方式分为非剥夺式调度和剥夺式调度:

    • 非剥夺式调度简单,但响应较慢,适用于批处理任务;

    • 剥夺式调度更加灵活,适用于需要快速响应的多任务系统。

实际操作中,操作系统通过上下文切换来完成进程的切换,确保系统能够高效地执行多个进程。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐