网络套接字编程之IO模型详解

本文详细介绍了Unix下的五种I/O模型:阻塞式、非阻塞式、I/O复用、信号驱动式和异步I/O。针对每种模型,文章通过举例说明了其工作原理和特点。阻塞式I/O在数据未准备好时会阻塞进程,而非阻塞式则返回错误。I/O复用通过select或poll监听多个套接字。信号驱动式I/O在数据准备好时发送SIGIO信号。异步I/O在操作完成后通知进程,避免了阻塞。
摘要由CSDN通过智能技术生成

网络套接字编程之IO模型详解

本文主要参考自《UNIX网络编程》(第1卷)(套接口API第3版)

Unix下可用的五种I/O模型有:

  • 阻塞式I/O
  • 非阻塞式I/O
  • I/O复用(select和poll)
  • 信号驱动式I/O (SIGIO)
  • 异步I/O (POSIX的aio_系列函数)

一个输入操作通常包括两个阶段:

  1. 等待数据准备好
  2. 将数据从内核复制到进程。

对套接字输入而言,第一步通常为等待数据从网络到达,及到达后将数据复制到内核中某个缓存区。而第二部是将数据从内核缓冲区复制到进程缓冲区。

1. 常用I/O模型介绍

由于TCP采用流式传输,套接字低水位标记(low-water mark)开始起作用,涉及的操作相对复杂。而UDP采用数据报传输,数据准备好的概念相对简单,要么整个数据报收到要么还没有。因此下文主要以UDP recvfrom的调用为例。

1.1 阻塞式I/O模型

默认情况下,所有套接字都是阻塞的。recvfrom的调用过程如下图所示:

在这里插入图片描述

如图,进程调用recvfrom,当没有数据到达时,recvfrom函数进入阻塞状态,直到有数据报到达或者发生错误才返回。

1.2 非阻塞I/O模型

进程将套接字设置为非阻塞时,会通知内核:当所请求的I/O操作非得把本进程置于休眠状态才才能完成时,不要把本进程置于休眠状态,而是返回一个错误。即,当没有数据到达时,不要阻塞进程,而是直接返回错误。

在这里插入图片描述

如图,前三次recvfrom调用时没有数据可返回,因此内核会立刻返回一个EWOULDBLOCK错误。第四次调用时有数据到达,则将数据复制到进程缓存区,成功返回。此外,当使用如图这种轮询非阻塞时,会占用大量的系统资源、

1.3 I/O复用模型

Unix I/O复用主要基于select或者poll实现,所谓复用,可以理解为同时侦听多个套接字,同时等待多个套接字的数据到达。

在这里插入图片描述

如图,阻塞当调用select时发生,当select返回时,说明相应套接字有数据准备好(或发生错误),调用相关套接字即可立刻返回。

1.4 信号驱动式I/O模型

信号驱动式I/O模型,即让内核在描述符就绪时发送SIGIO信号通知我们。

在这里插入图片描述

使用信号驱动式I/O首先需要开启套接字驱动式I/O 功能,通过sigaction系统调用安装一个信号处理函数。设置完成后,进程不会被阻塞。当数据报准备好后,内核会为该进程产生一个SIGIO信号。随后可以在相应的回调函数里调用recvfrom函数,也可以同住主循环,使其读取数据。

1.5 异步I/O模型

异步I/O会告知内核启动某个读取操作,并让内核完成整个操作(包括第二步将数据从内核复制到程序缓存区),完成后再通知相应的进程。与信号驱动式I/O的主要区别在于,信号驱动式I/O是内核通知我们何时可以启动I/O操作,而异步I/O是通知我们I/O操作何时完成。

在这里插入图片描述

如图,我们调用aio_read函数,向内核传递套接字描述符、缓冲区指针及缓冲区大小(与read相同的参数)和文件偏移,并告知内核当整个操作完成时如何通知我们。之后系统调用会立刻返回,进程不会被阻塞。

2. 各种I/O模型的比较

如前可知,前四种模型区别主要在第一阶段,因为它们第二阶段都是使用recvfrom将数据从内核复制到调用者的缓冲区(阻塞于第二阶段)。而异步I/O模型这两个阶段都要处理。

依照POSIX的定义,异步I/O和同步I/O描述如下:

  • 同步I/O操作:导致请求进程阻塞,直到I/O操作完成。
  • 异步I/O操作:不导致请求进程阻塞。

五种I/O模型的对比如图所示:

在这里插入图片描述

由定义知,前4种都是阻塞式I/O,因为真正的I/O操作(recvfrom)都将阻塞,最后一种才是异步I/O.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值