设为首页 加入收藏

TOP

6.4.3 调度策略和优先级
2013-10-07 12:59:11 来源: 作者: 【 】 浏览:59
Tags:6.4.3 调度 策略 优先

6.4.3  调度策略和优先级

进程的调度策略和优先级属于主线程。每个线程可以有着与主线程不同的调度策略和优先级。优先级是拥有最大值和最小值的整数。当区分线程优先次序时,系统中要求立即执行或响应的任务会优先。在一个抢占式的操作系统中,如果有更高优先级(数字越小,优先级越高)而且竞争范围相同的线程可运行,则正在执行的线程会被抢占。

例如,在图6-3中,进程A有两个优先级为3的线程(2和3),还有一个优先级为4的线程(1)。它们被分配到处理器内核0和1上。优先级为4和3的线程是可运行的,每个线程被分配到一个处理器上。一旦优先级为3的线程3变为活动的,则线程1会被抢占,线程3被分配到处理器。在进程B中,有一个线程有着进程竞争范围,而且它的优先级为1。进程B只有一个可用处理器。有着系统竞争范围的线程不会被进程A或B中任何有着进程竞争范围的线程抢占。它们只和其他有着系统竞争范围的线程争夺处理器的使用。

就绪队列被组织为有序列表,其中每个元素是一个优先级。这在第5章中也讨论过。在第5章中,图5-6显示了就绪队列。列表中每个优先级是有着相同优先级的线程的队列。所有有着相同优先级的线程使用调度策略被分配到处理器上,调度策略为FIFO、RR或其他策略。

轮询(RR)调度策略认为所有线程有着相等的优先权,而且只让每个线程在一个时间片内使用处理器。任务的执行是交错的。例如,一个从文本文件中筛选字符的程序被分成3个线程。主线程为线程1,它从文件中读入每一行,然后将读入的内容作为字符串写入到向量中。然后主线程创建3个线程并等待这些线程返回。每个线程有着自己的字符集,它们要将属于该字符集的字符从字符串中删除掉。每个线程利用两个队列,一个队列包含之前已经被另一个线程筛选过的字符串。一旦线程已经筛选了一个字符串,就会将结果写入到第二个队列。队列是全局数据。主线程位于就绪队列中,它可抢占地运行,直到创建了其他线程,然后会休眠,直到所有线程返回。其他的线程有着相等的优先级,而且使用轮询调度策略。线程不能够筛选尚未写到队列中的字符串,因此需要对源队列的访问进行同步。线程测试互斥量,如果互斥量被加锁,那么没有可用的字符串,或者源队列正在被使用。线程必须等待,直到互斥量被解锁。如果互斥量可用,则源队列中有字符串,而且源队列没有被使用。从队列中读取一个字符串,然后线程对字符串进行筛选,并将它写入到输出队列。输出队列作为另一个线程的源队列。在将来某个时刻,线程2被分配到处理器。它的源是包含所有将要被筛选的字符串的向量。线程1必须筛选字符串,然后将筛选过的字符串写入到它的输出队列,这样线程2才有要处理的内容,然后是线程3,等等。RR调度影响有着两个处理器内核的线程的执行。这种调度策略抑制了这个程序的适当执行。我们将在本章后面讨论使用正确的并发模型。

如果使用的是FIFO调度策略,而且优先权较高,则这些任务的执行不会发生交错。分配到处理器上的线程会一直占有处理器,直到它的执行结束。这种调度策略可用于有一组线程需要尽可能快地完成的应用程序。

"其他"调度策略可以是一种定制的调度策略。例如,FIFO调度策略可以被定制为允许线程随机解除阻塞,或者您可以使用能够加速线程执行的适当调度的策略。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇6.7.3 设置线程调度和优先级 下一篇6.7.4 设置线程的竞争范围

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: