sched_getaffinity和pthread_getaffinity_np的区别

sched_getaffinity和pthread_getaffinity_np都是绑核的函数,网上都说sched_getaffinity是用来绑定进程的,pthread_getaffinity_np是用来绑定线程的。但是我们知道,绑定进程从本质上来讲,也是绑定线程,那这两个有什么区别呢?

可以发现,这两个方法传入的第一个参数是不一样的,sched_getaffinity传入的是进程ID,pthread_getaffinity_np传入的是线程ID。也就是说,一个线程会有两个ID,一个叫进程ID,一个叫线程ID,进程ID在内核中是独立的,由内核维护,线程ID在进程中是独立的,由进程维护。进程ID在不同进程间是有效的,这意味着你可以在进程中修改其他进程的属性,而线程ID无法在不同进程间共享。所以这两个函数最大的区别是,你可以在进程a调用sched_getaffinity修改掉进程b中的某个线程的绑定核。

补充一点,在linux中,线程是在原进程中clone出来的新进程中运行的,和原进程共享内存。所以这也是线程有进程ID的原因。

转载于:https://www.cnblogs.com/scaugsh/p/10193436.html

<think>好的,用户想了解SCHED_FIFOSCHED_RR这两种Linux实时调度策略的区别用法。首先,我需要回顾一下这两种策略的基本概念。SCHED_FIFO是先进先出的调度方式,而SCHED_RR则是轮转调度。它们的共同点在于都是实时策略,优先级高于普通进程,但具体调度机制不同。 根据引用[1],当这两种策略同时存在时,调度顺序会如何呢?我记得优先级高的线程会先执行,而相同优先级的情况下,SCHED_FIFO会一直运行直到主动让出,而SCHED_RR会有时间片轮转。这点需要确认,引用[3]中提到,如果t0t1都是FIFO或RR,并且优先级相同,那么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、付费专栏及课程。

余额充值