五种网络 I/O 模型

文章介绍了Unix系统中的五种I/O模型,包括阻塞式I/O、非阻塞式I/O、I/O多路复用(select/poll/epoll)、信号驱动式I/O(SIGIO)和异步I/O(aio_系列函数)。重点阐述了各种模型的工作机制和区别,其中前四种属于同步I/O,而异步I/O模型是唯一的异步模型,能自动处理数据传输的两个阶段,且不会造成进程阻塞。
摘要由CSDN通过智能技术生成


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

  • 阻塞式 I/O

  • 非阻塞式 I/O

  • I/O 多路复用(select/poll/epoll

  • 信号驱动式 I/O(SIGIO

  • 异步 I/O(POSIX的aio_系列函数)


1. 阻塞式 I/O 模型


2. 非阻塞式 I/O 模型


3. I/O 多路复用

 调用并阻塞在`select()`/`poll()`上,而非阻塞在真正的 I/O 调用上,以一个系统调用监听多个套接字。

4. 信号驱动式 I/O

 即让内核在描述符就绪时发送`SIGIO`信号给进程进行通知,我们可以在信号处理器函数中执行`read()`调用读取数据报,并通知主循环数据已准备好,或在信号处理器中通知主循环,令其读取数据。

5. 异步 I/O

 即调用异步函数完成 I/O,这些函数告知内核完成某个操作(如将数据从内核缓冲区拷贝到用户空间),并让内核在操作完成后通知我们。

 异步 I/O 与信号驱动式 I/O 的区别在于:信号驱动式 I/O 是由内核通知我们何时可以开始 I/O;而异步 I/O 是由内核完成 I/O 并通知我们。


6. I/O 模型的分类

 一个输入操作通常包含两个不同的阶段:

  1. 等待数据达到网卡并传递给内核;

  2. 将数据从内核拷贝到用户空间

 前四种模型的主要区别在于第一阶段,即当数据没有准备好时用户进程的处理方式,而它们的第二阶段是一样的:将数据从内核复制到调用者的缓冲区,该读取操作是阻塞的。

 而相反,异步 I/O 模型会自动处理这两个阶段。

 根据这两个阶段中,是否有任意阶段引起阻塞,可以将 I/O 分为两种类型:

  • 同步 I/O 操作:读请求将导致进程阻塞,直到 I/O 操作完成;

  • 异步 I/O 操作:不导致请求进程阻塞。

 其中前四种模型都属于同步 I/O,而异步 I/O 模型属于异步 I/O。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值