【问题标题】: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

      【讨论】:

      • 谢谢。我的问题很老了,我的答案很好。
      猜你喜欢
      • 2013-10-20
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多