SimpleKernel 1.17.0
Loading...
Searching...
No Matches
rr_scheduler.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <etl/list.h>
8
9#include "kernel_config.hpp"
10#include "kernel_log.hpp"
11#include "scheduler_base.hpp"
13
21 public:
28 auto Enqueue(TaskControlBlock* task) -> void override {
29 if (task) {
30 if (ready_queue_.full()) {
32 "RoundRobinScheduler::Enqueue: ready_queue full, dropping task");
33 return;
34 }
35 // 重新分配时间片
36 task->sched_info.time_slice_remaining =
37 task->sched_info.time_slice_default;
38 ready_queue_.push_back(task);
40 }
41 }
42
49 auto Dequeue(TaskControlBlock* task) -> void override {
50 if (!task) {
51 return;
52 }
53
54 for (auto it = ready_queue_.begin(); it != ready_queue_.end(); ++it) {
55 if (*it == task) {
56 ready_queue_.erase(it);
58 break;
59 }
60 }
61 }
62
69 [[nodiscard]] auto PickNext() -> TaskControlBlock* override {
70 if (ready_queue_.empty()) {
71 return nullptr;
72 }
73 auto next = ready_queue_.front();
74 ready_queue_.pop_front();
76 return next;
77 }
78
83 [[nodiscard]] auto GetQueueSize() const -> size_t override {
84 return ready_queue_.size();
85 }
86
91 [[nodiscard]] auto IsEmpty() const -> bool override {
92 return ready_queue_.empty();
93 }
94
102 [[nodiscard]] auto OnTimeSliceExpired(TaskControlBlock* task)
103 -> bool override {
104 if (task) {
105 // 重新分配时间片
106 task->sched_info.time_slice_remaining =
107 task->sched_info.time_slice_default;
108 }
109 return true;
110 }
111
116 auto OnPreempted([[maybe_unused]] TaskControlBlock* task) -> void override {
118 }
119
127 ~RoundRobinScheduler() override = default;
129
130 private:
132 etl::list<TaskControlBlock*, kernel::config::kMaxReadyTasks> ready_queue_;
133};
Round-Robin 调度器
etl::list< TaskControlBlock *, kernel::config::kMaxReadyTasks > ready_queue_
就绪队列 (双向链表,支持从头部取、向尾部放,固定容量)
RoundRobinScheduler(const RoundRobinScheduler &)=delete
auto OnPreempted(TaskControlBlock *task) -> void override
任务被抢占时调用
auto operator=(RoundRobinScheduler &&) -> RoundRobinScheduler &=delete
auto Dequeue(TaskControlBlock *task) -> void override
从就绪队列中移除指定任务
auto OnTimeSliceExpired(TaskControlBlock *task) -> bool override
时间片耗尽处理
RoundRobinScheduler()=default
auto PickNext() -> TaskControlBlock *override
选择下一个要运行的任务
auto operator=(const RoundRobinScheduler &) -> RoundRobinScheduler &=delete
auto Enqueue(TaskControlBlock *task) -> void override
将任务加入就绪队列尾部
auto GetQueueSize() const -> size_t override
获取就绪队列大小
~RoundRobinScheduler() override=default
RoundRobinScheduler(RoundRobinScheduler &&)=delete
auto IsEmpty() const -> bool override
判断队列是否为空
调度器基类接口
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
size_t total_dequeues
总出队次数
size_t total_preemptions
总抢占次数
size_t total_picks
总选择次数
size_t total_enqueues
总入队次数
任务控制块,管理进程/线程的核心数据结构