<<深入理解linux内核>> --进程调度读书笔记

文章目录

  • 1. 常见调度算法
  • 2. 进程分类
    • 2.1 第一种
    • 2.2 第二种分类
      • 2.2.1普通进程和实时进程的区别
      • 2.2.2 交互式进程和批处理进程的区分
  • 3. 进程优先级
    • 3.1优先级划分
    • 3.2 优先级查看
  • 4.调度相关
    • 4.1 2个调度器
    • 4.2 6中调度算法
    • 4.3 5个调度器类
    • 4.4 3个调度实体
    • 4.5 对应关系
    • 4.6 小总结:(懂这些就好)
  • 5. 进程调度
    • 5.1 知识回顾
    • 5.2 普通进程
    • 5.3 实时进程
      • 5.3.1 调度规则
      • 5.3.2 实时进程的取代

1. 常见调度算法

优秀博客: https://www.cnblogs.com/alantu2018/p/8460451.html

  1. 先来先服务
  2. 短作业优先
  3. 最高响应比
  4. 时间片轮转
  5. 多级反馈队列

2. 进程分类

2.1 第一种

  1. cpu密集型进程

如果进程的绝大多数都在使用 CPU 做运算的话,那么这种进程称之为 CPU 消耗型,比如开启 Matlab 做一个大型的运算。没有太多的 I/O 需求,从系统响应的角度上来讲,调度器不应该经常让他们运行。对于处理器消耗型的进程,调度策略往往是降低他们的执行频率,延长运行时间。

  1. i/o密集型进程

运行的进程如果大部分来进行 I/O 的请求或者等待的话,这个进程称之为 I/O 消耗型,比如键盘。这种类型的进程经常处于可以运行的状态,但是都只是运行一点点时间,绝大多数的时间都在处于阻塞(睡眠)的状态。

Linux 系统为了提升响应的速度,倾向于优先调度 I/O 消耗型。

2.2 第二种分类

  1. 普通进程

1.1. 交互式进程
1.2. 批处理进程

  1. 实时进程

这些进程有很强的调度需要. 这样进程就绝不会被低优先级的进程阻塞,他们应该有一个很短的响应时间.更重要的是实时进程的响应时间的变化很小.

普通进程和实时进程:
实时进程要比普通进程优先运行。这两种进程的区分也反映在task_struct数据结构中了。

2.2.1普通进程和实时进程的区别

  1. 优先级: 实时进程的优先级 普遍比普通进程高
  2. 调度策略:
    实时进程有两种调度策略

1.SCHED_FIFO: 先来先服务
2. SCHED_RR:时间片轮转

2.2.2 交互式进程和批处理进程的区分

linux 2.6 调度程序 实现了基于进程过去行为的启发式算法

调度进程就是 0号进程

http://blog.chinaunix.net/uid-26602509-id-3269941.htmlhttp://blog.chinaunix.net/uid-26332427-id-3791209.html

3. 进程优先级

最终优先级PRI=优先级PRI+ nice值NI

3.1优先级划分

优先级范围: 0 - 139

  1. 0-99 :为实时进程的实时优先级
  2. 100- 139:为静态优先级
    在这里插入图片描述
    nice值范围: -20 ~ 19

nice值的修改是针对于普通进程的

(1)一般用户的nice值为0~19;
(2)root可用的nice值为-20~19;
(3)一般用户仅可将nice值越调越高,如果本来nice为5,则只能调整到大于5的nice:
(4)一般用户仅能调整属于自己的进程nice值。

也就是说,要调整某个进程的优先级,就是“调整该进程的nice值”。

3.2 优先级查看

用户并不能直接修改优先级PRI 而只能通过修改 NICE值去间接影响 PRI5

ps 查看当前系统各个进程的静态优先级
top 查看动态优先级
nice/renice: 可以修改和指定用户的优先级

注意: root可以随便调整nice值 普通用户只能降低nice值

top命令效果:

