信号驱动式 I/O – UDP

信号驱动式曾被成为异步 I/O, 既然能和异步 I/O 扯上关系, 性能一定不会太弱, 事实也是如此, 信号驱动式不会在等待数据上阻塞, 只有当数据包准备好读取时, 系统发送一个 SIGIO 信号, 这时候进程执行 I/O 系统调用(recvfrom)告知内核启动某个 I/O 操作, 进程阻塞于 recvfrom 操作.

信号驱动式 I/O

套接字信号驱动 I/O

套接字使用信号驱动主要需要进程执行三个步骤

  1. 建立 SIGIO 信号处理函数 (执行 recvfrom)
  2. 建立套接字属主
  3. 开启该套接字的信号驱动式 I/O

由于 TCP 有握手连接过程, 信号产生过于频繁, 相对不适用, 故这里列出 UDP 套接字编程的信号驱动示例, 和阻塞式套接字相比, 这里只修改了 dg_echo 部分(维护客户和服务器的数据交互部分).

信号驱动式会通过系统调用先建立 SIGIO 的信号处理函数, 立即返回而不阻塞, 当内核准备好数据, 向用户进程递交 SIGIO 信号, 此时进程可以开始使用 recvfrom 系统调用, 将数据复制到用户空间(阻塞). 之后, 只有当 recvfrom 成功执行后, 进程才执行 sendto 向客户端响应数据. 故, 这里做一个 DG 缓冲区, revcfrom 调用时获得到的数据都压入 DG, 本轮 recvfrom 执行完毕之后, sendto 向 DG 询问数据, 并发送个客户端.

Hello world!
文章已创建 197

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部