axpoll
路径:
components/axpoll类型:库 crate 分层:组件层 / 通用 readiness 与唤醒协议层 版本:0.1.2文档依据:Cargo.toml、src/lib.rs、tests/tests.rs、tests/async.rs、os/arceos/modules/axtask/src/future/poll.rs
axpoll 为仓库里的“对象可轮询事件”提供了一套极小但很关键的公共协议:用 IoEvents 表示事件位,用 Pollable 约定对象如何报告就绪状态和注册 waker,用 PollSet 保存等待者并在状态变化时唤醒。网络 socket、文件节点、loopback 设备、IRQ 等对象都可以接到这套模型上。
最关键的一条边界是:axpoll 只提供 readiness 与唤醒协议,不是 poll(2) / epoll(7) 的系统调用实现,更不是调度器。
架构设计
设计定位
仓库里已经有 axio 负责同步读写语义,但还需要另一层来回答两个问题:
- 这个对象“现在”有哪些事件已经成立?
- 如果事件还没成立,应该把谁记下来,等状态变化时再唤醒?
axpoll 正是为这两件事存在的。它位于:
axio之上:axio只管同步 I/O 接口,不管等待ax-taskfuture 机制之下:ax-task::future::poll_io依赖Pollable- ArceOS/StarryOS 多路复用实现之下:更高层
select/poll/epoll轮询的对象,底层往往实现Pollable
1.2 单文件核心结构
虽然 crate 只有一个 src/lib.rs,内部职责很清晰:
| 组成 | 作用 |
|---|---|
IoEvents | 基于 bitflags 封装 Linux POLL* 事件位 |
Pollable | 约定对象如何查询当前事件,以及如何注册等待者 |
Inner | PollSet 的内部 ring buffer,保存 Waker |
PollSet | 对外暴露的等待者集合,可注册与批量唤醒 |
1.3 IoEvents:readiness 位图协议
IoEvents 基本直接对齐 Linux poll 语义,包括:
IN、OUTPRIERR、HUP、NVALRDNORM、RDBAND、WRNORM、WRBANDMSG、REMOVE、RDHUP
其中 ALWAYS_POLL 把 ERR 与 HUP 固定为“即使未显式订阅也应参与判断”的事件位。这一设计使内核对象 readiness 与 POSIX 兼容层的事件语义能够共享同一套位图定义。