动手
前面各部分是读 mio 的源码,这一部分反过来:不依赖 mio,自己把注册主线和事件主线在 Linux 上写一遍。写完再回头看,Token 为什么能直接进内核、interests_to_epoll 为什么从 EPOLLET 起步、Waker 为什么从来不读 eventfd,都会变成你自己做过的选择。
- 从零写一个迷你 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"]
💬 关联讨论
发起讨论加载中...