📜  完全公平的调度程序(CFS)和“脑干调度程序”(BFS)

📅  最后修改于: 2021-08-27 04:57:51             🧑  作者: Mango

先决条件– CPU调度
完全公平调度程序(CFS)和Brain Fuck调度程序(BFS)是Linux当前使用的两个不同的进程调度程序。

流程计划–
由于将任何程序作为进程加载到RAM中,然后CPU根据进程的优先级执行该进程。

1.完全公平的调度程序(CFS):

  • 它基于旋转楼梯最后期限调度程序(RSDL)。
  • 从2.6.23版开始,这是默认的调度过程。
  • 优雅地处理I / O和CPU绑定进程。

顾名思义,它公平地或平均地将CPU时间分配给所有进程。在了解CFS之前,让我们先看一下N个进程的理想公平调度(IFS)。如果就绪队列中有N个进程,则根据IFS,每个进程将获得(100 / N)%的CPU时间。

让我们接受四个进程及其突发时间,如下所示,在就绪队列中等待执行。

Process Burst Time (in ms)
A 10
B 6
C 14
D 6

花费4ms的时间。最初,准备就绪队列中有四个等待执行的进程,根据理想均衡调度,每个进程的执行时间均相等(时间量/ N)。

因此4/4 = 1每个进程在第一个量子中执行1ms即可执行。在完成六个量子过程之后,B和D被完全执行,其余的是A和C,它们已经执行了6ms,它们的剩余时间为A = 4ms和C = 8ms。

在第七个时间段中,A和C将执行(4/2 = 2ms,因为仅剩下两个过程)。这是理想的公平调度,其中每个进程无论其优先级如何均等地分配时间量。

以下是IFS的表说明。
Q:表示时间量为4ms。

Process Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9
A 1 1 1 1 1 1 2 2
B 1 1 1 1 1 1
C 1 1 1 1 1 1 2 2 4
D 1 1 1 1 1 1

CFS与基于理想的调度类似,但是CFS根据虚拟运行时间对每个进程进行优先级排序。

粮安委背后的想法–

  • 每个可运行过程在PCB(过程控制块)中都有一个与之关联的虚拟时间。
  • 每当上下文切换发生时(或在每个调度点),当前运行的进程虚拟时间都会增加virtualruntime_currprocess + = T。
    其中T是最近执行的时间。
  • 因此,该过程的运行时间单调增加。

因此,最初每个进程都有一些开始的虚拟时间(您可以在Google上查询最初的虚拟运行时间是如何计算的)。

CFS是用于过程调度的非常简单的算法,它是使用RED BLACK树而不是队列来实现的。
因此,主内存上的所有进程都被插入到Red Black树中,并且每当有新进程出现时,就会将其插入树中。众所周知,红黑树是自平衡二进制搜索树。

在C++中,我们可以在STL中使用映射,因为它们是使用红黑树实现的。

现在,每当有上下文切换发生时–

  • 如上所述,正在执行的当前进程的虚拟时间被更新。
  • 确定了具有最低虚拟时间的新过程,并且我们知道这是Red Black树的最左侧节点。
  • 如果当前进程仍有一些突发时间,则将其插入Red Balck树。

因此,通过这种方式,每个进程都获得了公平的执行时间,因为在每次上下文切换之后,进程的虚拟时间都会增加,因此优先级会降低。

CFS的时间复杂度分析–

  1. 插入红黑树需要O(logn)。
  2. 找到一个虚拟时间最少的节点是O(1),因为我们可以维护一个指针(在地图中,我们可以使用auto it = map.begin())。
So overall time complexity is O(logn) 

这里先创建了红黑树,然后有一个N个进程的红黑树,所以调度时间复杂度为O(logn)。

使用RED黑树的另一个优点是,如果某个进程受I / O约束,那么它的虚拟时间将大大减少,并且它显示为Red Black树中最左边的节点,因此首先执行。因此,CFS可以轻松找出受I / O约束和受CPU约束的进程,并且它为I / O约束的进程赋予更高的优先级,从而避免了饥饿。

2. Brain Fuck Scheduler(BFS):
与CFS调度程序不同,BFS是O(n)调度程序,它使用被视为队列的双向链表。
因此,在最坏的情况下,上下文切换时对新进程的选择会变为O(n),并且在使用队列时,该进程的插入为O(1)。

使用全局运行队列,以便所有CPU都可以访问它。在上下文切换期间,将扫描队列,直到找到具有最高优先级的最佳进程,然后执行该进程。优先级是根据每个流程的虚拟截止期限公式确定的,并据此执行。

由于上下文切换的开销以及O(n)时间的复杂性,它不再在Linux中使用。