IO模型梳理

一、常见的IO模型:

按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO。

二、IO模型介绍:

  1. 阻塞I/O模型:
    进程会一直阻塞,直到数据拷贝完成。
    应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直阻塞等待….知道内核数据准备完成,从内核空间拷贝到用户空间,IO函数返回成功指示。

    在这里插入图片描述
    2.非阻塞IO模型
    简单说就是反复检查内核数据是否就绪,cpu有空耗的现象。
    非阻塞io
    IO多路复用:
    主要有select 、 poll 、epoll 模型,select 、poll、epoll函数调用时仍然阻塞,关键在于可以同时监控多个IO操作。
    从内核到内核数据准备过程中,用户线程是阻塞的,知道内核数据报准备好。
    io复用
    信号驱动IO:
    与IO多路复用的区别是:内核 到内核数据准备的过程中,不需要阻塞,但是内核数据准备好后,从内核拷贝到用户数据仍需要阻塞等待。
    不过TCP中信号较为负责,目前很难区分,信号驱动IO主要用在UDP通讯。
    信号驱动IO
    3.异步IO:
    从发起IO请求,到系统内核准备好数据,到内核将数据拷贝到用户进程,全程都不足要用户进程参与,完全的异步。
    可惜的是linux系统并没有实现,windows系统有实现。实际linux服务器上,基本还是IO多路复用。
    异步IO模型

    五种IO模型比较

三、IO模型对比:

简单画了导图: IO模型对比
select\poll\epoll
其实从如下两点考虑:
fd剧增后的效率:
select、poll 通过线性扫描所有的fd数据,随着fd剧增,必然出现 “”线性下降” 性能问题
epoll : 只有活跃的socket才会主动调用callback,所以即使fd剧增但是在活跃socket较少的情况下,没有 "线性下降"问题,但是所有socket都很活跃的情况下,可能会有性能问题。
fd消息通知方式
select、poll 通过内核空间到用户空间的拷贝。
epoll 通过使用mmap减少复制开销。
注意仅仅是fd就绪消息通知。

猜你喜欢

转载自blog.csdn.net/baoxue2008/article/details/103553051