SimpleKernel 1.17.0
Loading...
Searching...
No Matches
task_control_block.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <cpu_io.h>
8#include <etl/flags.h>
9#include <etl/intrusive_links.h>
10
11#include <array>
12#include <cstddef>
13#include <cstdint>
14
15#include "file_descriptor.hpp"
16#include "resource_id.hpp"
17#include "task_fsm.hpp"
18
20using Pid = size_t;
21
23using ThreadEntry = void (*)(void*);
24
29namespace clone_flag {
31inline constexpr uint64_t kVm = 0x00000100;
33inline constexpr uint64_t kFs = 0x00000200;
35inline constexpr uint64_t kFiles = 0x00000400;
37inline constexpr uint64_t kSighand = 0x00000800;
39inline constexpr uint64_t kParent = 0x00008000;
41inline constexpr uint64_t kThread = 0x00010000;
43inline constexpr uint64_t kAllMask =
45} // namespace clone_flag
46
48using CloneFlags = etl::flags<uint64_t, clone_flag::kAllMask>;
49
51using CpuAffinity = etl::flags<uint64_t>;
52
56namespace TaskStatus = TaskStatusId;
57
61enum class SchedPolicy : uint8_t {
63 kRealTime = 0,
65 kNormal = 1,
67 kIdle = 2,
70};
71
73using ThreadGroupLink = etl::bidirectional_link<0>;
74
114
123 static constexpr size_t kDefaultKernelStackSize = 16 * 1024;
124
136 return a->sched_info.priority > b->sched_info.priority;
137 }
138 };
139
151 return a->sched_info.wake_tick > b->sched_info.wake_tick;
152 }
153 };
154
156 const char* name{"Unnamed Task"};
157
160
163
166
170 struct SchedInfo {
172 int priority{10};
178 uint64_t wake_tick{0};
182 uint64_t time_slice_default{10};
184 uint64_t total_runtime{0};
186 uint64_t context_switches{0};
188
192 union SchedData {
194 struct {
196 uint64_t vruntime;
198 uint32_t weight;
200
202 struct {
204 uint8_t level;
207
209 uint8_t* kernel_stack{nullptr};
210
216 uint64_t* page_table{nullptr};
217
219 TaskAuxData* aux{nullptr};
220
225 [[nodiscard]] auto GetStatus() const -> etl::fsm_state_id_t;
226
231 [[nodiscard]] auto IsThreadGroupLeader() const -> bool {
232 return aux && pid == aux->tgid;
233 }
234
240 auto JoinThreadGroup(TaskControlBlock* leader) -> void;
241
246 auto LeaveThreadGroup() -> void;
247
252 [[nodiscard]] auto GetThreadGroupSize() const -> size_t;
253
259 [[nodiscard]] auto InSameThreadGroup(const TaskControlBlock* other) const
260 -> bool {
261 return aux && other && other->aux && (aux->tgid == other->aux->tgid) &&
262 (aux->tgid != 0);
263 }
264
267
274 TaskControlBlock(const char* name, int priority, ThreadEntry entry,
275 void* arg);
276
285 TaskControlBlock(const char* name, int priority, uint8_t* elf, int argc,
286 char** argv);
287
288 TaskControlBlock() = default;
291 auto operator=(const TaskControlBlock&) -> TaskControlBlock& = delete;
295};
资源 ID
任务有限状态机
Definition task_fsm.hpp:152
进程级文件描述符表
任务状态 ID — 用作 etl::fsm 的状态 ID
Definition task_fsm.hpp:13
Clone 标志位常量 (用于 sys_clone 系统调用)
constexpr uint64_t kFiles
共享文件描述符表
constexpr uint64_t kAllMask
全部标志掩码
constexpr uint64_t kSighand
共享信号处理器
constexpr uint64_t kParent
保持相同父进程
constexpr uint64_t kThread
同一线程组
constexpr uint64_t kFs
共享文件系统信息
constexpr uint64_t kVm
共享地址空间
非调度热路径的任务辅助数据
Pid tgid
线程组 ID (主线程的 PID)
filesystem::FileDescriptorTable * fd_table
文件描述符表
CloneFlags clone_flags
克隆标志位
ResourceId blocked_on
等待的资源 ID
Pid pgid
进程组 ID
Pid parent_pid
父线程 ID
uint64_t interrupt_number
关联的中断号
CpuAffinity cpu_affinity
CPU 亲和性位掩码
int exit_code
退出码
bool is_interrupt_thread
是否为中断线程
任务优先级比较函数,优先级数值越小,优先级越高
auto operator()(TaskControlBlock *a, TaskControlBlock *b) -> bool
比较两个任务的优先级
uint64_t time_slice_default
默认时间片
int inherited_priority
继承的优先级
uint64_t context_switches
上下文切换次数
uint64_t total_runtime
总运行时间
int priority
优先级 (数字越小优先级越高)
int base_priority
基础优先级 (静态,用于优先级继承)
uint64_t time_slice_remaining
剩余时间片
任务唤醒时间比较函数,时间越早优先级越高
auto operator()(TaskControlBlock *a, TaskControlBlock *b) -> bool
比较两个任务的唤醒时间
任务控制块,管理进程/线程的核心数据结构
SchedPolicy policy
调度策略
auto JoinThreadGroup(TaskControlBlock *leader) -> void
将线程添加到线程组
struct TaskControlBlock::SchedInfo sched_info
auto LeaveThreadGroup() -> void
从线程组中移除自己
auto operator=(const TaskControlBlock &) -> TaskControlBlock &=delete
TaskControlBlock(TaskControlBlock &&)=delete
auto operator=(TaskControlBlock &&) -> TaskControlBlock &=delete
TaskFsm fsm
任务状态机
union TaskControlBlock::SchedData sched_data
auto GetStatus() const -> etl::fsm_state_id_t
获取当前任务状态
TaskControlBlock(const TaskControlBlock &)=delete
auto InSameThreadGroup(const TaskControlBlock *other) const -> bool
检查是否与另一个任务在同一线程组
auto IsThreadGroupLeader() const -> bool
检查是否是线程组的主线程
TaskControlBlock()=default
Pid pid
线程 ID (Task ID)
TaskAuxData * aux
非调度热路径的辅助数据
uint8_t * kernel_stack
内核栈
uint64_t * page_table
页表
auto GetThreadGroupSize() const -> size_t
获取线程组中的线程数量
cpu_io::CalleeSavedContext task_context
任务上下文
static constexpr size_t kDefaultKernelStackSize
默认内核栈大小 (16 KB)
cpu_io::TrapContext * trap_context_ptr
Trap 上下文
const char * name
任务名称
etl::flags< uint64_t, clone_flag::kAllMask > CloneFlags
克隆标志位
etl::bidirectional_link< 0 > ThreadGroupLink
线程组侵入式链表节点类型
SchedPolicy
调度策略
@ kNormal
普通任务
@ kPolicyCount
策略数量
@ kRealTime
实时任务 (最高优先级)
@ kIdle
空闲任务 (最低优先级)
etl::flags< uint64_t > CpuAffinity
CPU 亲和性位掩码
void(*)(void *) ThreadEntry
线程入口函数类型
size_t Pid
进程 ID 类型
不同调度器的专用字段 (互斥使用)
uint32_t weight
任务权重 (1024 为默认)
uint8_t level
优先级级别 (0 = 最高)
struct TaskControlBlock::SchedData::@4 mlfq
MLFQ 调度器数据
struct TaskControlBlock::SchedData::@3 cfs
CFS 调度器数据
uint64_t vruntime
虚拟运行时间