信号驱动 I/O (Signal-Driven I/O) 是一种“内核主动通知”的模型。它通过信号机制让进程在数据就绪时获得通知。
核心逻辑
进程预先向内核注册一个信号处理函数,然后立即返回。当数据就绪时,内核发送 SIGIO 信号触发回调。
- 异步通知:第一阶段(等待数据)完全非阻塞,进程可以执行其他逻辑。
- 信号回调:数据到达内核缓冲区后,内核通过信号 (Signal) 主动唤醒进程。
- 两阶段特征:
- 阶段一:非阻塞(等待数据)。
- 阶段二:阻塞(数据从内核拷贝到用户空间)。
执行流程
sequenceDiagram participant U as 用户进程 participant K as 内核 (Kernel) U->>K: sigaction (注册信号处理函数) K-->>U: 立即返回 Note over U: 执行其他任务 Note over K: 数据就绪 K->>U: 发送 SIGIO 信号 Note over U: 触发信号处理程序 U->>K: recvfrom (读取数据) Note over K: 阶段 2: 拷贝数据 K->>U: 返回数据
优劣对比
- 优点:等待数据期间进程完全自由,无需轮询,CPU 利用率高。
- 缺点:
- 编程复杂:信号处理函数需考虑异步安全和可重入性。
- TCP 局限性:TCP 产生信号过于频繁(握手、挥手、数据到达均触发),导致应用层难以区分事件。主要用于 UDP。
类比:去餐厅点餐,点完后服务员给你一个取餐铃。你可以回座位看书,铃声响了(信号)再去柜台端菜(拷贝数据)。端菜的过程你依然需要亲自参与。