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

    **目录**
     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通信代码,将在未来几篇博客上附上链接;
到这里大家就清楚了吧!哈哈,感谢您的观看;

猜你喜欢

转载自blog.51cto.com/14632688/2663786