Linux 进程调度与优先级

1. 调度策略

/*
 * Scheduling policies
 */
#define SCHED_NORMAL		0
#define SCHED_FIFO		1
#define SCHED_RR		2
#define SCHED_BATCH		3
/* SCHED_ISO: reserved but not implemented yet */
#define SCHED_IDLE		5
#define SCHED_DEADLINE		6
  • SCHED_FIFO
    • 先进先出,不使用时间片,一直运行直到有更高优先级(SCHED_FIFO或SCHED_RR)任务到达或自己放弃;
    • SCHED_FIFO级任务比任何SCHED_NORMAL级任务都优先得到调度;
    • 多个通优先级的SCHED_FIFO任务轮流执行,只有运行任务主动让出,同优先级的任务才可以执行;
    • 只要有SCHED_FIFO任务执行,其他级别较低的任务就只能等待它变为不可运行态才有机会运行;
  • SCHED_RR
    • 有时间片,可以理解为带有时间片的SCHED_FIFO;
    • 当时间片耗尽,同一优先级的其他实时任务被轮流调度;
    • 时间片只能用来重新调度同一优先级进程;
    • 对于SCHED_FIFO进程, 优先级总是立即抢占低优先级,但低优先级进程决不能抢占SCHED_RR任务即使它的时间片耗尽
  • SCHED_DEADLINE
    • 新支持的实时调度策略,针对突发型计算,且对延迟和完成时间高度敏感的任务适用;
    • 基于Earliest Deadline First (EDF) 调度算法
  • SCHED_NORMAL(SCHED_OTHER)
    • 普通进程,分时调度策略, 非实时,目前采用CFS调度算法;
  • SCHED_BATCH
    • 普通进程策略的分化版本;
    • 采用分时策略,用于非交互的处理器消耗型进程;
  • SCHED_IDLE
    • 优先级最低,在系统空闲时才跑这类进程

2. 优先级

//prio.h
#define MAX_USER_RT_PRIO	100
#define MAX_RT_PRIO		MAX_USER_RT_PRIO
  • 内核优先级
    • 数值越小,任务优先级越高;
    • 实时任务优先级0~99;
    • 普通任务共享取值空间,优先级范围100~139,对应nice值为-20~19;
    • 普通任务采用CFS调度算法, nice值不代表优先级,表示获取CPU的权重;

 

  • 混乱的优先级

static_prio静态优先级,取值100 ~ 139,对非实时进程有效,通过nice系统调用来进行修改
rt_priority实时优先级,取值0~99,只对实时进程有效
normal_prio归一化优先级,其值取决于静态优先级和调度策略
prio动态优先级,取值0 ~ 139,调度器最终使用

 

 

 

 

 

  • static_prio:
    • 不会随时间改变,内核不会主动修改它,只能通过系统调用 nice 去修改 static_prio;
    • static_prio = MAX_RT_PRIO + nice +20;
  • rt_priority:
    • 取值 0 ~ 99,与用户空间取值一致;
  • normal_prio:
    • 取值取决于静态优先级和调度策略;
    • 实时进程: normal_prio = MAX_RT_PRIO -1 - p->rt_priority;
    • 非实时进程:normal_prio = static_prio;
  • prio:
    • 调度器选择进程时最终使用的优先级数值,prio 值越小,表明进程的优先级越高;
    • 实时进程:prio = MAX_RT_PRIO -1 - p->rt_priority;
    • 非实时进程:prio = static_prio;
  • 优先级转换
    • 实时进程
      • 用户态,优先级数值越大,优先级越高, 用户态 = 99 - 内核态;
      • 内核态,prio数值越小,优先级越高, 内核态 = 99 - 用户态;
    • 实时进程优先级设置5
// 1)
sudo nice -n 5 ./test
// 2)
sudo renice -5 -p 5500 
// 3)
nice() 系统调用
  • top 优先级 (PR和NI显示)
    • 实时进程 :TOP 中 PR = -1 - 用户视角; 用户99优先级, PR 显示 rt, (实时进程NI都为0);
    • 普通进程:NI为用户设置,NI默认为0, PR默认为20; PR = 20 + NI;
用户内核top(PR/NI)
RT 6534-35(-1 - 34)0
RT 990rt0
普通 NICE 0 (默认) 200
普通 NICE 5 25 (20 + 5)5
普通 NICE -5 15 (20 -5)-5

 

 

 

 

 

 

 

  • 实时进程门限,period时间内rt进程运行时间runtime
/proc/sys/kernel/sched_rt_period_us
/proc/sys/kernel/sched_rt_runtime_us

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值