SimpleKernel 1.17.0
Loading...
Searching...
No Matches
RoundRobinScheduler Class Reference

Round-Robin 调度器 More...

#include <rr_scheduler.hpp>

Inheritance diagram for RoundRobinScheduler:
Inheritance graph
Collaboration diagram for RoundRobinScheduler:
Collaboration graph

Public Member Functions

auto Enqueue (TaskControlBlock *task) -> void override
 将任务加入就绪队列尾部
 
auto Dequeue (TaskControlBlock *task) -> void override
 从就绪队列中移除指定任务
 
auto PickNext () -> TaskControlBlock *override
 选择下一个要运行的任务
 
auto GetQueueSize () const -> size_t override
 获取就绪队列大小
 
auto IsEmpty () const -> bool override
 判断队列是否为空
 
auto OnTimeSliceExpired (TaskControlBlock *task) -> bool override
 时间片耗尽处理
 
auto OnPreempted (TaskControlBlock *task) -> void override
 任务被抢占时调用
 
构造/析构函数
 RoundRobinScheduler ()=default
 
 RoundRobinScheduler (const RoundRobinScheduler &)=delete
 
 RoundRobinScheduler (RoundRobinScheduler &&)=delete
 
auto operator= (const RoundRobinScheduler &) -> RoundRobinScheduler &=delete
 
auto operator= (RoundRobinScheduler &&) -> RoundRobinScheduler &=delete
 
 ~RoundRobinScheduler () override=default
 
- Public Member Functions inherited from SchedulerBase
virtual auto OnTick (TaskControlBlock *current) -> bool
 Tick 更新:每个时钟中断时调用,用于更新调度器状态
 
virtual auto BoostPriority (TaskControlBlock *task, int new_priority) -> void
 优先级提升:当任务持有资源时被更高优先级任务等待,提升其优先级
 
virtual auto RestorePriority (TaskControlBlock *task) -> void
 优先级恢复:当任务释放资源后,恢复其原始优先级
 
virtual auto OnScheduled (TaskControlBlock *task) -> void
 任务开始运行时调用 (从 Ready 变为 Running)
 
virtual auto GetStats () const -> const Stats &
 获取调度器统计信息
 
virtual auto ResetStats () -> void
 重置统计信息
 
 SchedulerBase ()=default
 
 SchedulerBase (const SchedulerBase &)=default
 
 SchedulerBase (SchedulerBase &&)=default
 
auto operator= (const SchedulerBase &) -> SchedulerBase &=default
 
auto operator= (SchedulerBase &&) -> SchedulerBase &=default
 
virtual ~SchedulerBase ()=default
 

Private Attributes

etl::list< TaskControlBlock *, kernel::config::kMaxReadyTasksready_queue_
 就绪队列 (双向链表,支持从头部取、向尾部放,固定容量)
 

Additional Inherited Members

- Public Attributes inherited from SchedulerBase
const char * name {"Unnamed Scheduler"}
 调度器名称
 
- Protected Attributes inherited from SchedulerBase
Stats stats_ {}
 

Detailed Description

Round-Robin 调度器

时间片轮转调度器,所有任务按照 FIFO 顺序排队。 每个任务获得相同的时间片,时间片用完后放回队列尾部。

Definition at line 20 of file rr_scheduler.hpp.

Constructor & Destructor Documentation

◆ RoundRobinScheduler() [1/3]

RoundRobinScheduler::RoundRobinScheduler ( )
default

◆ RoundRobinScheduler() [2/3]

RoundRobinScheduler::RoundRobinScheduler ( const RoundRobinScheduler )
delete

◆ RoundRobinScheduler() [3/3]

RoundRobinScheduler::RoundRobinScheduler ( RoundRobinScheduler &&  )
delete

◆ ~RoundRobinScheduler()

RoundRobinScheduler::~RoundRobinScheduler ( )
overridedefault

Member Function Documentation

◆ Dequeue()

auto RoundRobinScheduler::Dequeue ( TaskControlBlock task) -> void
inlineoverridevirtual

从就绪队列中移除指定任务

Parameters
task要移除的任务控制块指针

用于任务主动退出或被阻塞等场景。

Implements SchedulerBase.

Definition at line 49 of file rr_scheduler.hpp.

