信号驱动 I/O (Signal-Driven I/O) 是一种“内核主动通知”的模型。它通过信号机制让进程在数据就绪时获得通知。

核心逻辑

进程预先向内核注册一个信号处理函数,然后立即返回。当数据就绪时,内核发送 SIGIO 信号触发回调。

  1. 异步通知:第一阶段(等待数据)完全非阻塞,进程可以执行其他逻辑。
  2. 信号回调:数据到达内核缓冲区后,内核通过信号 (Signal) 主动唤醒进程。
  3. 两阶段特征
    • 阶段一:非阻塞(等待数据)。
    • 阶段二阻塞(数据从内核拷贝到用户空间)。

执行流程

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

类比:去餐厅点餐,点完后服务员给你一个取餐铃。你可以回座位看书,铃声响了(信号)再去柜台端菜(拷贝数据)。端菜的过程你依然需要亲自参与。