2. pthreads特征综述 |
pthreads定义一个策略和提供一个机制,以控制线索到处理器的映射。对于调度机制有两个方面。一个用来设置由调度策略所应用的范围。另一个说明在所给策略域内的策略。
一个线索的调度范围可以是PTHREAD-SCOPE-SYSTEM或者PTHREAD-SCOPE-PROCESS。带有不同范围状态的线索,可以在同一系统上甚至在同一进程中共存。如果说明了PTHREAD-SCOPE-SYSTEM,那么此组线索按照一个单一策略竞争处理器资源。如果PTHREAD-SCOPE-PROCESS为真,那么共享此状态的进程内的所有线索按照一个单一策略竞争处理器资源。在其它进程中的线索,它的状态也是PTHREAD-SCOPE-PROCESS,它们独立于此策略,而遵照它们自己的策略。应该注意,在THREAD-SCOPE-SYSTEM中创建pthreads的线索,等价于在THR-BOUND状态中创建一个Solaris线索。
有三种可能的调度策略。它们是SCHED-FIFO、SCHED-RR、SCHED-OTHER。SCHED-FIFO是指一个简单的队列调度序列器。将每一线索赋予一个优先级;一个队列由每一优先级相连。当所给优先级的线索变成可运行时,将它们标识在队列的尾部。它们按顺序移到队列的头部,在哪里将它们调度到下一个可获得的处理单元(假设没有更高的优先级线索)。
SCHED-RR是指一个循环(round-robin)算法。此循环(round-robin)算法与FIFO算法一样,除了一个时间限额与每一线索相连。时间限额到期的一个正在运行的线索,移到它运行队列的尾部。
注意 - SCHED-OTHER是当前唯一的在SunSoft pthreads实现中支持的调度策略。Solaris线索实现没有多个调度策略;它仅有一个缺省的策略。在pthreads(POSIX)中的SCHED-OTHER策略与现在在Solaris线索中支持的缺省策略相同。有关此策略的详细信息参考Solaris线索文档。
暗含在FIFO和循环(round-robin)算法中的策略是能够处理优先级倒转。当有些更高优先级线索阻塞以等待由低优先级所保持的资源时,发生优先级倒转。当不同优先级的线索竞争一个交互锁的所有权时,此问题可以表现出来。为了缓和优先级倒转,pthreads为交互锁定义了三种调度类:PTHREAD_PRIO_NONE, PTHREAD_PRIO_INHERIT, PTHREAD_PRIO_PROTECT。
用PTHREAD_PRIO_NONE类属性创建的交互锁,忽略线索优先级。如果带有更高优先级的其它线索阻塞在交互锁上,用PTHREAD_PRIO_INHERIT创建的交互锁,使保持它的线索的优先级升级。暂时升级的线索,以带有最高优先级的线索的优先级运行,此最高优先级线索当前阻塞在交互锁上。同样推广此影响,使得所有低优先级线索继承被阻塞线索的优先级,此线索保持交互锁,从而阻塞高优先级线索的进程。
用PTHREAD_PRIO_PROTECT类属性创建的交互锁,被赋予一个优先级。任何保持此交互锁的线索将继承那个优先级,只要它自己的优先级低于交互锁的优先级。如果一个线索保持多于一个的在PTHREAD_PRIO_PROTECT状态中初始化的交互锁,那么它将会继承由任何交互锁指出的最高优先级。
这个优先级继承策略应用于FIFO的上下文或者RR调度。
通过先初始化一个线索属性对象,然后创建一个引用那个属性对象的线索,使得线索得到一个调度状态。传统上,约定当创建一个线索以拥有它时,继承它的父亲的状态。pthreads允许通过设置一个属性值,来配置优先级赋值方式。如果属性对象设置为PTHREAD-INHERIT-SCHED,那么新线索的优先级将与父亲一致。如果它设置为PTHREAD-EXPLICIT-SCHED,那么按照在线索属性对象中说明的优先级设置状态。
Copyright: NPACT |