事件通知与异步 I/O 接口

事件通知与异步 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
2
3
4
5
VFS operation
-> fsnotify_* hook
-> match inode/mount marks
-> group event queue
-> inotify/fanotify userspace read

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.cmm/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 不能睡眠于不允许的上下文。

文章互动

阅读 --

留言

0 条留言

正在加载留言…