Sched rt doc (#163)

* update

* 完善调度器文档

* 更新RT调度器文档

* 更新实时调度文档
This commit is contained in:
kong 2023-02-09 15:24:37 +08:00 committed by GitHub
parent 009f92d50f
commit 90b077f9d3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 100 additions and 0 deletions

24
docs/kernel/sched/cfs.md Normal file
View File

@ -0,0 +1,24 @@
# 完全公平调度器相关的api
   CFSCompletely Fair Scheduler顾名思义完全公平调度器。CFS作为主线调度器之一也是最典型的O(1)调度器之一
## 1. CFSQueue 介绍
   CFSQueue是用来存放普通进程的调度队列每个CPU维护一个RTQueue主要使用Vec作为主要存储结构来实现。
### 1.1 主要函数
1. enqueue(): 将pcb入队列
2. dequeue(): 将pcb从调度队列中弹出,若队列为空则返回IDLE进程的pcb
3. sort(): 将进程按照虚拟运行时间的升序进行排列
## 2. SchedulerCFS 介绍
   CFS调度器类主要实现了CFS调度器类的初始化以及调度功能函数。
### 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进程的可执行时间

14
docs/kernel/sched/core.md Normal file
View File

@ -0,0 +1,14 @@
# 进程调度器相关的api
   定义了DragonOS的进程调度相关的api是系统进行进程调度的接口。同时也抽象出了Scheduler的trait以供具体的调度器实现
## 1. 调度器介绍
   一般来说,一个系统会同时处理多个请求,但是其资源是优先的,调度就是用来协调每个请求对资源的使用的方法。
### 1.1 主要函数
1. cpu_executing(): 获取指定的cpu上正在执行的进程的pcb
2. sched_enqueue(): 将进程加入调度队列
3. sched_init(): 初始化进程调度器模块
4. sched_update_jiffies(): 当时钟中断到达时,更新时间片。*请注意,该函数只能被时钟中断处理程序调用*
5. sys_sched(): 让系统立即运行调度器的系统调用。*请注意该系统调用不能由ring3的程序发起*

View File

@ -9,3 +9,6 @@ DragonOS调度
c_waiting
rust_waiting
core
cfs
rt

59
docs/kernel/sched/rt.md Normal file
View File

@ -0,0 +1,59 @@
# 实时进程调度器相关的api
   RTrealtime scheduler实时调度器。实时调度是为了完成实时处理任务而分配CPU的调度方法。
  DragonOS的进程分为“实时进程”和“普通进程”两类实时进程的优先级高于普通进程如果当前的系统的执行队列中有“实时进程”RT调度器会优先选择实时进程如果队列中会有多个实时进程调度器会选择优先级最高的实时进程来执行
## 1. RTQueue 介绍
   RTQueue是用来存放state为running的实时进程的调度队列每个CPU维护一个RTQueue主要使用Vec作为主要存储结构来实现。
### 1.1 主要函数
1. enqueue(): 将pcb入队列
2. dequeue(): 将pcb出队列
## 2. SchedulerRT 介绍
   RT调度器类主要实现了RT调度器类的初始化以及调度功能函数。
### 2.1 主要函数
1. pick_next_task_rt(): 获取当前CPU中的第一个需要执行的RT pcb
2. sched(): 是对于Scheduler trait的sched()实现是实时进程进行调度时的逻辑处理该函数会返回接下来要执行的pcb若没有符合要求的pcb返回None
3. enqueue(): 同样是对于Scheduler trait的sched()实现将一个pcb加入调度器的调度队列
### 2.2 内核调度策略
   目前在DragonOS中主要的调度策略有SCHED_NORMAL 策略 | SCHED_FIFO 策略 | SCHED_RT 策略,具体的调度策略为:
1. SCHED_NORMAL 策略:
SCHED_NORMAL 是“绝对公平调度策略”该策略的进程使用CFS进行调度。
2. SCHED_FIFO 策略:
SCHED_FIFO是“实时进程调度策略”这是一种先进先出的调度策略该策略不涉及到CPU时间片机制在没有更高优先级进程的前提下只能等待其他进程主动释放CPU资源
在SCHED_FIFO策略中被调度器调度运行的进程其运行时长不受限制可以运行任意长的时间。
3. SCHED_RR 策略:
SCHED_RR是“实时进程调度策略”使用的是时间片轮转机制对应进程的time_slice会在运行时减少进程使用完CPU时间片后会加入该CPU的与该进程优先级相同的执行队列中。
同时释放CPU资源CPU的使用权会被分配给下一个执行的进程
## 3. Q&A
   几种常用的方法
1. 如何创建实时进程
```c
struct process_control_block *pcb_name = kthread_run_rt(&fn_name, NULL, "test create rt pcb");
```
其中kthread_run_rt是创建内核实时线程的宏
2. pcb中涉及到实时进程的字段含义
1. policy实时进程的策略目前有SCHED_FIFO与SCHED_RR
2. priority: 实时进程的优先级范围为0-99数字越大表示优先级越高
3. rt_time_slice: 实时进程的时间片默认为100随着CPU运行而减少在rt_time_slice为0时将时间片赋初值并将该进程加入执行队列。
3. 如何实时进程存储队列
- 目前是使用Vec来保存因为具体实现的逻辑原因目前的入队列和出队列都是对队尾的操作因此会有如下现象系统中有多个优先级相同的实时进程等待运行时会出现饥饿现象也即上一个因为时间片耗尽的进程会在下一个执行造成同优先级等待的进程饥饿。
4. todo
1. 将存储实时进程的队列使用双向链表存储(或者其他办法解决上述的饥饿问题)
2. 目前的实时调度是针对单CPU的需要实现多CPU的实时调度
3. 实现RT进程和普通进程之间的分配带宽的比例
4. 多个CPU之间实现负载均衡