全景
这一部分不深入任何一个类型,先回答两个问题:mio 为什么是现在这个样子,以及用它写的程序在系统调用层面到底做了什么。读完之后,02 核心类型和 03 平台实现里的每一章都能在这里找到它对应的那一行 strace。
- mio 解决什么问题:就绪通知和完成通知两种模型;epoll、kqueue、IOCP 在注册和等待上的差别;mio 只提供就绪加边沿触发(0.7 起删掉了
PollOpt),Windows 上用IOCTL_AFD_POLL把完成模拟成就绪;mio 不做缓冲、调度和定时器(Timer在 0.7.0 删除),这些留给 tokio。 - 一个事件循环:一个带
Waker的 echo 服务器,在 macOS 和 Linux 上各跑 3 次,输出逐行相同;再用 strace 逐行对照两条主线:register是epoll_ctl(ADD),poll是epoll_pwait,读写到EAGAIN,wake()是往 eventfd 写 8 字节。
flowchart TB user[用户代码或 tokio] --> mio["mio:Poll、Registry、Waker"] mio --> ep[Linux epoll] mio --> kq[macOS kqueue] mio --> iocp["Windows IOCP 加 AFD"] ep --> ready[就绪事件] kq --> ready iocp --> ready ready --> user
💬 关联讨论
发起讨论加载中...