arceos-priority
路径:
test-suit/arceos/task/priority类型:测试入口 crate 分层:测试层 / ArceOS 任务优先级回归 版本:0.1.0文档依据:Cargo.toml、src/main.rs、qemu-riscv64.toml
arceos-priority 通过 5 个计算量不同、优 先级不同的任务,验证 ax_set_current_priority() 这条任务优先级设置链是否仍然可用。它会同时检查计算结果是否正确,并记录每个任务的离开时间;在特定调度器与单核条件下,还会额外断言短任务的完成顺序是否符合优先级预期。
最关键的边界是:这不是调度器性能 benchmark,也不是通用优先级框架;它只是一个围绕“设置当前任务优先级后,系统行为是否还自洽”的回归入口。
架构设计
1.1 工作负载设计
源码里定义了 5 组 TaskParam:
- 4 个短任务:
nice = 19 / 10 / 0 / -10 - 1 个长任务:
nice = 0
每个任务都对一组固定数据执行 load() 计算,load() 的运行时间基本随输入值线性增长。这样设计的目的是:
- 让任务持续足够久,能观察到调度差异
- 保持总结果可被精确校验
1.2 真实调用关系
ax_set_current_priority() 在 ax_api::task 中最终调用的是 ax-task::set_priority(prio),而 ax-task 的实现明确说明:在 CFS 下这个值是 nice,范围通常是 -20..19。
1.3 为什么顺序断言被限定得很窄
源码只在下面这个条件下做完成顺序断言:
cfg!(feature = "sched-cfs")available_parallelism() == 1
这非常重要。它说明当前作者并没有声称“所有环境下优先级都会表现成固定顺序”,而只是说:
- 在 CFS
- 且单核
时,较高优先级的短任务应更早离开。
而默认 qemu-riscv64.toml 使用 -smp 4,所以在自动回归里,这个顺序断言通常不会触发。当前自动化更偏向“API 与计算结果 smoke test”,而不是严格调度次序验证。
核心功能
2.1 测试覆盖内容
这个 crate 实际覆盖了三件事:
ax_set_current_priority()可以被调用且不会破坏任务执行。- 多个带不同
nice的任务仍能正确完成工作并join。 - 在窄场景下,优先级差异会反映到离开时间顺序上。
2.2 为什么还要比较 expect 与 actual
如果只看离开时间,不足以判断调度路径是否正确。源码先对所有任务输入做一次基线求和,再把各任务结果汇总比较:
expect:主线程串行计算得到actual:子任务并发完成后汇总得到
这样就能确认优先级调度没有把任务执行结果本身搞坏。
2.3 边界澄清
它不负责:
- 证明某个调度器一定更高效
- 给出稳定的跨平台性能排序
- 评估多核抢占细节
它只在可控场景下验证优先级设置接口及其基本可观察效果。
依赖关系
直接依赖
ax-std(alloc, multitask):需要堆对象、线程和join。sched-rr/sched-cfs:通过 feature 透传到底层调度器。