• 操作系统概念 线程调度


    查看一个线程的属性:

    在这里插入图片描述


    Scope 属性 : PTHREAD_SCOPE_SYSTEM

    在这里插入图片描述

    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。


    Scheduling_policy 调度策略: SCHED_OTHER

    Scheduling_priority 调度优先级: 0

    在这里插入图片描述
    在这里插入图片描述


    现象查看:

    在这里插入图片描述
    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

  • 相关阅读:
    No module named ‘_ctypes‘ 错误解决
    RHCSA学习笔记(vi编辑器)
    超越创意,从用户创造内容到AI生成内容的新时代
    Linux权限:权限的概念及管理、粘滞位
    使用PWM实现呼吸灯功能
    【leetcode】两句话中的不常见单词 c++
    【Python】函数与模块
    近世代数——Part1 课后题目
    如何使用 J2L3x 提高企业团队协作效率
    Linux 并发与竞争(二)
  • 原文地址:https://blog.csdn.net/weixin_42109053/article/details/127777100