调度
多个程序在并发的情况下执行,最大化CPU利用率,同时要保证一定的公平性
调度的时机
五种情况:
- Running -> Waiting:例如等待I/O
- Running -> Ready: interupt,计时器到时间了
- Running -> Terminated
- Waiting -> Ready: I/O完成
- New -> Ready
将进程调度分为非抢占式调度(当前运行的进程不能再运行时才会进行一次调度)和抢占式调度(根据进程的优先级进行跑)
可以直接用调度器来进行调度
调度的过程
···的过程叫上下文切换,这里的上下文切换用PCB来表示
作业调度算法
FCFS:First come First Saved,非抢占式
SJF:shortesr-Job-First,问题在于不知道具体运行时间
RR: Round-Robin,定义一个时间片轮流跑,抢占式
Priority Scheduling:选取最高优先级进行执行
Multilevel Queue Scheduling:
在实际应用中,进程通常被分为不同的组,每个组有一个自己的 ready queue,且每个队列内部有自己独立的调度算法。例如,前台队列使用 RR 调度以保证 response,后台队列可以使用 FCFS。同时,队列之间也应当有调度。通常使用 preemptive priority scheduling,即当且仅当高优先级的队列(如前台队列)为空时,低优先级的队列(如后台队列)中的进程才能获准运行。也可以使用队列间的 time-slicing,例如一个队列使用 80% 的时间片而另一个使用 20%。例如:
Multilevel Feedback Queue Scheduling
Multilevel Feedback Queue Scheduling 允许进程在队列之间迁移。这种算法可以有很多种实现,因为队列的数量、每个队列中的调度策略、队列之间的调度算法以及将进程升级到更高优先级/降级到更低优先级的队列的条件都是可变的。一个系统中的最优配置在另一个系统中不一定很好。这种算法也是最为复杂的。
linux nice函数实现优先级