Linux 网络 I/O 模型

概述

I/O 操作是所有程序开发人员必须了解以及掌握的技术,因为它关乎系统之间的交互和数据传输。本篇博客我就来简单介绍几种常见的 I/O 模型。


Linux 网络 I/O 模型

根据网络编程对 I/O 模型的分类,常见的 Linux 有以下五种模型:

  • 阻塞 I/O 模型
  • 非阻塞 I/O 模型
  • I/O 复用模型
  • 信号驱动 I/O 模型
  • 异步 I/O

阻塞 I/O 模型

阻塞 I/O 是最常见的 I/O 模型,默认情况下,所有文件操作都是阻塞的。

举个例子:在进程空间中调用 ecvform 函数,其系统调用直到数据报到达且被复制到应用的缓冲区中或者发生错误时才返回,在此期间一直会等待。进程从开始调用 recvform 函数到函数返回的整个过程中是阻塞的。

recvform函数:从 socket 流读取数据

阻塞 I/O 模型


非阻塞 I/O 模型

阻塞 I/O 是根据阻塞 I/O 模型来说的,它在执行系统调用期间不会阻塞。

举个例子:在进程空间中调用 ecvform 函数,如果缓冲区中没有数据的话,直接返回 EWOULDBLOCK 错误。进程一般反复调用 ecvform 函数,根据返回值确定内核是否有数据传来。
非阻塞 I/O 模型


I/O 复用模型

Linux 提供 select / poll,进程通过将一个或多个 fd(文件操作符)传递给 select 或者 poll 系统调用,进程阻塞在 select 操作上。后续 select / poll 通过顺序扫描 fd 确定是否就绪。当有 fd 就绪时,立即调用回调函数。

fd:文件操作符,Linux 内核将所有外部设备看做一个文件来操作,对一个文件的读写操作会调用内核命令,该命令会返回一个 file descriptor(文件描述符),描述符就是一个数字,它指向内核中的结构体。

I/O 复用模型


信号驱动 I/O 模型

首先开启套接口信号驱动 I/O 功能,并通过系统调用 sigaction 执行一个信号处理函数。当数据准备就绪时,就位该进程生成一个 SIGIO 信号,通过信号回调通知应用程序调用 recvfrom 来读取数据,并通知主循环函数处理数据。

sigactio:检查或修改与指定信号相关联的处理动作,此系统调用立即返回,进程继续工作,它是非阻塞。

信号驱动 I/O 模型


异步 I/O

告诉内核启动某个操作,并让内核在整个操作(包括数据从内核空间复制到用户空间的时间)完成后通知我们。异步 I/O 和信号驱动模型的主要区别是:信号驱动 I/O 由内核通知我们何时可以开启 I/O 操作;异步 I/O 模型由内核通知我们 I/O 操作何时已经完成。
异步 I/O 模型


参考:
《Netty 权威指南》第二版
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值