linux内核调度策略SCHED_OTHER,SCHED_FIFO和SCHED_RR

本文介绍了Linux中的三种进程调度策略:SCHED_OTHER、SCHED_FIFO和SCHED_RR,并详细阐述了每种策略的特点及应用场合。对于SCHED_OTHER策略,即使是最底层优先级也能获得一定的时间片;而SCHED_FIFO和SCHED_RR适用于实时进程,高优先级进程可以抢占低优先级进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要是看了大神的这篇文章:http://blog.chinaunix.net/uid-24774106-id-3379478.html
自己稍作总结而已。

跟进程调度策略相关的代码为:

//调度策略
#define SCHED_OTHER 0
#define SCHED_FIFO 1
#define SCHED_RR 2
#ifdef __USE_GNU
# define SCHED_BATCH 3
#endif

struct sched_param {
/* ... */
int sched_priority;  //优先级
/* ... */
};

//设置进程的调度策略和优先级
//第一个参数为进程pid;
//第二个参数为调度策略;
//第三个参数为优先级;
int sched_setscheduler (pid_t pid,
                        int policy,
                        const struct sched_param *sp);

SCHED_OTHER表示普通进程,对于普通进程,第三个参数sp->sched_priority只能是0
SCHED_FIFO 和SCHED_RR表示实时进程的调度策略,第三个参数的取值范围为[1,99]。
如果sched_setscheduler 优先级设置的值和调度策略不符合的话,会返回失败的。

下面是这三个调度策略的总结:
1.对于SCHED_OTHER,即普通进程调度策略,它应该是基于CFS, 它的特点是即使是最低优先级,他也能获得一定的时间片(这个自己还不太清楚,印象中在《深入理解linux内核》中有讲过,有空再看吧)。
2.SCHED_FIFO:高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出;对于同等优先级,先运行的进程会一直占据cpu, 只有等到先运行的进程主动退出,后续进程才能得到时间片。
3.SCHED_RR: 同上,高优先级会抢占低优先级,高优先级运行期间,低优先级没法抢占,只能等到高优先级主动退出, ;对于同等优先级的进程,各个进程会轮流运行一定的时间片(大约100ms)。

<think>好的,用户想了解SCHED_FIFOSCHED_RR这两种Linux实时调度策略的区别用法。首先,我需要回顾一下这两种策略的基本概念。SCHED_FIFO是先进先出的调度方式,而SCHED_RR则是轮转调度。它们的共同点在于都是实时策略,优先级高于普通进程,但具体调度机制不同。 根据引用[1],当这两种策略同时存在时,调度顺序会如何呢?我记得优先级高的线程会先执行,而相同优先级的情况下,SCHED_FIFO会一直运行直到主动让出,而SCHED_RR会有时间片轮转。这点需要确认,引用[3]中提到,如果t0t1都是FIFORR,并且优先级相同,那么FIFO会一直占用CPU,而RR则会分时间片。 接下来要比较两者的区别。首先是调度方式,FIFO没有时间片,一旦运行直到阻塞或主动释放;RR有时间片,用完后会被放到队列尾部,让同优先级的其他线程运行。然后是抢占规则,两者都是优先级高的抢占低的,但RR在同优先级下会轮转。适用场景方面,FIFO适合不能被打断的任务,RR适合需要公平性的实时任务。 用法方面,用户可以通过set_fifoset_rr函数设置,注意优先级范围。引用[1]提到设置时需传入优先级参数,需要确保在有效范围内(1-99)。同时要注意,使用这些策略需要权限,通常需要root或者CAP_SYS_NICE能力。 可能还需要提到如何选择这两种策略,比如对响应时间要求极高的用FIFO,而需要避免饥饿问题的用RR。此外,引用[2][3]中的例子可以帮助说明多线程情况下的调度行为,比如隔离CPU或者优先级混合时的处理。 最后要检查是否覆盖了用户的问题,是否结构清晰,是否需要生成相关问题。用户可能需要进一步了解如何设置优先级,或者实际应用中的配置例子,以及性能影响等。确保回答中引用了提供的资料,比如在说明调度规则时引用[3]的例子。</think>### SCHED_FIFO vs SCHED_RR 区别与用法解析 #### 1. **核心区别** - **SCHED_FIFO(先进先出)** - **调度规则**:同一优先级的线程按队列顺序执行,**无时间片限制**。一旦占用CPU,除非主动让出(如阻塞、调用`sched_yield()`或被更高优先级线程抢占),否则会一直运行[^3]。 - **适用场景**:对响应时间要求极严格的实时任务(如工业控制系统)。 - **示例代码**: ```c set_fifo(90); // 设置为SCHED_FIFO,优先级90 ``` - **SCHED_RR(轮转调度)** - **调度规则**:同一优先级的线程按**时间片轮转**分配CPU。时间片耗尽后,线程被移到队列尾部,同优先级其他线程依次运行。 - **适用场景**:需要兼顾公平性的实时任务(如音视频流处理)。 - **示例代码**: ```c set_rr(85); // 设置为SCHED_RR,优先级85 ``` #### 2. **共同特性** - **实时优先级范围**:1~99(数值越大优先级越高),均高于普通进程(`SCHED_OTHER`)[^1][^2]。 - **抢占规则**:高优先级线程可抢占低优先级线程,无论其调度策略如何。 #### 3. **混合场景下的调度行为** 假设CPU0上有以下线程: - 线程A:优先级99,`SCHED_FIFO` - 线程B:优先级99,`SCHED_RR` - 线程C:优先级80,`SCHED_FIFO` 调度顺序: 1. 线程AB优先级相同,但A使用`SCHED_FIFO`,会持续占用CPU直到主动让出。 2. 线程B(`SCHED_RR`)仅在A让出后,才与其共享时间片轮转。 3. 线程C因优先级低,始终无法执行,除非AB均阻塞。 #### 4. **使用注意事项** - **权限要求**:需root权限或`CAP_SYS_NICE`能力[^1]。 - **优先级配置**:避免低优先级实时线程因高优先级线程饥饿(可通过`isolcpus`隔离CPU核心)[^2]。 - **时间片设置**:`SCHED_RR`时间片长度由`/proc/sys/kernel/sched_rr_timeslice_ms`定义(默认100ms)。 #### 5. **典型应用场景** - **SCHED_FIFO**:实时控制信号处理、硬件中断响应。 - **SCHED_RR**:多路实时数据采集、并行实时计算任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值