7#include <gtest/gtest.h>
13TEST(CfsSchedulerTest, BasicEnqueueDequeue) {
54TEST(CfsSchedulerTest, VruntimeOrdering) {
84TEST(CfsSchedulerTest, NewTaskVruntimeInitialization) {
93 auto* picked1 = scheduler.
PickNext();
107TEST(CfsSchedulerTest, WeightImpactOnVruntime) {
125 uint64_t initial_vruntime = first->sched_data.cfs.vruntime;
129 if (first == &task1) {
131 EXPECT_EQ(first->sched_data.cfs.vruntime, initial_vruntime + 500);
134 EXPECT_EQ(first->sched_data.cfs.vruntime, initial_vruntime + 2000);
139TEST(CfsSchedulerTest, OnTickPreemption) {
154 bool should_preempt = scheduler.
OnTick(&task1);
161TEST(CfsSchedulerTest, OnTickNoPreemption) {
176 bool should_preempt = scheduler.
OnTick(&task1);
183TEST(CfsSchedulerTest, DequeueSpecificTask) {
215TEST(CfsSchedulerTest, NullPointerHandling) {
236TEST(CfsSchedulerTest, DefaultWeightAssignment) {
250TEST(CfsSchedulerTest, Statistics) {
293TEST(CfsSchedulerTest, MinVruntimeUpdate) {
335TEST(CfsSchedulerTest, MultipleTicksVruntimeAccumulation) {
343 constexpr int kTickCount = 10;
347 for (
int i = 0; i < kTickCount; ++i) {
355TEST(CfsSchedulerTest, FairnessWithDifferentWeights) {
368 constexpr int kTickCount = 10;
370 for (
int i = 0; i < kTickCount; ++i) {
371 scheduler.
OnTick(&high_priority);
372 scheduler.
OnTick(&low_priority);
385TEST(CfsSchedulerTest, ExtremeWeightValues) {
405TEST(CfsSchedulerTest, QueueSizeConsistency) {
408 kstd::vector<TaskControlBlock*> tasks;
409 for (
int i = 0; i < 5; ++i) {
412 task->sched_data.cfs.vruntime = i * 100;
413 tasks.push_back(task);
417 for (
auto* task : tasks) {
441 for (
auto* task : tasks) {
447TEST(CfsSchedulerTest, PreemptionStatistics) {
CFS (Completely Fair Scheduler) 调度器
auto Dequeue(TaskControlBlock *task) -> void override
从就绪队列中移除指定任务
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
判断队列是否为空
static constexpr uint32_t kDefaultWeight
默认权重 (对应 nice 值为 0)
auto GetQueueSize() const -> size_t override
获取就绪队列大小
auto GetMinVruntime() const -> uint64_t
获取当前 min_vruntime
virtual auto GetStats() const -> const Stats &
获取调度器统计信息
virtual auto OnScheduled(TaskControlBlock *task) -> void
任务开始运行时调用 (从 Ready 变为 Running)
virtual auto ResetStats() -> void
重置统计信息
constexpr etl::fsm_state_id_t kReady
union TaskControlBlock::SchedData sched_data
#define EXPECT_TRUE(cond, msg)
#define EXPECT_NE(val1, val2, msg)
#define EXPECT_LT(val1, val2, msg)
#define EXPECT_FALSE(cond, msg)
#define EXPECT_GT(val1, val2, msg)
#define EXPECT_EQ(val1, val2, msg)
uint32_t weight
任务权重 (1024 为默认)
struct TaskControlBlock::SchedData::@3 cfs
CFS 调度器数据
TEST(CfsSchedulerTest, BasicEnqueueDequeue)