Skip to content

继承关系

┌─────────────────────────────────────────────────────────┐
│                    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完成通知         │                    │
        │                    │                    │<───────────────────│                    │
        │                    │                    │ 选择线程恢复协程   │                    │
        │                    │                    ├───────────────────>│                    │
        │ 恢复协程           │                    │                    │                    │
        │<───────────────────┴───────────────────┘                    │                    │
        │                    │                    │                    │                    │
        │ 返回读取结果       │                    │                    │                    │
        ├───────────────────>│                    │                    │                    │