事件通知与异步 I/O 接口
1. poll/select
select.c 实现 select/poll 公共扫描。文件 poll 回调通过 poll_wait() 把当前任务挂到 wait queue,返回 readiness mask。事件到来后 wakeup,再次调用驱动/文件系统确认状态。
2. epoll
eventpoll.c 维护 interest rbtree 和 ready list:
epoll_ctl()添加/修改/删除 file;- callback 在目标 wait queue 唤醒时把 epitem 加 ready;
epoll_wait()取事件;- 支持 level/edge、oneshot、exclusive。
edge-triggered 应配合 nonblocking 并读到 EAGAIN,否则可能永久等待。
3. eventfd/signalfd/timerfd
eventfd.c:64 位计数器,可作为内核/用户态事件桥;signalfd.c:把 signal queue 暴露为可读 fd;timerfd.c:hrtimer/alarm 到 fd;- 均可被 epoll 统一监控。
4. AIO
aio.c 是传统 Linux native AIO,建立 aio context、iocb、completion ring。它不同于 POSIX thread AIO,也不同于 io_uring。文件系统是否真正异步依赖 read_iter/write_iter 与 direct I/O 路径。
io_uring 主实现位于源码树 io_uring/,不是 fs/ 子目录;但大量操作最终调用 VFS。
5. fsnotify
notify/ 公共层连接 inode/mount 事件与 group/mark:
1 | VFS operation |
6. inotify/dnotify/fanotify
- dnotify:旧 fcntl 目录通知;
- inotify:按 path/inode watch,适合应用;
- fanotify:更强 mount/filesystem 监控和 permission event,适合安全软件。
rename 通常表现为带 cookie 的 moved_from/moved_to,但 queue overflow 会丢对应关系。
7. 一致性限制
通知不是完整审计日志:
- queue 有上限;
- overflow 后需全量 rescan;
- watch inode,不等于路径永久稳定;
- unlink 后 open fd 仍可访问;
- remote filesystem 事件能力依实现;
- mmap 写入不一定产生应用预期的逐次事件。
8. userfaultfd
fs/userfaultfd.c 提供 fd、ioctl、poll 和消息队列;真正缺页处理和 PTE 操作与 mm/userfaultfd.c、mm/memory.c 协作。它可用于 missing/minor/write-protect fault,权限受 sysctl、capability 和 feature 限制。
9. 并发与生命周期
epoll、fsnotify 等都持有 file/inode/group 引用并注册 callback。close、unmount、watch removal 和事件到达可并发,代码依赖 RCU、spinlock、wait queue 和 SRCU。驱动 poll callback 不能睡眠于不允许的上下文。
正在加载留言…