# 3.2 调度时机、切换与过程 ## 一、调度时机 ### 1.1 需要进行进程调度的时机 #### 当前进程终止 - 进程正常结束 - 进程异常终止 - 进程被撤销 #### 当前进程阻塞 - 进程请求I/O操作 - 进程请求资源失败 - 进程等待某事件 - 进程等待同步信号 #### 新进程创建 - 新进程创建后进入就绪队列 - 可能需要重新调度 #### 中断发生 - I/O中断完成 - 时钟中断(时间片用完) - 其他中断 #### 时间片用完 - 抢占式调度中,进程时间片用完 - 需要调度新的进程 ### 1.2 不能进行进程调度的时机 #### 处理中断时 - 中断处理需要快速完成 - 调度会延迟中断处理 #### 进程在临界区 - 进程在操作系统内核临界区 - 防止系统不稳定 #### 原子操作期间 - 需要屏蔽中断的原子操作 - 保证操作的原子性 --- ## 二、进程切换 ### 2.1 进程切换的概念 **进程切换**:从当前运行进程切换到另一个进程运行的过程。 **进程切换 vs 调度**: - 调度:选择哪个进程运行(决策) - 切换:实际的进程切换操作(执行) ### 2.2 进程切换的过程 #### 保存当前进程的现场 1. **保存程序计数器(PC)**:记录当前执行位置 2. **保存状态寄存器(PSW)**:记录处理器状态 3. **保存通用寄存器**:保存数据 4. **保存其他寄存器**:如栈指针等 5. **更新PCB**:将现场信息保存到PCB #### 选择新进程 1. **运行调度算法**:从就绪队列选择新进程 2. **更新就绪队列**:将当前进程插入就绪队列(如果被抢占) #### 恢复新进程的现场 1. **从PCB读取现场**:获取新进程的寄存器值 2. **恢复通用寄存器** 3. **恢复状态寄存器** 4. **恢复程序计数器** 5. **设置地址空间**:切换页表/段表 #### 执行新进程 - 跳转到新进程的程序计数器位置 - 开始执行新进程 ### 2.3 进程切换的开销 #### 直接开销 - 保存和恢复寄存器 - 更新各种表格 - 切换地址空间 #### 间接开销 - **高速缓存(Cache)失效**:新进程的Cache内容不同 - **快表(TLB)失效**:需要重新转换地址 - **流水线清空**:CPU流水线需要重新填充 **上下文切换时间**:通常在几微秒到几十微秒 --- ## 三、调度过程 ### 3.1 非抢占式调度的过程 ``` 当前进程运行 ↓ 当前进程完成或阻塞 ↓ 保存当前进程现场 ↓ 调用调度程序 ↓ 选择新进程 ↓ 恢复新进程现场 ↓ 新进程运行 ``` ### 3.2 抢占式调度的过程 ``` 当前进程运行 ↓ 时间片用完/高优先级进程到达 ↓ 保存当前进程现场 ↓ 当前进程插入就绪队列 ↓ 调用调度程序 ↓ 选择新进程 ↓ 恢复新进程现场 ↓ 新进程运行 ``` ### 3.3 调度程序的执行 **调度程序(Scheduler)**: - 选择下一个执行的进程 - 更新进程状态 - 维护就绪队列 **调度程序的实现**: - 可以是独立的进程 - 可以是内核的一部分 - 通常在核心态执行 --- ## 四、调度过程中的关键问题 ### 4.1 上下文保存 **需要保存的内容**: - 通用寄存器 - 程序计数器 - 状态寄存器 - 栈指针 - 地址空间信息(页表指针) **保存位置**: - PCB(进程控制块) - 内核栈 ### 4.2 模式切换 **用户态 → 核心态**: - 系统调用 - 中断 - 异常 **核心态 → 用户态**: - 系统调用返回 - 中断返回 - 进程切换后执行新进程 ### 4.3 地址空间切换 **页表切换**: - 切换页表基址寄存器 - 刷新TLB **段表切换**: - 切换段表基址寄存器 **开销**: - 切换地址空间是昂贵的操作 - 会导致Cache和TLB失效 --- ## 五、调度相关的系统调用 ### 5.1 放弃CPU **系统调用**:`yield()` **功能**: - 当前进程主动放弃CPU - 进入就绪队列 - 触发调度 ### 5.2 设置优先级 **系统调用**:`nice()` 或 `setpriority()` **功能**: - 设置进程优先级 - 影响调度顺序 ### 5.3 获取调度信息 **系统调用**:`getpriority()` **功能**: - 获取进程优先级 - 获取调度策略 --- ## 六、考研重点 1. **调度时机**:什么时候需要调度,什么时候不能调度 2. **进程切换的过程**:保存现场、选择新进程、恢复现场 3. **进程切换的开销**:直接开销和间接开销 4. **上下文保存的内容**:寄存器、PC、PSW等 5. **模式切换**:用户态和核心态的切换 6. **地址空间切换**:页表切换的开销 --- *下一节:3.3 调度算法*