操作系统(6)第二章- 处理器调度
处理器调度 调度层次1. 调度到底在干嘛CPU 只有一个或几个核心但线程成千上万。调度 操作系统决定哪个线程在哪个时刻占用哪个 CPU 核心。调度的目标让程序响应快让 CPU 尽量不闲着避免某个线程饿死保证公平、稳定2. 调度的三个层次工程里真实存在① 高级调度作业调度对应场景批处理系统、离线任务、大规模计算集群决定哪些任务能被加载进系统、创建进程调度单位作业 / 任务组频率很低基本不影响你写业务代码现代 PC、服务器、云应用里基本不用关心你写后端、APP、微服务基本接触不到。② 中级调度内存调度对应场景内存不够用时的换入换出决定哪些进程暂时挪到交换分区swap哪些再拉回内存目的缓解内存压力调度单位进程挂起 / 唤醒你写代码时感知不到但它会影响程序卡顿、延迟比如内存爆了 → 进程被换出 → 再次运行时卡顿这就是中级调度在起作用。③ 低级调度CPU 调度 / 线程调度这是你写代码时真正要关心的唯一一层决定就绪队列里哪个线程 next 上 CPU调度单位线程频率极高毫秒级操作系统核心功能必须有你写多线程、锁、异步、协程全都是在跟它打交道。进程调度的方式、时机、切换和过程调度时机内核真正会调用 schedule () 的时刻会发生调度调用 schedule ()的时机时间片耗尽时钟滴答中断HZ 定时器中断current 进程时间片用完触发重新调度开发意义CPU 公平轮转基础进程主动阻塞自愿调度socket read、磁盘 IO、sleep、wait、信号量 P、互斥锁阻塞进程主动放弃 CPU进入等待队列开发最常见网络 IO、文件 IO 阻塞都会触发调度高优先级进程唤醒抢占唤醒阻塞进程唤醒变为就绪优先级 当前运行进程立即抢占开发意义实时进程、中断下半部唤醒高优先级任务中断处理返回用户态前夕中断处理完即将回到用户态执行进程时检查是否需要调度核心原理中断处理期间绝对不调度防止内核栈混乱内核态抢占点preempt checkLinux 内核抢占打开后内核代码打开抢占、关闭抢占在抢占检查点判断是否需要调度进程正常退出 exec/exit中断内部不调度中断上下文 特殊上下文不能睡眠、不能调度、不能抢占只有退出中断、返回进程上下文才调度。进程调度方式内核真实实现抢占 / 非抢占开发视角用户永远感知不到调度调度全部在内核态完成1. 非抢占式调度协作式调度 Cooperative内核不能强行抢走 CPU当前进程必须主动放弃 CPU才会调度主动阻塞read/write/poll/select/sleep/ 信号量 P进程退出主动调用 schedule ()特点无抢占延迟、上下文切换少缺点一个死循环进程可以占满 CPU 永不释放Linux 早期内核、单片机、RTOS 轻量级、用户态协程Go 协程、libco都是协作非抢占2. 抢占式调度抢占式 PreemptiveLinux 默认内核可以在任意时刻强行剥夺当前进程 CPU分为两种开发重点用户态抢占时钟中断到来直接抢占最常见内核态抢占Linux 2.6 以后支持内核代码运行时也可以被抢占解决内核延迟问题开发理解抢占 时钟中断触发 调度器重新选进程现代服务器、移动端、桌面 OS全部抢占式进程切换上下文切换 Context Switch调度 ≠ 切换调度调度器算法 pick 下一个进程policy切换硬件层面保存 / 恢复寄存器完成 CPU 使用权转移mechanism上下文切换内容真实硬件用户态通用寄存器 eax/ebx/ecx...程序计数器 RIP/PC栈指针 RSP/SP程序状态字 RFLAGS/PSW页表基址 CR3地址空间切换开销最大内核栈指针、PCB 指针开销来源寄存器保存恢复 页表切换 TLB 刷新 缓存失效开发调优重点频繁上下文切换 CPU 性能暴跌完整调度 切换全过程Linux 内核真实执行流程按 CPU 执行顺序一步不差前提当前进程 A 正在用户态运行硬件触发中断时钟中断 / IO 中断CPU 自动保存用户态现场部分寄存器→ 强制进入内核态中断入口中断处理程序运行处理中断事件IO 完成、时钟计数 中断处理完毕检查是否需要调度判断条件当前进程时间片用完有更高优先级就绪进程need_resched 标志置位如果需要调度调用内核函数schedule()进入进程调度主逻辑① 把当前进程 A 状态Running → Ready插入就绪队列 CFS / 实时队列② 调度器遍历就绪队列按照 CFS 完全公平调度算法选出进程 B③ 把进程 B 状态Ready → Running硬件上下文切换进程切换核心① 保存进程 A 全部硬件上下文到 A 的 PCB② 加载进程 B 的 PCB 上下文到 CPU 寄存器③ 切换页表 CR3刷新 TLB地址空间切换切换完成CPU 现在属于进程 B从内核态中断返回指令恢复用户态现场CPU 开始执行进程 B 用户态代码调度器和闲逛进程一、调度器Scheduler调度器是操作系统内核的核心组件负责管理进程 / 线程、决定谁用 CPU、用多久、何时切换确保系统公平、高效、可响应。1. 核心职责选择进程按调度算法如 FCFS、时间片轮转、优先级从就绪队列选下一个运行进程。上下文切换保存当前进程状态、恢复新进程状态实现 CPU 控制权交接。状态管理维护进程就绪、运行、阻塞三态转换。2. 调度触发时机进程创建 / 退出、运行进程阻塞如 I/O、I/O 中断唤醒进程、时钟中断抢占式。3. 调度方式抢占式时钟中断强制切换防长进程独占 CPU。非抢占式进程主动放弃 CPU阻塞 / 退出才切换。二、闲逛进程Idle Process闲逛进程空闲进程是系统优先级最低的特殊进程仅当就绪队列为空时运行避免 CPU 无任务可做。1. 核心特点优先级最低仅在无其他就绪进程时被调度。空循环 节能执行halt或nop让 CPU 进入低功耗 C-state省电降温。永不退出系统启动时创建Linux 为 0 号进程Windows 为 “系统空闲进程”。不抢占多核下每个 CPU 核心一个 idle禁止抢占防栈溢出。2. 核心作用避免 CPU 空转就绪队列永不空调度器总有进程可选。节能降耗CPU 空闲时降频 / 休眠延长续航、降低散热。快速响应新进程就绪时调度器立即抢占 idle零延迟切换。3. 工作流程系统初始化创建 idle 进程优先级设为最低。调度器检查就绪队列非空按算法选正常进程运行。为空调度 idle执行halt让 CPU 休眠。中断如 I/O、时钟唤醒 CPU回到步骤 2。三、调度器与闲逛进程的关系备胎机制idle 是调度器的 “永远备胎”确保 CPU 永不空闲。优先级隔离调度器永远优先调度正常进程仅无任务时才用 idle 填补空闲。协同节能调度器负责任务分配idle 负责空闲节能共同平衡性能与功耗。四、关键区别特性调度器闲逛进程角色资源分配决策者空闲占位任务优先级内核级调度自身系统最低运行条件持续工作触发时调度仅就绪队列为空核心功能选择 / 切换进程空循环、节能总结调度器是 CPU 资源的 “管理者”决定任务分配闲逛进程是 CPU 空闲时的 “占位符”保证系统稳定与节能。二者协同让系统在繁忙时高效、空闲时省电。