继承关系
┌─────────────────────────────────────────────────────────┐
│ AsyncIOObject (纯虚类) │
├─────────────────────────────────────────────────────────┤
│ + read(buf: void*, size: size_t): Task<size_t> │
│ + write(buf: const void*, size: size_t): Task<size_t> │
│ + close(): Task<void> │
└───────────────┬───────────────┬───────────────┬─────────┘
│ │ │
┌───────▼───────┐ ┌─────▼───────┐ ┌─────▼───────┐
│ AsyncFile │ │ AsyncSocket │ │ MockIO │
├───────────────┤ ├─────────────┤ ├─────────────┤
│ + seek() │ │ + connect() │ │ + set_delay()│
└───────────────┘ │ + accept() │ └─────────────┘
└─────────────┘
┌─────────────────────────────────────────────────────────┐
│ IOEngine (纯虚类) │
├─────────────────────────────────────────────────────────┤
│ + submit(op: AsyncIOOp*): void │
│ + poll(timeout: int): void │
│ + get_io_object(fd: int): AsyncIOObject* │
└───────────────┬───────────────┬───────────────┬─────────┘
│ │ │
┌───────▼───────┐ ┌─────▼───────┐ ┌─────▼───────┐
│ EpollEngine │ │IOUringEngine│ │ IOCPManager│
└───────────────┘ └─────────────┘ └─────────────┘
┌─────────────────────────────────────────────────────────┐
│ AsyncIOOp │
├─────────────────────────────────────────────────────────┤
│ - op_type: OpType (READ/WRITE/CLOSE) │
│ - buf: void* │
│ - size: size_t │
│ - result: size_t │
│ - coro_handle: std::coroutine_handle<> │
│ - io_object: AsyncIOObject* │
└─────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ IOAwaiter<T> │
├─────────────────────────────────────────────────────────┤
│ - op: AsyncIOOp* │
├─────────────────────────────────────────────────────────┤
│ + await_ready(): bool │
│ + await_suspend(handle): void │
│ + await_resume(): T │
└─────────────────────────────────────────────────────────┘
交互流程
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ 用户协程 │ │ 异步IO操作 │ │ 调度器 │ │ IO引擎 │ │ 底层IO模型 │
│ (Task<void>) │ │ (AsyncIOOp) │ │ (scheduler) │ │ (IOEngine) │ │(epoll/IOCP等)│
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │ │ │
│ co_await read() │ │ │ │
├───────────────────>│ │ │ │
│ │ 创建AsyncIOOp │ │ │
│ ├───────────────────>│ │ │
│ │ 注册协程句柄到Op │ │ │
│ ├───────────────────>│ │ │
│ │ │ 提交IO请求到引擎 │ │
│ │ ├───────────────────>│ │
│ │ │ │ 提交IO请求 │
│ │ │ ├───────────────────>│
│ │ │ │ │
│ 挂起协程 │ │ │ │
│<───────────────────┴───────────────────┘ │ │
│ │ │ │ │
│ 通知调度器:协程挂起 │ │ │
├─────────────────────────────────────────>│ │ │
│ │ │ 从执行器获取线程 │ │
│ │ ├───────────────────>│ │
│ │ │ 调度其他协程执行 │ │
│ │ ├───────────────────>│ │
│ │ │ │ 等待IO完成 │
│ │ │ ├───────────────────>│
│ │ │ │ │
│ │ │ │ IO完成事件 │
│ │ │ │<───────────────────│
│ │ │ IO完成通知 │ │
│ │ │<───────────────────│ │
│ │ │ 选择线程恢复协程 │ │
│ │ ├───────────────────>│ │
│ 恢复协程 │ │ │ │
│<───────────────────┴───────────────────┘ │ │
│ │ │ │ │
│ 返回读取结果 │ │ │ │
├───────────────────>│ │ │ │