CFS调度程序根据最小虚拟时间选择下一个进程,并使用红黑树(rbtree)有效地获取该值,使用rbtree我们将得到最小值O(h),其中h是rbtree的高度。但是,使用min-heap我们只能在O(1)时间内获得最小虚拟时间进程。我只是想知道为什么在CFS实现中不考虑min-heap并且在内核级别使用min-heap有什么困难吗?
答案 0 :(得分:3)
原因是:堆是基于数组的,因此需要内核空间中的连续内存。这是因为在Linux中实现堆的方式。查看文件lib/prio_heap.c
和include/linux/prio_heap.h
,您将注意到kmalloc
堆使用heap_init
。一旦多编程空间变得庞大,维护数千struct sched_entity
需要大量的连续空间(它在几页中运行)。从时间和性能的角度来看,人们更喜欢堆,因为一旦选择了最小vruntime
,但是它可以在后台运行,但是它的空间要求会成为瓶颈。
由于rbtree
随时可用,内核开发人员并没有考虑实现基于指针的堆,实际上并不需要。
答案 1 :(得分:0)
另一个有趣的一点是,考虑到您有一个任务(进程或线程)将状态从可运行状态更改为阻止状态(等待io或网络资源),那么您需要将该任务从运行队列中删除 >的复杂性是:
堆的删除操作很慢,这就是为什么红黑树更好的原因。
当我们获得最小vruntime时,堆操作实际上不是O(1),仅当您引用根节点而不删除它时才发生O(1)。但是在CFS中,我们需要