thread 调度
POSIX 定义一种优先级调度模型,此模型确定任何两个线程相对于对方的重要程度。 每当有一个以上的线程可以运行—执行就绪—时,系统都将选择具有最高优先级的线程。
POSIX 线程调度语义是按照一种概念模型定义的,在此概念模型中有一个有效优先级范围,并且有一组线程列表,每个优先级分配有一个列表。根据线程的调度优先级,将 任何可运行的线程放置在其中一个线程列表上。线程列表内的排序取决于调度策略。因此,每个线程都受其调度优先级及其调度策略控制。
调度策略的作用是定义这些线程列表上的操作,如在列表内和列表之间移动线程。 不管策略如何,POSIX 都指定具有最高优先级的线程列表中的第一个线程应为当前运行的线程。
调度线程优先级的能力是 POSIX 标准中的一个选项,由符号 POSIX_THREAD_PRIORITY_SCHEDULING 指定。支持此选项的 POSIX 实现还必须提供给线程指定实时调度策略和优先级的机制。 强制性策略为 SCHED_FIFO、SCHED_RR 和 SCHED_OTHER。
SCHED_FIFO(先进先出)策略按线程在执行前在列表上存在的时间对列表上的线程进行排序。处于列表首位的线程通常为在列表上存在时间最长的线程, 而处于末尾的线程在列表上存在的时间最短。此策略允许一个线程一直运行,直到具有较高优先级的另一个线程已准备好运行,或者直到当前线程自动阻止。如果此 线程被占据,它就继续处于其线程优先级列表的首位;如果此线程阻止,当它再次成为一个可运行的线程时,将被添加到此线程所在的优先级列表的末尾。
SCHED_RR (循环法)策略与 SCHED_FIFO 策略相同,不同的只是运行的线程在被占据之前只能运行有限的时间长度。当超过此固定时限时,运行的线程就被放到线程优先级列表的末尾,而现在处于列表首位 的线程将成为运行的线程。 此策略的作用是确保具有相同优先级的多个 SCHED_RR 线程能共享处理器。
SCHED_OTHER 策略是针对具体实现的,相容的 POSIX 实现必须记录此策略的行为。 一个实施可将此策略定义为与 SCHED_FIFO 或 SCHED_RR 相同,也可以定义为与这两种策略完全不同的策略。 POSIX 定义此类策略的目的是为相容的程序提供一种方法来表明这些程序不需要可移植的实时调度策略。
每种调度策略都有一个优先级的有效范围;对于 SCHED_FIFO 和 SCHED_RR,此范围必须至少是 32,而对于 SCHED_OTHER,此范围是针对具体实现的。 可以从 sched_get_priority_min() 函数和 sched_get_priority_max() 函数确定优先级的范围。
PThread 调度争用范围和分配域
除线程调度策略和线程优先级外,还有其他两种调度控制: 线程调度争用范围和线程调度分配域。
争用范围定义竞争使用处理资源的线程集。 POSIX 定义两个争用范围:系统中的所有线程(或 PTHREAD_SCOPE_SYSTEM)以及一个进程中的所有线程(或 PTHREAD_SCOPE_PROCESS)。
系统争用范围中的一个线程与系统中所有其他线程(包含其他进程中的那些线程)争用资源。 一个进程中的高优先级线程可阻止其他进程中的系统争用范围线程运行。
进程争用范围内的线程在进程内进行调度,这表示只在一个进程内的所有线程间进行调度。 进程争用范围通常表示由操作系统选择要运行的进程,而进程本身包含一个内部调度程序来试图针对进程内的线程实现 POSIX 调度规则
阅读(1281) | 评论(0) | 转发(0) |