Linux下典型IO模型 +select多路转接模型(概念)

本文详细解析了计算机系统中常见的IO模型,包括阻塞IO、非阻塞IO、信号驱动IO及异步IO等,并阐述了它们的工作原理及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 **目录**
     1.         阻塞IO
     2.         非阻塞IO
     3.         信号驱动IO
     4.         异步IO  (同步概念)
     5.         select“多路转接”IO(篇幅所限放置下一篇博客中,持续更新哦)

在我们开始描述之前,请有必要的了解这个概念
任何在IO过程中,其本质上均发生了俩个行为,“等待”,“拷贝”,等待数据准备完成,从内核中拷贝到用户空间
可以想象,IO过程中浪费的大量时间均是在等待消耗,那么反之,为提高IO效率,最为核心的思想就是想办法让“等待时间”尽量少!

阻塞IO

  • 发起一个功能操作,当要求进行获取数据时,如果内核没有将数据准备好,则一直会等待———直到数据准备好后才继续;
  • 所有的套接字,默认的方式都是阻塞方式
    Linux下典型IO模型 +select多路转接模型(概念)Linux下典型IO模型 +select多路转接模型(概念)
    非阻塞IO
  • 发起一个功能操作,要求获取数据时,内核表示未将数据准备完成,则执行的系统调用接口会立即返回并且报出响应错误(一般为EWOULDBLOCK)
  • 非阻塞IO减少了等待时间,但是不成功返回时是意义不大的,所以一般程序猿在使用过程中,会对非阻塞接口进行反复调用(目的是反复尝试获取读写的文件描述符),这便是“轮询”方式,对cpu利用有较大的浪费;

Linux下典型IO模型 +select多路转接模型(概念)

信号驱动IO

  • 信号驱动IO,顾名思义,在IO处理方式中引入了信号的处理模式
  • 发起一个功能操作,要求获取数据时,发送请求后不再关注,待到内核将数据准备好,发送SIGIO信号通知进程完成后续IO操作
  • 注意这里SIGIO监测的是“内核将数据准备好or not”,而不是已经完成“拷贝”的第二次行为
    Linux下典型IO模型 +select多路转接模型(概念)
    异步IO
  • 发起一个功能操作,需要请求数据时,发送请求后不再关注,待到内核将数据准备 + 数据拷贝完成时,再通知进程,执行后续IO操作
  • 需要关注的是 它与信号驱动IO的区别,在于数据的拷贝是否发生在“通知”之前;

Linux下典型IO模型 +select多路转接模型(概念)

异步/同步概念

  • 异步:
    • 为完成一个功能,发出调用,调用发出之后就返回了,根据被调用者状态,通知调用者,此时可以处理这个调用真正处理结果了
      • 同步
      • 为了完成一个功能,发出调用,等待被调用状态就绪则继续,否则一直等待

到这里相信大家都很疑惑,那么“异步/同步”与“阻塞/非阻塞”不是一样的吗?
答:阻塞与非阻塞,主要强调操作是否立即返回;
异步与同步,主要强调功能完成的时序性,关注的是 “消息通信机制”
这里引用经典实例来辅助理解:
异步通信机制:
Linux下典型IO模型 +select多路转接模型(概念)
异步与同步的标准模板是这样的:

所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由调用者主动等待这个调用的结果。
而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

阻塞与非阻塞:

                  阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

Linux下典型IO模型 +select多路转接模型(概念)

由于篇幅所制,将select多路复用IO模型以及poll,epollIO模型,以及相应TCP通信代码,将在未来几篇博客上附上链接;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值