我是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个队列中的一个?
答案 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