<<深入理解linux内核>> --进程调度读书笔记_第1张图片

<<深入理解linux内核>> --进程调度读书笔记_第2张图片

4.调度相关

本段转自知乎https://zhuanlan.zhihu.com/p/112203100

已经超出知识盲区了 ~

4.1 2个调度器

可以用两种方法来激活调度

1.主(通用)调度器: 一种是直接的, 比如进程打算睡眠或出于其他原因放弃CPU
2. 周期(核心)调度器: 通过周期性的机制, 以固定的频率运行, 不时的检测是否有必要

并且每个调度器包括两个内容:调度框架(其实质就是两个函数框架)及调度器类

4.2 6中调度算法

linux内核目前实现了6中调度策略(即调度算法), 用于对不同类型的进程进行调度, 或者支持某些特殊的功能
<<深入理解linux内核>> --进程调度读书笔记_第3张图片

linux内核实现的6种调度策略, 前面三种策略使用的是cfs调度器类,后面两种使用rt调度器类, 最后一个使用DL调度器类

4.3 5个调度器类

<<深入理解linux内核>> --进程调度读书笔记_第4张图片

4.4 3个调度实体

调度器不限于调度进程, 还可以调度更大的实体, 比如实现组调度: 可用的CPUI时间首先在一半的进程组(比如, 所有进程按照所有者分组)之间分配, 接下来分配的时间再在组内进行二次分配.

这种一般性要求调度器不直接操作进程, 而是处理可调度实体, 因此需要一个通用的数据结构描述这个调度实体,即seched_entity结构, 其实际上就代表了一个调度对象,可以为一个进程,也可以为一个进程组.
<<深入理解linux内核>> --进程调度读书笔记_第5张图片

4.5 对应关系

<<深入理解linux内核>> --进程调度读书笔记_第6张图片

4.6 小总结:(懂这些就好)

            调度类    调度算法     
                        |---- SCHED_NORMAL  普通进程调度
普通进程   ----   CFS  --|---- SCHED_BATCH  normal的分化
           	            |---- SCHED_IDLE
 
                        |---- SCHED_FIFO  先来先服务
         |----   RT   --|---- SCHED_RR    时间片轮转
 	     |
实时进程	 |
         |----   DL   --|---- SCHED_DEADLINE  新支持的

5. 进程调度

5.1 知识回顾

回顾linux进程队列 运行队列的数据结构
https://blog.csdn.net/jiewaikexue/article/details/109730664

大致结构如下:
<<深入理解linux内核>> --进程调度读书笔记_第7张图片

5.2 普通进程

每个普通进程都有自己的静态优先级
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

<<深入理解linux内核>> --进程调度读书笔记_第8张图片
3.区分交互式进程和批处理进程

bonus>= 静态优先级/4-28+5

bonus大于2 的都是交互式进程

或者

动态优先级<=3* 静态优先级/4+28

该公式等价于上面的

调度算法能够明确的的知道所有实时进程的身份
但是对于普通进程 们就需要通过启发式算法进行区分

批处理进程: cpu繁忙
交互式进程: i/o繁忙

该公式等价于上面的

5.3 实时进程

5.3.1 调度规则

  1. 实时进程禁止低优先级的进程执行
  2. 实时进程做事被当做活动进程(后续介绍)
  3. 如果相同优先级的实时进程,则采取先来先服务策略

第一个出现在本cpu运行队列的相应链表中的进程 ,上cpu

5.3.2 实时进程的取代

  1. 被更高优先级的实时进程抢占
  2. 实时进程阻塞并进入睡眠
  3. 进程停止(TASK_STOPPED) 或者 被杀死(EXIT_ZOMBIE / EXIT_ DEAD)
  4. 通过某些系统调用 自愿放弃cpu
  5. 实时进程采用rt里面的rr(时间片轮转)策略,当时间片用完之后,下cpu…!!! 但是并不进入过期队列

你可能感兴趣的:(apue,深入linux)