linux-kernel - 为什么CFS调度器使用红黑树?

标签 linux-kernel scheduler red-black-tree

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

最佳答案

原因是:堆是基于数组的,因此需要内核空间中的连续内存。这是因为 Linux 中堆的实现方式。请参阅文件lib/prio_heap.cinclude/linux/prio_heap.h你会注意到堆是 kmalloc使用heap_init 。一旦多道编程空间变得巨大,需要维护数千个struct sched_entity需要大量连续空间(它在多个页面中运行)。从时间和性能的角度来看,人们更喜欢堆,因为 hepify 操作可以在后台运行一分钟 vruntime已被选中,但空间要求造成了瓶颈。

rbtree很容易获得,内核开发人员没有想到实现基于指针的堆,事实上也不需要。

关于linux-kernel - 为什么CFS调度器使用红黑树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33191110/

相关文章:

c++ - 在删除和重新插入元素时遍历树

linux - packet_ops_spkt 和 packet_ops 有什么区别

linux - 在 epoll 被阻塞时添加/删除 fd

android 手机通过 USB 端口安装桌面分区(磁盘级别的反向 USB 网络共享?)

mysql - 有没有办法在 mysql 5.0 及更早版本上安排 mysql 事件?

hashtable - 哈希表 v 自平衡搜索树

linux-kernel - 是否有任何内核工具可用于以合理的精度测量中断延迟?

linux - 更改 I/O 调度程序不使用 sd* 来引用磁盘

ruby-on-rails - 如何监控由 heroku 调度程序运行的循环 rake 任务?

algorithm - 我可以将红黑树表示为二叉叶树吗?