什么是进程优先级?
进程优先级:将处理器资源分配给进程的先后顺序
Linux 中每个进程都有相应的优先级 (优先级可能动态改变)
进程优先级决定进程 何时执行 和 获得处理器的时间
进程优先级通常表现为一个整数值 (数值大小决定优先级高低)
Linux 中的进程类型 (用户观点)
交互型进程
- 表现:较多的人机交互,进程会不断进入阻塞状态,等待用户输入
- 特点:用户输入后,必须被及时唤醒执行处理逻辑
批处理型进程
- 表现:不需要人机交互,在后台执行
- 特点:对时间不敏感,常用于数据处理
Linux 中的进程类型 (内核观点)
普通进程
- 使用完全公平策略进行调度的进程 (SCHED_OTHER)
- 不能保证时间要求严格或高优先级的进程优先执行
实时进程
- 使用 SCHED_FIFO 和 SCHED_RR 进行调度的进程
- 根据进程优先级进行实时调度,在一定程度上保证实时性
进程实时性与优先级
实时性
- 硬实时:对响应时间要求非常严格,必须保证在一定时间内完成
- 软实时:硬实时的弱化形式,可接受一定程序上小概率的超时响应
进程分类
- 普通进程:优先级 [100, 139] => 默认 120,值越小优先级越高
- 实时进程:优先级 [0, 99] => sudo chrt -f 11 ./a.out 值越大优先级越高
细说进程优先级
注意:
- 一般情况下动态优先级等于规范优先级
- 不同之处在于,动态优先级可能暂时被提高
- 对进程的处理都以静态优先级为准
top 命令中的 PR 指什么?
实时进程
- PR = 规范优先级 - 100
- PR = rt => rt_priority == 99
普通进程
- PR = 规范优先级 - 100 + nice_value
再论完全公平策略 (Completely Fair Scheduler)
"完全公平" 并非意味着所有进程获得相等时间片
"完全公平" 指的是所有进程都能获得时间片 (时间片未必相等)
问题:完全公平策略中如何确定进程的执行时间片?
- 引入权重 (weight),进程间按照权重比例分配时间片
- weight = 1024 / (1.25 ^ nice_value)
- nice_value => 取值范围 [-20, 19],默认值为 0,值越高权重越低
nice_value 对于普通的意义
假设 A 和 B 是处理相同计算任务的进程:
- A 进程:nice == 0,则:weight == 1024
- B 进程:nice == 5,则:weight == 335.5432
- 所以:A 进程获取的处理器时间大致是 B 进程的 3 倍
实验设计
父进程创建子进程,并开始复杂计算
子进程设置 nice_value 为 5,并开始复杂计算
期望:父进程占用的处理器时间是子进程 3 倍左右
普通进程 nice_value 接口
#include <sys/time.h>
#include <sys/resource.h>
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);