1、处理与调度的概念

在现代操作系统中,处理指的是CPU对程序指令的执行过程,调度是操作系统管理和分配系统资源(如CPU、内存、I/O设备等)的核心机制。调度通过合理地管理这些资源,使得多个进程和线程可以并发执行,并尽可能高效地完成任务。

调度的主要任务是决定哪个进程或者线程在何时获得CPU的使用权。在多道程序设计和多任务处理的环境下,调度对于系统性能至关重要,它确保了系统资源的合理分配和高效利用。

2、调度的层次

操作系统里的“调度”不是单一动作,而是从外存 → 内存 → CPU 这条路径上,不同阶段有不同的调度决策。越靠近 CPU,调度频率越高、时间粒度越细。

所以通常分为三层:

  1. 作业调度(高级调度):决定哪些作业从外存进入内存。

  2. 内存调度(中级调度):决定哪些进程留在内存,哪些被换出到外存。

  3. 进程调度(低级调度):决定哪个就绪进程获得 CPU。

(1)作业调度(Job Scheduling)

定义:作业调度是操作系统负责在系统中选择和加载作业(Job)执行的过程。作业调度的目的是决定哪些作业从外存(磁盘、存储介质等)转移到内存中,以便执行。

职责:决定哪个作业进入系统,系统中存储的作业通过调度变得可以执行。

触发时机:通常在作业被提交到系统时触发,或者在系统空闲期间触发。

作业调度策略

  • 批处理作业调度:主要用于在一定时间内批量执行作业,通常是一次性任务,如编译任务。

  • 交互式作业调度:用于对用户输入作出响应的任务,适用于交互式计算环境。

作业调度算法

  • FCFS(First-Come, First-Served):先来先服务,按照作业到达顺序调度。

  • SJF(Shortest Job First):优先调度估计运行时间最短的作业。

  • 优先级调度:根据作业的优先级进行调度。

(2)进程调度(Process Scheduling)

定义:操作系统根据某些调度策略决定哪个进程在何时执行的过程。进程调度关注的是 CPU 的分配

职责:决定哪个就绪进程获得 CPU 使用权。

触发时机:进程调度在进程从就绪态进入运行态时发生。也可能发生在进程因 I/O 阻塞、时间片用尽、优先级变化等原因时。

进程调度策略

  • 轮询调度(Round Robin):每个进程分配一个固定的时间片,时间片到期后,将进程放回就绪队列,CPU 分配给下一个进程。

  • 优先级调度:根据进程的优先级来调度进程,优先级高的进程先执行。

  • 多队列调度:将进程根据优先级或行为类型划分为多个队列,每个队列有自己的调度策略。

(3)内存调度(Memory Scheduling)

定义:操作系统决定如何在内存中分配空间给不同进程的过程。它决定哪些进程能够驻留在内存中,哪些进程需要被换出到磁盘。

职责:管理内存中进程的驻留与换出,本质是虚拟内存管理的一部分。

触发时机:

  • 内存紧张时,需要换出某些进程腾出空间。

  • 被换出的进程重新具备运行条件时,需要换入。

  • 通常与对换(Swapping)机制配合。

  • 内存调度算法
    • 最少使用页面置换(LRU,Least Recently Used):选择最近最少使用的页面进行换出。
    • FIFO(First In, First Out):最早进入内存的页面优先被换出。
    • 最佳页面置换:选择未来最长时间内不再使用的页面进行置换。

3、三层调度的联系与对比

外存中的作业
   ↓ 作业调度(高级)
内存中的进程
   ↓ 内存调度(中级,换入换出)
内存中驻留的就绪进程
   ↓ 进程调度(低级)
CPU 上运行

作业调度进程调度内存调度都与系统资源的有效利用密切相关。三者共同配合,以确保系统能够高效地处理多任务并保持高吞吐量和低响应时间。

作业调度与进程调度

  • 作业调度决定哪些作业进入内存,进程调度决定内存中的进程什么时候运行。
  • 作业调度和进程调度之间的联系是,作业调度负责决定哪些作业加载进内存,而进程调度则负责在内存中选择和调度具体的进程执行。

进程调度与内存调度

  • 进程调度和内存调度是紧密联系的。进程调度决定进程何时占用CPU,而内存调度决定进程是否可以在内存中执行。当内存不够时,进程调度和内存调度需要配合工作,将不活跃的进程换出内存。

对比

  • 作业调度主要处理外存到内存的迁移,关心作业的加载,而进程调度关心的是内存中进程的运行安排,内存调度主要负责内存的管理和分配。
  • 作业调度相对较少发生,进程调度发生频繁,而内存调度则主要在内存不足时发生。

4、进程的挂起态

进程的挂起态(Suspended)是指进程被操作系统从运行队列中移除并暂时停止执行,但并未完全终止。在挂起态下,进程的资源仍然存在于内存中,只是不能继续运行,通常需要等待某些条件满足才能恢复。

挂起的原因:

  • I/O等待:进程请求的I/O设备或资源不可用时,可以挂起等待资源。
  • 内存不足:当内存资源紧张时,操作系统可能会将一些进程挂起,直到足够的内存空间释放出来。
  • 用户请求:进程可能被用户请求挂起,例如使用操作系统提供的挂起/恢复功能。

挂起态的进程在挂起时,操作系统会将其保存在一个特殊的队列中,等待条件满足后再重新调度到就绪队列中。

5、七状态模型

进程的状态通常用一个七状态模型来描述,这个模型对进程在不同阶段的状态进行了细致划分:

  • 新建态(New):进程刚刚被创建,尚未进入就绪队列,操作系统还在为其分配资源。
  • 就绪态(Ready):进程已准备好执行,等待CPU的分配。当系统有空闲的CPU时,进程会从就绪队列中被调度执行。
  • 运行态(Running):进程被分配到CPU,正在执行中。
  • 阻塞态(Blocked):进程因等待某些事件(如I/O操作)而无法继续执行,它需要等到某些资源可用后才能恢复执行。
  • 挂起态(Suspended):进程被暂停执行,但不会终止,通常是等待某些条件,如I/O资源的释放。
  • 完成态(Terminated):进程执行完成或被异常终止,所有资源已被释放,进程将被系统移除。
  • 等待态(Waiting):类似于阻塞态,表示进程正在等待特定的事件发生,通常是等待外部资源的提供。

七状态的联系与切换:

  • 从就绪态到运行态:当CPU空闲时,调度器会从就绪队列中选择一个进程运行。
  • 从运行态到阻塞态:进程在运行过程中,如果需要等待I/O操作,便会进入阻塞态。
  • 从阻塞态到就绪态:当等待的I/O操作完成,进程会回到就绪队列,等待CPU的分配。
  • 从就绪态或运行态到挂起态:在资源不足时,进程可以被挂起,进入挂起态。
  • 从挂起态到就绪态:当资源条件满足时,进程可以恢复,回到就绪队列。
  • 从运行态到完成态:进程执行完毕或被异常终止,进入完成态。

七状态模型是现代操作系统中对进程生命周期的详细描述,它帮助理解进程状态的转换以及操作系统如何管理进程的执行。

Logo

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

更多推荐