调度程序的基本工作是从一堆处于可运行状态的进程中选一个来执行;本章讨论了一些调度程序的理论,对比了几种调度程序,详细讲解了linux使用的“公平”调度程序;
多任务
-
抢占式多任务
调度程序决定进程们是运行还是挂起 -
非抢占式多任务
只能等运行的进程主动让步,其他进程才有机会执行
Linux的调度算法
这篇blog,讲的很清楚
- O(1)调度算法
- CFS调度算法
进程调度常用策略
-
优先级策略
高优先级先运行,低优先级后运行;
linux的优先级调度:
--nice值越低,优先级越高
--实时优先级越高,优先级越高 -
时间片策略
进程被抢占前所能持续运行的时间
CFS实现
-
时间记帐
vruntime记录了一个可执行进程到当前时刻为止执行的总时间(需要以进程总数n进行归一化,并且根据进程的优先级进行加权) -
进程选择
根据vruntime的定义可以知道,vruntime越大,说明该进程运行的越久,所以被调度的可能性就越小。所以我们的调度算法就是每次选择vruntime值最小的进程进行调度,内核中使用红黑树可以方便的得到vruntime值最小的进程 -
调度器入口
schedule() -
睡眠与唤醒
睡眠:进程将自己标记为休眠,从可执行红黑树中移除,放入等待队列;
唤醒:进程被设置成可执行态,再从等待队列移到可执行红黑树中;
抢占
-
用户抢占
从系统调用返回用户空间时
从中断处理返回用户空间时 -
内核抢占
从中断处理返回内核空间之前
内核空间再次具备可抢占性时(无锁,需要被抢占)
显示调用schedule()
任务阻塞
网友评论