49 {
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 }
etl::list< TaskControlBlock *, kernel::config::kMaxReadyTasks > ready_queue_
就绪队列 (双向链表,支持从头部取、向尾部放,固定容量)
size_t total_dequeues
总出队次数
Here is the caller graph for this function:

◆ Enqueue()

auto RoundRobinScheduler::Enqueue ( TaskControlBlock task) -> void
inlineoverridevirtual

将任务加入就绪队列尾部

Parameters
task任务控制块指针

重置任务的时间片并将其加入队列尾部,实现公平的时间片轮转。

Implements SchedulerBase.

Definition at line 28 of file rr_scheduler.hpp.

28 {
29 if (task) {
30 if (ready_queue_.full()) {
32 "RoundRobinScheduler::Enqueue: ready_queue full, dropping task");
33 return;
34 }
35 // 重新分配时间片
38 ready_queue_.push_back(task);
40 }
41 }
auto Err(etl::format_string< Args... > fmt, Args &&... args) -> void
以 ERROR 级别记录日志
size_t total_enqueues
总入队次数
uint64_t time_slice_default
默认时间片
uint64_t time_slice_remaining
剩余时间片
struct TaskControlBlock::SchedInfo sched_info
Here is the call graph for this function:
Here is the caller graph for this function:

◆ GetQueueSize()

auto RoundRobinScheduler::GetQueueSize ( ) const -> size_t
inlineoverridevirtual

获取就绪队列大小

Returns
size_t 队列中的任务数量

Implements SchedulerBase.

Definition at line 83 of file rr_scheduler.hpp.

83 {
84 return ready_queue_.size();
85 }
Here is the caller graph for this function:

◆ IsEmpty()

auto RoundRobinScheduler::IsEmpty ( ) const -> bool
inlineoverridevirtual

判断队列是否为空

Returns
bool 队列为空返回 true

Implements SchedulerBase.

Definition at line 91 of file rr_scheduler.hpp.

91 {
92 return ready_queue_.empty();
93 }
Here is the caller graph for this function:

◆ OnPreempted()

auto RoundRobinScheduler::OnPreempted ( TaskControlBlock task) -> void
inlineoverridevirtual

任务被抢占时调用

Parameters
task被抢占的任务

Reimplemented from SchedulerBase.

Definition at line 116 of file rr_scheduler.hpp.

116 {
118 }
size_t total_preemptions
总抢占次数
Here is the caller graph for this function:

◆ OnTimeSliceExpired()

auto RoundRobinScheduler::OnTimeSliceExpired ( TaskControlBlock task) -> bool
inlineoverridevirtual

时间片耗尽处理

Parameters
task时间片耗尽的任务
Returns
bool 返回 true 表示需要重新入队

Round-Robin 调度器在时间片耗尽时重置时间片并将任务放回队列尾部。

Reimplemented from SchedulerBase.

Definition at line 102 of file rr_scheduler.hpp.

103 {
104 if (task) {
105 // 重新分配时间片
108 }
109 return true;
110 }
Here is the caller graph for this function:

◆ operator=() [1/2]

auto RoundRobinScheduler::operator= ( const RoundRobinScheduler ) -> RoundRobinScheduler &=delete
delete

◆ operator=() [2/2]

auto RoundRobinScheduler::operator= ( RoundRobinScheduler &&  ) -> RoundRobinScheduler &=delete
delete

◆ PickNext()

auto RoundRobinScheduler::PickNext ( ) -> TaskControlBlock*
inlineoverridevirtual

选择下一个要运行的任务

Returns
TaskControlBlock* 下一个任务,如果队列为空则返回 nullptr

从队列头部取出任务,实现 Round-Robin 轮转。

Implements SchedulerBase.

Definition at line 69 of file rr_scheduler.hpp.

69 {
70 if (ready_queue_.empty()) {
71 return nullptr;
72 }
73 auto next = ready_queue_.front();
74 ready_queue_.pop_front();
76 return next;
77 }
size_t total_picks
总选择次数
Here is the caller graph for this function:

Member Data Documentation

◆ ready_queue_

etl::list<TaskControlBlock*, kernel::config::kMaxReadyTasks> RoundRobinScheduler::ready_queue_
private

就绪队列 (双向链表,支持从头部取、向尾部放,固定容量)

Definition at line 132 of file rr_scheduler.hpp.


The documentation for this class was generated from the following file: