mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-23 20:33:23 +00:00
@ -2,23 +2,27 @@
|
||||
|
||||
   CFS(Completely Fair Scheduler),顾名思义,完全公平调度器。CFS作为主线调度器之一,也是最典型的O(1)调度器之一
|
||||
|
||||
## 1. CFSQueue 介绍
|
||||
## 结构体介绍
|
||||
|
||||
   CFSQueue是用来存放普通进程的调度队列,每个CPU维护一个CFSQueue,主要使用Vec作为主要存储结构来实现。
|
||||
- ``CompletelyFairScheduler``
|
||||
   ``CompletelyFairScheduler``实现了``Scheduler``trait,他是完全调度算法逻辑的主要实施者。
|
||||
|
||||
### 1.1 主要函数
|
||||
1. enqueue(): 将pcb入队列
|
||||
2. dequeue(): 将pcb从调度队列中弹出,若队列为空,则返回IDLE进程的pcb
|
||||
3. sort(): 将进程按照虚拟运行时间的升序进行排列
|
||||
- ``FairSchedEntity``
|
||||
- **重要字段**
|
||||
- ``cfs_rq``: 它指向了自己所在的完全公平调度队列。
|
||||
- ``my_cfs_rq``: 为一个``Option``变量,当该实体作为一个单独进程时,这个值为``None``,但是若这个实体为一个组,那这个变量必需为这个组内的私有调度队列。这个``cfs_rq``还可以继续往下深入,就构成了上述的树型结构。
|
||||
- ``pcb``: 它指向了当前实体对应的``PCB``,同样,若当前实体为一个组,则这个``Weak``指针不指向任何值。
|
||||
|
||||
## 2. SchedulerCFS 介绍
|
||||
  ``FairSchedEntity``是完全公平调度器中最重要的结构体,他代表一个实体单位,它不止表示一个进程,它还可以是一个组或者一个用户,但是它在cfs队列中所表示的就单单是一个调度实体。这样的设计可以为上层提供更多的思路,比如上层可以把不同的进程归纳到一个调度实体从而实现组调度等功能而不需要改变调度算法。
|
||||
|
||||
   CFS调度器类,主要实现了CFS调度器类的初始化以及调度功能函数。
|
||||
  在cfs中,整体的结构是**一棵树**,每一个调度实体作为``cfs_rq``中的一个节点,若该调度实体不是单个进程(它可能是一个进程组),则在该调度实体中还需要维护一个自己的``cfs_rq``,这样的嵌套展开后,每一个叶子节点就是一个单独的进程。需要理解这样一棵树,**在后续文档中会以这棵树为核心讲解**。
|
||||
  该结构体具体的字段意义请查阅源代码。这里提及几个重要的字段:
|
||||
|
||||
### 2.1 主要函数
|
||||
|
||||
1. sched(): 是对于Scheduler trait的sched()实现,是普通进程进行调度时的逻辑处理,该函数会返回接下来要执行的pcb,若没有符合要求的pcb,返回None
|
||||
2. enqueue(): 同样是对于Scheduler trait的sched()实现,将一个pcb加入调度器的调度队列
|
||||
3. update_cpu_exec_proc_jiffies(): 更新这个cpu上,这个进程的可执行时间。
|
||||
4. timer_update_jiffies(): 时钟中断到来时,由sched的core模块中的函数,调用本函数,更新CFS进程的可执行时间
|
||||
- ``CfsRunQueue``
|
||||
  ``CfsRunQueue``完全公平调度算法中管理``FairSchedEntity``的队列,它可以挂在总的``CpuRunQueue``下,也可以作为子节点挂在``FairSchedEntity``上,详见上文``FairSchedEntity``。
|
||||
|
||||
- **重要字段**
|
||||
- ``entities``: 存储调度实体的红黑树
|
||||
- ``current``: 当前正在运行的实体
|
||||
|
||||
|
Reference in New Issue
Block a user