7#include <etl/multiset.h>
45 if (a->sched_data.cfs.vruntime != b->sched_data.cfs.vruntime) {
46 return a->sched_data.cfs.vruntime < b->sched_data.cfs.vruntime;
64 if (task->sched_data.cfs.vruntime == 0) {
69 if (task->sched_data.cfs.weight == 0) {
74 klog::Err(
"CfsScheduler::Enqueue: ready_queue_ full, dropping task");
134 [[nodiscard]]
auto IsEmpty() const ->
bool override {
148 assert(current !=
nullptr &&
149 "CfsScheduler::OnTick: current task must not be null");
153 uint64_t delta = (
kDefaultWeight * 1000) / current->sched_data.cfs.weight;
154 current->sched_data.cfs.vruntime += delta;
161 current->sched_data.cfs.vruntime) {
CFS (Completely Fair Scheduler) 调度器
CfsScheduler(CfsScheduler &&)=delete
uint64_t min_vruntime_
当前最小 vruntime (用于新任务初始化)
~CfsScheduler() override=default
static constexpr uint64_t kMinGranularity
vruntime 粒度 (用于计算抢占阈值)
auto Dequeue(TaskControlBlock *task) -> void override
从就绪队列中移除指定任务
auto operator=(CfsScheduler &&) -> CfsScheduler &=delete
CfsScheduler(const CfsScheduler &)=delete
auto OnTick(TaskControlBlock *current) -> bool override
每个 tick 更新任务的 vruntime
auto PickNext() -> TaskControlBlock *override
选择下一个要运行的任务
auto Enqueue(TaskControlBlock *task) -> void override
将任务加入就绪队列
auto OnPreempted(TaskControlBlock *task) -> void override
任务被抢占时调用
auto IsEmpty() const -> bool override
判断队列是否为空
etl::multiset< TaskControlBlock *, kernel::config::kMaxReadyTasks, VruntimeCompare > ready_queue_
就绪队列 (红黑树,按 vruntime 升序排序,begin() = 最小 vruntime)
static constexpr uint32_t kDefaultWeight
默认权重 (对应 nice 值为 0)
auto GetQueueSize() const -> size_t override
获取就绪队列大小
auto operator=(const CfsScheduler &) -> CfsScheduler &=delete
auto GetMinVruntime() const -> uint64_t
获取当前 min_vruntime
constexpr size_t kMaxReadyTasks
调度器就绪队列容量(FIFO / RR / CFS)
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
CpuSchedData * sched_data
调度数据 (RunQueue) 指针
vruntime 比较器 (用于 multiset 红黑树)
auto operator()(const TaskControlBlock *a, const TaskControlBlock *b) const -> bool
size_t total_dequeues
总出队次数
size_t total_preemptions
总抢占次数
size_t total_enqueues
总入队次数