Linux 是如何调度进程的?
点击「阅读原文」查看良许原创精品视频。
点击「阅读原文」查看良许原创精品视频。
调度的发展历史
O(1) 调度器:
在 active bitarray 里,寻找 left-most bit 的位置 x。 在 active priority array(APA)中,找到对应队列 APA[x]。 从 APA[x] 中 dequeue 一个 process,dequeue 后,如果 APA[x] 的 queue 为空,那么将 active bitarray 里第 x bit置为 0。 对于当前执行完的 process,重新计算其 priority,然后 enqueue 到 expired priority array(EPA)相应的队里 EPA[priority]。 如果 priority 在 expired bitarray 里对应的 bit 为 0,将其置 1。 如果 active bitarray 全为零,将 active bitarray 和 expired bitarray 交换一下。
CFS 调度器:
权重 = 1024 / 1.25nice(次方)
虚拟时间 = 实际时间 * (1024/进程权重) = (调度周期 * 进程权重 / 所有进程总权重) * (1024 / 进程权重) = 调度周期 * 1024 / 所有进程总权重
总结:谁的vruntime值较小就说明它当前占用cpu的时间较短,受到了“不公平”对待,因此下一个运行进程就是它。这样既能公平选择进程,又能保证高优先级进程获得较多的运行时间。这就是CFS的主要思想了。
CFS维护了一个按照虚拟时间排序的红黑树:
任务存储在以时间为顺序的红黑树中(由 sched_entity 对象表示),对处理器需求最多的任务 (最低虚拟运行时)存储在树的左侧,处理器需求最少的任务(最高虚拟运行时)存储在树的右侧。为了公平,调度器然后选取红黑树最左端的节点调度为下一个以便保持公平性。任务通过将其运行时间添加到虚拟运行时, 说明其占用 CPU 的时间,然后如果可运行,再插回到树中。这样,树左侧的任务就被给予时间运行了,树的内容从右侧迁移到左侧以保持公平。因此,每个可运行的任务都会追赶其他任务以维持整个可运行任务集合的执行平衡。
推荐阅读:
5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!
评论