

scope 有两种类型:
1)PTHREAD_SCOPE_SYSTEM: 在系统范围内的调度,简称 SCS;
2)PTHREAD_SCOPE_PROCESS: 在当前进程范围内的调度,简称 PCS;

SCS:
当前系统内有两个进程 P1 和 P2,P1 有 2 个线程,P2 有 3 个线程。这 5 个线程在同一时刻被调度算法调度,从而决定 5 个线程中的 1 个线程占用 CPU ,这就是 系统范围内的调度。
PCS:
当前系统内有两个进程 P1 和 P2,P1 有 2 个线程,P2 有 3 个线程。在同一时刻,只能是 P1 进程,或者 P2 进程占用 CPU;在决定某个进程占用 CPU 之后,再利用调度算法,决定进程中的哪一个线程得到执行,占用 CPU。这就是 进程范围内的调度。
所以,Linux 系统中,默认的线程调度算法是:PTHREAD_SCOPE_SYSTEM;
Linux 系统的 用户线程(ULT)和内核线程(KLT)的模型是 1:1模型,正好对应 PTHREAD_SCOPE_SYSTEM。


现象查看:

LWP = Light Weight Process,即线程,可以看到当前进程中创建了 2 个线程,线程 ID 分别为:35605, 35606;
NLWP = Number LMP,即线程数量,当前进程一共创建了 2 个线程;

Normal 调度:SCHED_OTHER,SCHED_IDLE, SCHED_BATCH,这种调度的优先级必须是 0;
Real-time 调度:SCHED_FIFO,SCHED_RR,优先级为 【1,99】;real-time threads always have higher priority than normal threads.
ps -eLf 命令,可以观察多线程的 tid 的数量。

SCHER_OTHER:称为 Normal Scheduling,一般线程默认采用的调度策略,该策略是基于时间片轮转的算法。
SCHER_RR:属于 Real-Time Scheduling,表示那些要求实时性高,很紧迫,很紧急的系统任务的线程,就需要采用实时调度算法。
因此,只要是 Real-Time Scheduling 的线程,优先级是比 Normal Scheduling 的线程要高的。
Normal Scheduling 的调度算法优先级,不是叫 priority_value, 而是取决于一个 NICE 友好值(NICE 默认值为 0),真正用到的优先级变量,称为 PR 值,PR值越高的线程,优先级越低,PR值的取值范围是 【0, 39】。
注意:NICE 表示友好。NICE值越高,代表越大度、友善,表示希望把自己的 CPU 让出来,即优先级越低。
实例:




1)命令 top -p pid:显示的 PR 和 NI 值,仅对 Normal 调度算法有效。
2)Normal 调度和 Real-Time 调度的 PR 值,计算公式不一样:Normal 调度的 PR 取值范围为 【0, 39】,Real-Time 调度的 PR 取值范围为 【-100, -2】。
3)通过 Normal 调度 和 Real-Time 调度的 PR 值画出区间轴,可以看到,完全符合 Linux 线程优先级的规律:PR 值越小,优先级越高。
即 Real-Time 调度 的线程,优先级高于 Normal 调度 的线程。

所以, PR 显示为 rt 的线程,它的优先级实际为 -100。

使用命令 chrt -p pid 可以查看一个线程的priority_value 信息。
可以使用命令,将线程从 Normal 调度切换为 Real-Time 调度:sudo chrt -f -p 11 pid。
其中:
-f :该参数表示设置为 SCHED_FIFO;-r 则设置为 SCHED_RR;
11:数字11,代表 priority_value,可取值为【1, 99】;
pid :设置的线程 ID;
实例演练:


1)Normal 调度,属于抢占式调度,基于分时系统和动态优先级,进行调度策略。动态优先级依靠 NICE 值进行调节。
如果一个线程在就绪队列或者运行状态的时间越长,其线程的 NICE 值会发生变化。NICE 默认值是 0。
NICE 表示友好。NICE值越高,代表越大度、友善,表示希望把自己的 CPU 让出来,即优先级越低。
2) Real-Time 调度,属于抢占式调度。
Real-Time 线程优先于 Normal 线程执行。
多个 Real-Time 线程:
1)SCHED_FIFO:优先级高的先运行;优先级相同的线程,谁先到达,谁先运行。
2)SCHED_RR:优先级高的先运行;优先级相同的线程,分时轮转。
3)正在运行的Real-Time 线程,都会被优先级更高的 Real-Time 线程抢占 CPU。
注:源自B站up主:Y4NGY