调度器到底在决定什么 在单核处理器上,同一时刻只能有一个可运行实体真正执行。就绪队列中可能同时存在多个进程,调度器需要决定:
下一个运行哪个进程; 当前进程运行多久; 什么时候因为阻塞、完成或定时器中断重新选择; 如何让短任务尽快完成,同时避免长任务长期得不到处理器; 多个处理器核心存在时,任务应该放在哪个核心上。 调度不是单纯的排序问题。进程切换需要保存和恢复寄存器状态,还可能破坏处理器缓存中的局部性。因此,调度器要在响应时间、周转时间、公平性和切换开销之间作出取舍。
flowchart LR arrive["进程到达"] --> ready["就绪队列"] ready --> choose["调度器选择"] choose --> running["占用 CPU"] running --> finish["完成"] running --> block["等待 I/O 或事件"] running --> preempt["时间片用尽,被抢占"] block --> ready preempt --> ready 先固定一组工作负载 为了比较不同策略,先使用同一组进程。每个进程只包含一个 CPU burst,不在运行期间发起 I/O。
进程 到达时间 CPU burst A 0 3 B 2 6 C 4 4 D 6 5 E 8 2 本文采用以下约定:
这是单核处理器; 新进程在对应时刻的调度决策前进入就绪队列; 同一时刻需要打破平局时,优先考虑更早进入队列的进程; A(0-3) 表示进程 A 在时间区间 [0, 3) 运行; 不考虑上下文切换耗时,时间单位可以理解为抽象的处理器时间单位。 现实中的 I/O-bound 进程可以拆成多个 CPU burst。每个 burst 结束后,进程进入阻塞状态;I/O 完成后重新回到就绪队列。
...