CFS调度程序使用红黑树的原因是什么?

时间:2015-10-17 20:10:44

标签: linux-kernel scheduler red-black-tree

CFS调度程序根据最小虚拟时间选择下一个进程,并使用红黑树(rbtree)有效地获取该值,使用rbtree我们将得到最小值O(h),其中h是rbtree的高度。但是,使用min-heap我们只能在O(1)时间内获得最小虚拟时间进程。我只是想知道为什么在CFS实现中不考虑min-heap并且在内核级别使用min-heap有什么困难吗?

2 个答案:

答案 0 :(得分:3)

原因是:堆是基于数组的,因此需要内核空间中的连续内存。这是因为在Linux中实现堆的方式。查看文件lib/prio_heap.cinclude/linux/prio_heap.h,您将注意到kmalloc堆使用heap_init。一旦多编程空间变得庞大,维护数千struct sched_entity需要大量的连续空间(它在几页中运行)。从时间和性能的角度来看,人们更喜欢堆,因为一旦选择了最小vruntime,但是它可以在后台运行,但是它的空间要求会成为瓶颈。

由于rbtree随时可用,内核开发人员并没有考虑实现基于指针的堆,实际上并不需要。

答案 1 :(得分:0)

另一个有趣的一点是,考虑到您有一个任务(进程或线程)将状态从可运行状态更改为阻止状态(等待io或网络资源),那么您需要将该任务从运行队列中删除 >的复杂性是:

  • 红黑树的O(log(n))
  • 堆的O(n)

堆的删除操作很慢,这就是为什么红黑树更好的原因。

当我们获得最小vruntime时,堆操作实际上不是O(1),仅当您引用根节点而不删除它时才发生O(1)。但是在CFS中,我们需要

  • 将其删除(这需要对O(log(n))进行堆放)
  • 更新vruntime,并将其重新插入也需要O(log(n))的运行队列中