进程调度
Linux进程调度原理
多任务
多任务操作系统指能同时并发地交互执行多个进程的操作系统。主要分为两类:
- 非抢占式多任务
- 抢占式多任务
Linux提供了抢占式的多任务模式,有调度程序决定进程的运行和停止。
调度程序
调度程序主要的工作:
- 决定进程的运行和停止
- 决定进程的运行时间
Linux内核在2.6.23后采用“完全公平调度算法”简称CFS。
Linux调度策略及算法
策略
策略就是决定调度程序在何时让什么进程运行。而进程可以被划分为I/O消耗型和处理器消耗型。
- I/O消耗型进程:经常处于可运行状态,因为运行时间短、响应时间快。
- 处理器消耗型进程:尽量降低调度频率,延长运行时间。
进程优先级
Linux采用两种不同的优先级范围,一种是nice值,一种是实时优先级。
- nice值:范围-20~+19,值越大优先级越低。
- 实时优先级:范围0~99,值越大优先级越高。
-任何实时进程的优先级都高于普通进程,所以抢占一般进程。
ps:一个进程不会同时拥有两种优先级。
时间片与CPU使用比
时间片是一个数值,表明进程在被抢占前所能持续运行的时间。
时间片调度策略实现原理
1.确定每个进程占用多少时间
2.选择占用CPU时间最多的进程执行
3.时间片用完后,再次统计每个进程的占用时间,以此类推
CPU使用比是指分配给每个进程的CUP时间,时间的分配不是绝对的。
Linux的CFS调度算法才用的就是处理器使用比,而不是时间片。
CFS算法的调度策略
1.计算每个进程的vruntime,通过update_curr()函数更新进程的vruntime。
2.选择具有最小vruntime的进程投入运行。
3.进程运行完后,更新进程的vruntime,转入步骤2
实时调度策略
Linux提供两种实时调度策略:SCHED_FIFO和SCHED_RR。
Linux提供的非实时调度策略:SCHED_NORMAL。