线程调度策略
调度策略包含许多线程的可能值。
- SCHED_FIFO
- 这种策略的线程被调度后,它会一直运行到结束,除非被阻塞或有一个较高优先级的线程可分派,它将自愿服从处理器的控制。 只有固定优先级的线程才能有 SCHED_FIFO 调度策略。
- SCHED_RR
- 当一个 SCHED_RR 线程在时间片的末尾有控制权时,它将移动到和它具有相同优先级的可分派线程队列的尾部。 只有固定优先级的线程才能有 SCHED_RR 的调度策略。
- SCHED_OTHER
- POSIX 标准 1003.4a 将此策略定义为实施定义。 在每次时钟中断时重新计算运行线程的优先级值,意味着一个线程可能会因为优先级值超过另一个可调度线程而失去控制权。
- SCHED_FIFO2
- 政策与 SCHED_FIFO 相同。 不过,它允许睡眠时间很短的线程在被唤醒时被放在运行队列的最前面。 该时间段为亲和度限制(可通过
schedo -o affinity_lim进行调整)。 - SCHED_FIFO3
- 调度策略设置成 SCHED_FIFO3 的线程总是放置在运行队列的头部。 为防止属于 SCHED_FIFO2 调度策略的线程被置于 SCHED_FIFO3 之前、当 SCHED_FIFO3 线程排队时,运行队列参数将被更改,这样就不会有属于 SCHED_FIFO2 的线程满足使其能够加入运行队列头部的标准。
- SCHED_FIFO4
- 优先级较高的 SCHED_FIFO4 调度类线程不会抢占当前运行的低优先级线程,如果它们的优先级相差 1。 默认情况下,当前在指定 CPU 上运行的低优先级线程会被有资格在同一处理器上运行的高优先级线程抢占。
- waitlock_policy
waitlock_policy 是一个 schedo 可调参数,用于确定唤醒用户锁上睡眠者时必须使用的算法。
以下是 waitlock_policy 可调参数的有效值:- 0:指定传统策略,即搜索等待列表中的所有线程,唤醒优先级最高的线程。
- 1:指定先进先出(FIFO)策略,即唤醒等待列表中的第一个线程。
- 2:指定 QUEUED 策略,在该策略中,除了调用线程的唤醒外,所有其他线程的唤醒都会被阻止,并唤醒高优先级线程或 FIFO 线程(如果也设置了 FIFO (1))。
- 3:指定 QFIFO 策略,在该策略中,除了调用线程的唤醒外,所有其他线程的唤醒都会被阻止,并唤醒 FIFO 线程。
- 4:指定 PRIOQ 策略,在该策略中,除了调用线程的唤醒外,所有其他线程的唤醒都会被阻止,并唤醒等待列表中的第一个线程。
调度策略可用系统调用 thread_setsched() 进行设置并且仅对调用线程有效。 不过,可以通过发出一个指定进程 ID 的 setpri() 系统调用,将线程设置为 SCHED_RR 调度策略。 setpri() 系统调用的调用方和 setpri() 系统调用的目标不必匹配。
只有那些具有 root 权限的进程可以发出 setpri() 系统调用。 只有那些具有 root 权限的线程可将调度策略更改成 任何 SCHED_FIFO 选项或 SCHED_RR。 如果调度策略为 SCHED_OTHER,那么 thread_setsched() 子例程将忽略该优先级参数。
线程的主要优点是适用于当前由多个异步进程组成的应用程序。 这些应用程序可通过转变成多线程结构使得系统中有较轻的负载。