线程调度策略
调度策略包含多种针对线程的可能值。
- 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() 进行设置并且仅对调用线程有效。 然而,通过指定进程标识发出 setpri() 调用可将线程设置成 SCHED_RR 调度策略;setpri() 的调用者和 setpri() 的目标不必匹配。
只有那些具有 root 权限的进程可以发出 setpri() 系统调用。 只有那些具有 root 权限的线程可将调度策略更改成 任何 SCHED_FIFO 选项或 SCHED_RR。 如果调度策略为 SCHED_OTHER,那么 thread_setsched() 子例程将忽略该优先级参数。
线程的主要优点是适用于当前由多个异步进程组成的应用程序。 这些应用程序可通过转变成多线程结构使得系统中有较轻的负载。