SimpleKernel 1.17.0
Loading...
Searching...
No Matches
fifo_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
23 public:
28 auto Enqueue(TaskControlBlock* task) -> void override {
29 if (ready_queue_.full()) {
30 klog::Err("FifoScheduler::Enqueue: ready_queue full, dropping task");
31 return;
32 }
33 ready_queue_.push_back(task);
35 }
36
41 auto Dequeue(TaskControlBlock* task) -> void override {
42 ready_queue_.remove(task);
44 }
45
50 [[nodiscard]] auto PickNext() -> TaskControlBlock* override {
51 if (ready_queue_.empty()) {
52 return nullptr;
53 }
54 TaskControlBlock* next = ready_queue_.front();
55 ready_queue_.pop_front();
57 return next;
58 }
59
64 [[nodiscard]] auto GetQueueSize() const -> size_t override {
65 return ready_queue_.size();
66 }
67
72 [[nodiscard]] auto IsEmpty() const -> bool override {
73 return ready_queue_.empty();
74 }
75
83 auto OnPreempted([[maybe_unused]] TaskControlBlock* task) -> void override {
85 }
86
89 FifoScheduler() { name = "FIFO"; }
90 FifoScheduler(const FifoScheduler&) = delete;
92 auto operator=(const FifoScheduler&) -> FifoScheduler& = delete;
94 ~FifoScheduler() override = default;
96
97 private:
99 etl::list<TaskControlBlock*, kernel::config::kMaxReadyTasks> ready_queue_;
100};
先来先服务 (FIFO) 调度器
auto operator=(FifoScheduler &&) -> FifoScheduler &=delete
etl::list< TaskControlBlock *, kernel::config::kMaxReadyTasks > ready_queue_
就绪队列 (先进先出,固定容量)
auto operator=(const FifoScheduler &) -> FifoScheduler &=delete
auto Enqueue(TaskControlBlock *task) -> void override
将任务加入就绪队列尾部
FifoScheduler(FifoScheduler &&)=delete
auto OnPreempted(TaskControlBlock *task) -> void override
任务被抢占时调用
auto PickNext() -> TaskControlBlock *override
选择下一个要运行的任务(队列头部)
auto IsEmpty() const -> bool override
判断队列是否为空
~FifoScheduler() override=default
FifoScheduler(const FifoScheduler &)=delete
auto GetQueueSize() const -> size_t override
获取就绪队列大小
auto Dequeue(TaskControlBlock *task) -> void override
从就绪队列中移除指定任务
调度器基类接口
const char * name
调度器名称
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
总入队次数
任务控制块,管理进程/线程的核心数据结构