优秀博客: https://www.cnblogs.com/alantu2018/p/8460451.html
如果进程的绝大多数都在使用 CPU 做运算的话,那么这种进程称之为 CPU 消耗型,比如开启 Matlab 做一个大型的运算。没有太多的 I/O 需求,从系统响应的角度上来讲,调度器不应该经常让他们运行。对于处理器消耗型的进程,调度策略往往是降低他们的执行频率,延长运行时间。
运行的进程如果大部分来进行 I/O 的请求或者等待的话,这个进程称之为 I/O 消耗型,比如键盘。这种类型的进程经常处于可以运行的状态,但是都只是运行一点点时间,绝大多数的时间都在处于阻塞(睡眠)的状态。
Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。
1.1. 交互式进程
1.2. 批处理进程
这些进程有很强的调度需要. 这样进程就绝不会被低优先级的进程阻塞,他们应该有一个很短的响应时间.更重要的是实时进程的响应时间的变化很小.
普通进程和实时进程:
实时进程要比普通进程优先运行。这两种进程的区分也反映在task_struct数据结构中了。
1.SCHED_FIFO: 先来先服务
2. SCHED_RR:时间片轮转
linux 2.6 调度程序 实现了基于进程过去行为的启发式算法
调度进程就是 0号进程
http://blog.chinaunix.net/uid-26602509-id-3269941.htmlhttp://blog.chinaunix.net/uid-26332427-id-3791209.html
最终优先级PRI=优先级PRI+ nice值NI
优先级范围: 0 - 139
nice值的修改是针对于普通进程的
(1)一般用户的nice值为0~19;
(2)root可用的nice值为-20~19;
(3)一般用户仅可将nice值越调越高,如果本来nice为5,则只能调整到大于5的nice:
(4)一般用户仅能调整属于自己的进程nice值。
也就是说,要调整某个进程的优先级,就是“调整该进程的nice值”。
用户并不能直接修改优先级PRI 而只能通过修改 NICE值去间接影响 PRI5
ps 查看当前系统各个进程的静态优先级
top 查看动态优先级
nice/renice: 可以修改和指定用户的优先级
注意: root可以随便调整nice值 普通用户只能降低nice值
top命令效果:
本段转自知乎https://zhuanlan.zhihu.com/p/112203100
已经超出知识盲区了 ~
可以用两种方法来激活调度
1.主(通用)调度器: 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU
2. 周期(核心)调度器: 通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要
并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类
linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能
linux内核实现的6种调度策略, 前面三种策略使用的是cfs调度器类,后面两种使用rt调度器类, 最后一个使用DL调度器类
调度器不限于调度进程, 还可以调度更大的实体, 比如实现组调度: 可用的CPUI时间首先在一半的进程组(比如, 所有进程按照所有者分组)之间分配, 接下来分配的时间再在组内进行二次分配.
这种一般性要求调度器不直接操作进程, 而是处理可调度实体, 因此需要一个通用的数据结构描述这个调度实体,即seched_entity结构, 其实际上就代表了一个调度对象,可以为一个进程,也可以为一个进程组.
调度类 调度算法
|---- SCHED_NORMAL 普通进程调度
普通进程 ---- CFS --|---- SCHED_BATCH normal的分化
|---- SCHED_IDLE
|---- SCHED_FIFO 先来先服务
|---- RT --|---- SCHED_RR 时间片轮转
|
实时进程 |
|---- DL --|---- SCHED_DEADLINE 新支持的
回顾linux进程队列 运行队列的数据结构
https://blog.csdn.net/jiewaikexue/article/details/109730664
每个普通进程都有自己的静态优先级
1. 静态优先级从何而来?
静态优先级继承与父进程
2. 静态优先级的范围: 100~ 139
3. 静态优先级决定了什么?
静态优先级的本质 是决定基本时间片
if(静态优先级>=120)
{
基本时间片= (140-静态优先级) * 5 单位ms
}
else if(静态优先级<120)
{
基本时间片= (140-静态优先级) * 20 单位ms
}
每个普通进程还有动态优先级
1. 动态优先级有什么用?
动态优先级是调度程序选择新进程来运行的时候使用的数
动态优先级 设计到 进程调度的奖惩机制
2. 动态态优先级的范围: 100~ 139
3. 动态优先级计算
动态优先级= max( 100,min(静态优先级-bonus+5 ,139))
bonus[0,10]:该值依赖于进程过去的情况 与平均睡眠时间有关
bonus 值小于5 表示 这个进程上次表现良好 ,奖励一下( 优先级增大,进程的时间片划分的多)
反之,同理
平均睡眠时间和bonus
1. 区分交互式进程和批处理进程的启发式算法
依据的就是 平均睡眠时间 —>准确说是 平均睡眠时间得出的bonus
平均睡眠时间:进程在睡眠状态所消耗的平均ms数
2.计算平均睡眠时间得出相应的bonus
bonus>= 静态优先级/4-28+5
bonus大于2 的都是交互式进程
或者
动态优先级<=3* 静态优先级/4+28
该公式等价于上面的
调度算法能够明确的的知道所有实时进程的身份
但是对于普通进程 们就需要通过启发式算法进行区分
批处理进程: cpu繁忙
交互式进程: i/o繁忙
该公式等价于上面的
第一个出现在本cpu运行队列的相应链表中的进程 ,上cpu