了解linux调度程序

时间:2011-08-23 14:14:44

标签: linux linux-kernel scheduling

我是linux内核和低级编程的新手。我想知道linux调度程序在时间复杂度上应该是O(1)。

我看到以下文章内容非常丰富,但我在理解下面转载的段落时遇到了问题 http://www.ibm.com/developerworks/linux/library/l-scheduler/

  

调度程序的工作很简单:选择最高的任务   要执行的优先级列表。为了使这个过程更有效,a   位图用于定义任务何时在给定优先级列表上。   因此,在大多数体系结构中,查找第一位集指令是   用于在五个32位字之一中找到设置的最高优先级位   (针对140个优先事项)。查找要执行的任务所需的时间   取决于活动任务的数量而不是数量   优先级。这使2.6调度程序成为O(1)进程,因为   无论如何,安排时间都是固定的和确定的   活动任务的数量。

为什么140个队列中有5个32位的字? find-first-bit-set指令有助于选择140个队列中的一个?

2 个答案:

答案 0 :(得分:4)

位字段使用单个值来表示多个布尔状态,例如,如果我们使用的是8位整数,那么我们可能会这样说:

17 (decimal) = 00010001 (binary)

这表示第4和第8个布尔值为true,其中所有其他布尔值均为false。总共可以跟踪8个布尔状态,因为有8位。

由于我们希望跟踪140个状态(每个队列1个,true表示队列包含任务),需要140位,因此140/32 = 4.375,我们需要至少5个32位整数来存储所有队列布尔状态。

答案 1 :(得分:0)

这样的事情:

int bitmap_idx = priority/BITS_PER_WORD;
int bitmap_bit = priority%BITS_PER_WORD;

isSet = ( bitmap[bitmap_idx]&(1<<bitmap_bit) );  //test
bitmap[bitmap_idx] |= 1<<bitmap_bit;             //set

用于使用优先级数组到达特定进程,这就是调度程序中使用位图的方式,而调度程序依赖于struct prio_array

你指出的文章已经过时了 http://www.informit.com/articles/article.aspx?p=101760&seqNum=2