实时进程调度策略 ( SCHED_RR & SCHED_FIFO )
在优先级不同的时候,先执行优先级高的进程
当实时进程优先级相同时:
- SCHED_RR 采用的策略是时间片轮转,默认的时间片是 100ms
- SCHED_FIFO 采用的策略是先到先得,先占有处理器的进程会持续执行
深入实时进程优先级
对于实时进程而言,内核模式的优先级与用户模式的优先级并不同
- 对于内核模式,优先级的值越小,优先级越高 (规范优先级)
- 对于用户模式,优先级的值越大,优先级越高 (实时优先级)
换算关系:规范优先级 = MAX_RT_PRIO - 实时优先级 - 1
- 其中:MAX_RT_PRIO 的值为 100
- 换算后优先级范围:[0, 99]
实时进程调度接口
问题:
对于实时进程,设置 nice_value 会发生什么?
有趣的问题
ps -al 命令中的 PRI 指什么?
实时进程
PRI = 规范优先级 - 40 = 59 - rt_priority
普通进程
PRI =?规范优先级 - 40 + nice_value
思考
如何定制实时进程的执行时间?
实现思路
模拟操作系统内核调度器的实现
- 指定目标进程
- 执行目标进程
- 时间片完成,剥夺执行权
- 选择下一个进程执行
实验设计
将父进程设置为实时进程,且实时优先级为 99 (调度器)
创建子进程,默认为普通进程
定义每个子进程的执行时间片
父进程进入循环调度,根据时间片定义改变子进程的调度策略
核心思想:
- 利用实时进程的最高优先级 "实现" 调度器
- 利用 sleep() 函数可使调度器主动 "放弃" 执行权
- 利用优先执行实时进程的调度策略 "指定" 目标进程
?核心代码实现
值得注意的地方
该方法是应用层模拟实现内核中的 "时间片轮询调度"
因此:
- 目标进程仅是获得绝大多数的处理器时间
- 目标进程所获得的时间片不精确于预定义时间