Rust in Everything
基于 mio 1.2.4

全景

这一部分不深入任何一个类型,先回答两个问题:mio 为什么是现在这个样子,以及用它写的程序在系统调用层面到底做了什么。读完之后,02 核心类型和 03 平台实现里的每一章都能在这里找到它对应的那一行 strace。

  1. mio 解决什么问题:就绪通知和完成通知两种模型;epoll、kqueue、IOCP 在注册和等待上的差别;mio 只提供就绪加边沿触发(0.7 起删掉了 PollOpt),Windows 上用 IOCTL_AFD_POLL 把完成模拟成就绪;mio 不做缓冲、调度和定时器(Timer 在 0.7.0 删除),这些留给 tokio。
  2. 一个事件循环:一个带 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

💬 关联讨论

发起讨论
加载中...