linux优先级理解

发布时间:2026/10/31 1:58:31
linux优先级理解

Linux会把所有进程的线程放在同一个调度池中统一看待,是按照线程的优先级来确定下一个该跑谁。每个线程都是一个task_struct。

优先级调度策略调度算法
0-99实时进程SCHED_RR , SCHED_FIFO
100-139普通进程SCHED_OTHER

对内核来说,优先级值越小,优先级越高。

  1. SCHED_FIFO
    先来先服务原则,当线程占用cpu时,只有主动让出或被高优先级抢占才会让出cpu
  2. SCHED_RR
    时间片轮询,在SCHED_FIFO的基础上增加了最多运行时间的限制,同一优先级的线程会依次执行
  3. SCHED_OTHER
    完全公平调度算法,根据优先级映射权重,根据权重分配cpu运行时间。Linux的默认调度策略。

对于用户层来说,在设置线程优先级时,优先级值越大,优先级越高。(因为会做转换)

  • 实时任务
    kernel_priority = 100 - 1 - val,val是程序中设置的线程优先级值,范围0-99,调度方式可设为RR或者FIFO
  • 普通任务
    kernel_priority = 120 + nice; nice是程序中设置的线程优先级值,范围-20-19,调度方式只能是OTHER

对于实时任务来说,优先级永远高于普通进程;普通进程通过nice值设置静态优先级后,内核会根据实际情况调整动态优先级。

linux的默认调度策略是SCHED_OTHER。

在使用实时调度策略时,需要注意优先级反转问题。线程H M L,低优先级L先抢占了锁,H就绪抢占了CPU也需要访问锁,H被锁阻塞,M线程开始执行。造成优先级反转。

死锁问题: