arceos-yield
路径:
test-suit/arceos/task/yield类型:测试入口 crate 分层:测试层 / ArceOS 调度让出语义回归 版本:0.1.0文档依据:Cargo.toml、src/main.rs、qemu-riscv64.toml、docs/build/overview.md
arceos-yield 是一条非常短、但很有代表性的调度测试:它批量创建任务,在任务体和主线程里调用 thread::yield_now(),并在特定 feature 组合下检查任务完成顺序是否符合预期。
它的边界需要说得很明确:这个 crate 不是调度器框架,也不是性能 benchmark;它只是拿“主动让出 CPU”这条最基础的调度语义做回归检查。
架构设计
1.1 测试结构
整个场景只依赖两个共享状态:
NUM_TASKS = 10FINISHED_TASKS
主线程一次性生成 10 个任务,每个任务打印自己的 ID,然后根据 feature 条件决定是否显式 yield_now(),最后把完成顺序记录到原子计数器中。
1.2 真实调用链
看起来它只调用了一个简单 API,但实际链路会穿透到调度器内部:
因此这个测试真正观察的是“任务主动让出 CPU 后,调度器是否做了正确的切换”。
1.3 feature 条件为什么重要
源码里有两个很关键的条件:
#[cfg(all(not(feature = "sched-rr"), not(feature = "sched-cfs")))]if cfg!(not(feature = "sched-cfs")) && available_parallelism() == 1
这意味着:
- 在默认非 RR、非 CFS 场景下,它明确测试 cooperative
yield_now() - 只有在非 CFS 且单核时,才要求完成顺序与创建顺序一致,以验证 FIFO 风格语义
所以这个 crate 不是“无条件断言所有调度器都应同序执行”,而是有边界地验证默认/特定调度语义。
核心功能
2.1 实 际验证内容
它主要检查三件事:
yield_now()调用本身不会导致任务丢失或死锁。- 主线程在等待子任务完成时,可以通过反复
yield_now()推进系统前进。 - 在非 CFS、单核的窄场景下,任务完成顺序仍符合预期的 FIFO 语义。
2.2 为什么顺序断言被严格门控
当前仓库的 qemu-riscv64.toml 使用 -smp 4,在多核环境下任务完成顺序天然会受并行性影响。因此源码只在单核时做顺序断言,这是合理而且必要的。
这也意味着当前默认自动测试更偏向:
yield_now()不崩- 调度器能推进
- 所有任务都能收敛结束
而不是强行验证全局顺序。
2.3 边界澄清
它不负责:
- 比较不同调度器的性能
- 证明 RR 或 CFS 的公平性
- 提供高级任务同步原语
它只是“主动让出 CPU 这一下是否还正常”的快速探针。