【操作系统-13】进程调度
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资源并有效管理进程执行的关键机制。
-
调度时机主要包括:时间片耗尽、进程阻塞、进程优先级变化、进程终止等。
-
调度方式分为非剥夺式调度和剥夺式调度:
-
非剥夺式调度简单,但响应较慢,适用于批处理任务;
-
剥夺式调度更加灵活,适用于需要快速响应的多任务系统。
-
实际操作中,操作系统通过上下文切换来完成进程的切换,确保系统能够高效地执行多个进程。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)