Process Scheduling in OS

引起调度的事件

进程主动放弃 CPU

  1. 进程正常终止:进程完成所有任务后结束运行(如程序执行 exit() 系统调用),此时 CPU 空闲,需从就绪队列中选择下一个进程运行。
  2. 进程阻塞:进程因需要等待某类资源(如 I/O 操作、信号量、锁)而进入阻塞状态,主动释放 CPU
  3. 进程主动礼让:部分系统支持进程通过 yield() 等系统调用主动放弃 CPU

系统强制剥夺 CPU

  1. 高优先级进程到达:新进程进入就绪队列,且优先级高于当前运行进程
  2. 时间片耗尽:时间片轮转算法中,当前进程用完时间片(如10ms)→强制放回就绪队列末尾,触发调度。

硬件中断

  1. 时钟中断:操作系统通过定时器周期性产生时钟中断,内核在中断处理程序中检查是否需要进行调度
  2. I/O 中断:当 I/O 设备完成数据传输后,会产生中断信号,内核在中断处理程序中检查是否有阻塞进程可以唤醒并调度

调度算法评价指标

指标描述
周转时间
Turnaround Time
进程从 “提交” 到 “完成” 的总时间(包括等待时间、CPU 执行时间、I/O 时间)
响应时间
Responsive Time
进程从 “提交请求” 到 “首次获得 CPU 响应” 的时间
吞吐量
Throughput
在单位时间内,系统所完成的作业数
CPU利用率$\frac{\text{CPU有效工作时间}}{\text{CPU有效工作时间}+\text{CPU空闲等待时间}}$
各类资源利用率如内存、外存、I/O 设备等的利用率

常见调度算法

FCFS, SJF

批处理系统以 “提升吞吐量、降低平均周转时间” 为核心目标,进程多为后台任务(无实时交互需求),常用以下算法:

  • $FCFS,First Come First Served$: 在RQ(Ready Queue),按进程进入队列的次序进行调度,先到者先服务
  • $SJF,Shortest Job First$: 选择估计运行时间最短的作业进行调度

PS, RR, MLFQ

Preemptive & Non-preemptive

  1. 非抢占:进程开始后,除非主动放弃,否则其他进程只能排队等它让出CPU
  2. 抢占:内核调度程序将原进程中断,并将CPU分配给其他进程

交互式系统(如 Windows、Linux 桌面)以 “缩短响应时间、保证用户体验” 为核心,需频繁切换进程,常用以下抢占式算法:

  • $\text{PS,Priority Scheduling}$: 优先权[1]调度算法
    • HRRN, High Response Ratio Next:是介于 FCFS 和 SJF 之间的一种折中算法,使用响应比[2]作为优先权判断依据。
  • $\text{RR,Round Robin}$: 将 CPU 分配给就绪队首进程。进程执行一个时间片后,计时器中断会停止该进程,并将其移至队列末尾,然后将 CPU 分配给新的队首进程,再次执行一个时间片。
  • $\text{MLQ,MultiLevel Queue}$:将系统中运行的进程根据其特性划分为不同的就绪队列,并为每个队列分配不同的调度算法
    • $MLFQ,MultiLevel Feedback Queue$:为各个队列赋予不同的优先级队列,规定高优先级队列时间片小。一个进程进入内存后,首先将它放入第一队列的末尾,轮到该进程执行时,如进程一次时间片没执行完,就降至下一级队列。OS优先调度高优先级队列中的进程,仅当 $RQ_0$ 空闲时才调度 $RQ_1$ 队列进程,以此类推

EDF, LLF

  • $\text{EDF,Earliest Deadline First}$: 根据任务的截止时间来确定任务的优先级。截止时间愈早,其优先级愈高。
  • $\text{LLF,Least Laxity First}$: 按松弛度[3]排序,松弛度值最小的任务排在队列最前面,调度程序总是选择就绪队列中的队首任务执行;当有任务执行时,只有等待任务的松弛度值为 0 才会发生任务的调度,其他情况不发生调度。

  1. 指给进程排执行顺序的依据,可分为静态(创建时确定)和动态(随进程运行 / 等待时间变);确定优先级的依据可以是:进程类型 (用户 / 系统),资源要求 (I/O 密集 / CPU 密集),进程重要性 (交互 / 批处理) etc. ↩︎

  2. $R_p = \frac{\text{等待时间}+\text{预计运行时间}}{\text{预计运行时间}} = \frac{\text{响应时间}}{\text{预计运行时间}}$ ↩︎

  3. $Laxity = Deadline - RemainingServiceTime - CurrentTime$ ↩︎

Process Scheduling in OS

https://vluv.space/进程调度/

作者

GnixAij

发布于

2024-03-29

更新于

2025-10-19

许可协议

评论