Rust in Everything
基于 mio 1.2.4

动手

前面各部分是读 mio 的源码,这一部分反过来:不依赖 mio,自己把注册主线和事件主线在 Linux 上写一遍。写完再回头看,Token 为什么能直接进内核、interests_to_epoll 为什么从 EPOLLET 起步、Waker 为什么从来不读 eventfd,都会变成你自己做过的选择。

  1. 从零写一个迷你 mio:一个 292 行、只依赖 libc 的库。Poll / Registry 是一个 epoll fd,Token 原样放进 epoll_event.u64,Interest 是 NonZeroU8,Events 的容量就是 maxevents;Waker 是一个 eventfd;TcpListener 用 SOCK_NONBLOCK|SOCK_CLOEXEC 建 socket、用 accept4 收连接。和一个事件循环同一个 echo 服务器跑在它上面,服务器线程 50 行 strace 和真 mio 只差地址缓冲区的长度。
flowchart TB
  pollnode["Poll:epoll_create1"] --> reg["register:EPOLL_CTL_ADD"]
  reg --> tok["Token 进 data.u64"]
  pollnode --> wait["poll:epoll_wait"]
  wait --> ev["Events:内核直接写"]
  wk["Waker:eventfd"] --> reg
  tcp["TcpListener:accept4"] --> reg
  ev --> cmp["和 mio 对照 strace"]

💬 关联讨论

发起讨论
加载中...