【问题标题】:Understanding the linux scheduler了解linux调度器
【发布时间】:2011-11-02 00:13:36
【问题描述】:
我是 linux 内核和低级编程的新手。我想知道 linux 调度程序的时间复杂度应该是 O(1)。
我看到了以下文章,它提供了非常丰富的信息,但我在理解下面转载的段落时遇到了问题
http://www.ibm.com/developerworks/linux/library/l-scheduler/
调度器的工作很简单:选择最高层的任务
要执行的优先级列表。为了使这个过程更有效率,一个
位图用于定义任务何时在给定的优先级列表中。
因此,在大多数架构上,find-first-bit-set 指令是
用于查找在五个 32 位字之一中设置的最高优先级位
(对于 140 个优先级)。找到要执行的任务所需的时间
不取决于活动任务的数量,而是取决于
优先事项。这使得 2.6 调度程序成为 O(1) 进程,因为
时间安排是固定的和确定性的,无论
活动任务数。
为什么 140 个队列需要 5 个 32 位的字? find-first-bit-set 指令帮助谁选择 140 个队列中的一个?
【问题讨论】:
标签:
linux
linux-kernel
scheduling
【解决方案1】:
一个位域使用单个值来表示多个布尔状态,例如,如果我们使用一个 8 位整数,那么我们可能会这样说:
17 (decimal) = 00010001 (binary)
这表明第 4 个和第 8 个布尔值是真,而所有其他布尔值都是假的。由于有 8 位,总共可以跟踪 8 个布尔状态。
由于我们希望跟踪 140 个状态(每个队列 1 个,true 表示队列包含一个任务),需要 140 位,因此 140 / 32 = 4.375,我们至少需要 5 个 32 位整数来存储所有布尔状态。
【解决方案2】:
类似这样的:
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