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

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

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

阻塞IOide

  • 发起一个功能操做,当要求进行获取数据时,若是内核没有将数据准备好,则一直会等待———直到数据准备好后才继续;
  • 全部的套接字,默认的方式都是阻塞方式
    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多路转接模型(概念)

异步/同步概念code

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

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

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

阻塞与非阻塞:进程

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

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

因为篇幅所制,将select多路复用IO模型以及poll,epollIO模型,以及相应TCP通讯代码,将在将来几篇博客上附上连接;
到这里你们就清楚了吧!哈哈,感谢您的观看;回调函数

相关文章
相关标签/搜索